1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "impl_factory.h"
17 
18 #include "effect/runtime_effect.h"
19 #include "skia_adapter/skia_impl_factory.h"
20 #include "utils/matrix.h"
21 #include "utils/system_properties.h"
22 #ifdef ENABLE_DDGR_OPTIMIZE
23 #include "ddgr_impl_factory.h"
24 #endif
25 namespace OHOS {
26 namespace Rosen {
27 namespace Drawing {
28 using EngineImplFactory = SkiaImplFactory;
29 
CreateCoreCanvasImpl()30 std::unique_ptr<CoreCanvasImpl> ImplFactory::CreateCoreCanvasImpl()
31 {
32 #ifdef ENABLE_DDGR_OPTIMIZE
33     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
34         return DDGRImplFactory::CreateCoreCanvas();
35     }
36 #endif
37     return EngineImplFactory::CreateCoreCanvas();
38 }
39 
CreateCoreCanvasImpl(void * rawCanvas)40 std::unique_ptr<CoreCanvasImpl> ImplFactory::CreateCoreCanvasImpl(void* rawCanvas)
41 {
42 #ifdef ENABLE_DDGR_OPTIMIZE
43     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
44         return DDGRImplFactory::CreateCoreCanvas(rawCanvas);
45     }
46 #endif
47     return EngineImplFactory::CreateCoreCanvas(rawCanvas);
48 }
49 
CreateCoreCanvasImpl(int32_t width,int32_t height)50 std::unique_ptr<CoreCanvasImpl> ImplFactory::CreateCoreCanvasImpl(int32_t width, int32_t height)
51 {
52 #ifdef ENABLE_DDGR_OPTIMIZE
53     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
54         return DDGRImplFactory::CreateCoreCanvas(width, height);
55     }
56 #endif
57     return EngineImplFactory::CreateCoreCanvas(width, height);
58 }
59 
CreateDataImpl()60 std::unique_ptr<DataImpl> ImplFactory::CreateDataImpl()
61 {
62 #ifdef ENABLE_DDGR_OPTIMIZE
63     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
64         return DDGRImplFactory::CreateData();
65     }
66 #endif
67     return EngineImplFactory::CreateData();
68 }
69 
70 #ifdef RS_ENABLE_GPU
CreateGPUContextImpl()71 std::unique_ptr<GPUContextImpl> ImplFactory::CreateGPUContextImpl()
72 {
73 #ifdef ENABLE_DDGR_OPTIMIZE
74     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
75         return DDGRImplFactory::CreateGPUContext();
76     }
77 #endif
78     return EngineImplFactory::CreateGPUContext();
79 }
80 #endif
81 
CreateTraceMemoryDumpImpl(const char * categoryKey,bool itemizeType)82 std::unique_ptr<TraceMemoryDumpImpl> ImplFactory::CreateTraceMemoryDumpImpl(const char* categoryKey, bool itemizeType)
83 {
84 #ifdef ENABLE_DDGR_OPTIMIZE
85     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
86         return DDGRImplFactory::CreateTraceMemoryDump(categoryKey, itemizeType);
87     }
88 #endif
89     return EngineImplFactory::CreateTraceMemoryDump(categoryKey, itemizeType);
90 }
91 
CreateBitmapImpl()92 std::unique_ptr<BitmapImpl> ImplFactory::CreateBitmapImpl()
93 {
94 #ifdef ENABLE_DDGR_OPTIMIZE
95     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
96         return DDGRImplFactory::CreateBitmap();
97     }
98 #endif
99     return EngineImplFactory::CreateBitmap();
100 }
101 
CreatePixmapImpl()102 std::unique_ptr<PixmapImpl> ImplFactory::CreatePixmapImpl()
103 {
104 #ifdef ENABLE_DDGR_OPTIMIZE
105     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
106         return DDGRImplFactory::CreatePixmap();
107     }
108 #endif
109     return EngineImplFactory::CreatePixmap();
110 }
111 
CreatePixmapImpl(const ImageInfo & imageInfo,const void * addr,size_t rowBytes)112 std::unique_ptr<PixmapImpl> ImplFactory::CreatePixmapImpl(const ImageInfo& imageInfo, const void* addr, size_t rowBytes)
113 {
114 #ifdef ENABLE_DDGR_OPTIMIZE
115     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
116         return DDGRImplFactory::CreatePixmap(imageInfo, addr, rowBytes);
117     }
118 #endif
119     return EngineImplFactory::CreatePixmap(imageInfo, addr, rowBytes);
120 }
121 
CreateImageImpl()122 std::unique_ptr<ImageImpl> ImplFactory::CreateImageImpl()
123 {
124 #ifdef ENABLE_DDGR_OPTIMIZE
125     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
126         return DDGRImplFactory::CreateImage();
127     }
128 #endif
129     return EngineImplFactory::CreateImage();
130 }
131 
CreateImageImpl(void * rawImage)132 std::unique_ptr<ImageImpl> ImplFactory::CreateImageImpl(void* rawImage)
133 {
134 #ifdef ENABLE_DDGR_OPTIMIZE
135     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
136         return DDGRImplFactory::CreateImage(rawImage);
137     }
138 #endif
139     return EngineImplFactory::CreateImage(rawImage);
140 }
141 
CreatePictureImpl()142 std::unique_ptr<PictureImpl> ImplFactory::CreatePictureImpl()
143 {
144 #ifdef ENABLE_DDGR_OPTIMIZE
145     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
146         return DDGRImplFactory::CreatePicture();
147     }
148 #endif
149     return EngineImplFactory::CreatePicture();
150 }
151 
CreatePathImpl()152 std::unique_ptr<PathImpl> ImplFactory::CreatePathImpl()
153 {
154 #ifdef ENABLE_DDGR_OPTIMIZE
155     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
156         return DDGRImplFactory::CreatePath();
157     }
158 #endif
159     return EngineImplFactory::CreatePath();
160 }
161 
CreateColorFilterImpl()162 std::unique_ptr<ColorFilterImpl> ImplFactory::CreateColorFilterImpl()
163 {
164 #ifdef ENABLE_DDGR_OPTIMIZE
165     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
166         return DDGRImplFactory::CreateColorFilter();
167     }
168 #endif
169     return EngineImplFactory::CreateColorFilter();
170 }
CreateMaskFilterImpl()171 std::unique_ptr<MaskFilterImpl> ImplFactory::CreateMaskFilterImpl()
172 {
173 #ifdef ENABLE_DDGR_OPTIMIZE
174     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
175         return DDGRImplFactory::CreateMaskFilter();
176     }
177 #endif
178     return EngineImplFactory::CreateMaskFilter();
179 }
180 
CreateImageFilterImpl()181 std::unique_ptr<ImageFilterImpl> ImplFactory::CreateImageFilterImpl()
182 {
183 #ifdef ENABLE_DDGR_OPTIMIZE
184     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
185         return DDGRImplFactory::CreateImageFilter();
186     }
187 #endif
188     return EngineImplFactory::CreateImageFilter();
189 }
190 
CreateShaderEffectImpl()191 std::unique_ptr<ShaderEffectImpl> ImplFactory::CreateShaderEffectImpl()
192 {
193 #ifdef ENABLE_DDGR_OPTIMIZE
194     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
195         return DDGRImplFactory::CreateShaderEffect();
196     }
197 #endif
198     return EngineImplFactory::CreateShaderEffect();
199 }
200 
CreateBlenderImpl()201 std::unique_ptr<BlenderImpl> ImplFactory::CreateBlenderImpl()
202 {
203 #ifdef ENABLE_DDGR_OPTIMIZE
204     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
205         return DDGRImplFactory::CreateBlender();
206     }
207 #endif
208     return EngineImplFactory::CreateBlender();
209 }
210 
CreateRuntimeEffectImpl()211 std::unique_ptr<RuntimeEffectImpl> ImplFactory::CreateRuntimeEffectImpl()
212 {
213 #ifdef ENABLE_DDGR_OPTIMIZE
214     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
215         return DDGRImplFactory::CreateRuntimeEffect();
216     }
217 #endif
218     return EngineImplFactory::CreateRuntimeEffect();
219 }
220 
CreateRuntimeShaderBuilderImpl(std::shared_ptr<RuntimeEffect> runtimeEffect)221 std::unique_ptr<RuntimeShaderBuilderImpl> ImplFactory::CreateRuntimeShaderBuilderImpl(
222     std::shared_ptr<RuntimeEffect> runtimeEffect)
223 {
224 #ifdef ENABLE_DDGR_OPTIMIZE
225     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
226         return DDGRImplFactory::CreateRuntimeShaderBuilder(runtimeEffect);
227     }
228 #endif
229     return EngineImplFactory::CreateRuntimeShaderBuilder(runtimeEffect);
230 }
231 
CreateRuntimeBlenderBuilderImpl(std::shared_ptr<RuntimeEffect> runtimeEffect)232 std::unique_ptr<RuntimeBlenderBuilderImpl> ImplFactory::CreateRuntimeBlenderBuilderImpl(
233     std::shared_ptr<RuntimeEffect> runtimeEffect)
234 {
235 #ifdef ENABLE_DDGR_OPTIMIZE
236     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
237         return DDGRImplFactory::CreateRuntimeBlenderBuilder(runtimeEffect);
238     }
239 #endif
240     return EngineImplFactory::CreateRuntimeBlenderBuilder(runtimeEffect);
241 }
242 
CreateSurfaceImpl()243 std::unique_ptr<SurfaceImpl> ImplFactory::CreateSurfaceImpl()
244 {
245 #ifdef ENABLE_DDGR_OPTIMIZE
246     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
247         return DDGRImplFactory::CreateSurface();
248     }
249 #endif
250     return EngineImplFactory::CreateSurface();
251 }
252 
CreateOplistHandleImpl()253 std::unique_ptr<OpListHandleImpl> ImplFactory::CreateOplistHandleImpl()
254 {
255 #ifdef ENABLE_DDGR_OPTIMIZE
256     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
257         return DDGRImplFactory::CreateOplistHandle();
258     }
259 #endif
260     return EngineImplFactory::CreateOplistHandle();
261 }
262 
CreatePathEffectImpl()263 std::unique_ptr<PathEffectImpl> ImplFactory::CreatePathEffectImpl()
264 {
265 #ifdef ENABLE_DDGR_OPTIMIZE
266     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
267         return DDGRImplFactory::CreatePathEffect();
268     }
269 #endif
270     return EngineImplFactory::CreatePathEffect();
271 }
272 
CreateColorSpaceImpl()273 std::unique_ptr<ColorSpaceImpl> ImplFactory::CreateColorSpaceImpl()
274 {
275 #ifdef ENABLE_DDGR_OPTIMIZE
276     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
277         return DDGRImplFactory::CreateColorSpace();
278     }
279 #endif
280     return EngineImplFactory::CreateColorSpace();
281 }
282 
CreateMatrixImpl()283 std::unique_ptr<MatrixImpl> ImplFactory::CreateMatrixImpl()
284 {
285 #ifdef ENABLE_DDGR_OPTIMIZE
286     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
287         return DDGRImplFactory::CreateMatrix();
288     }
289 #endif
290     return EngineImplFactory::CreateMatrix();
291 }
292 
CreateMatrixImpl(const Matrix & other)293 std::unique_ptr<MatrixImpl> ImplFactory::CreateMatrixImpl(const Matrix& other)
294 {
295 #ifdef ENABLE_DDGR_OPTIMIZE
296     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
297         return DDGRImplFactory::CreateMatrix(other);
298     }
299 #endif
300     return EngineImplFactory::CreateMatrix(other);
301 }
302 
CreateMatrix44Impl()303 std::unique_ptr<Matrix44Impl> ImplFactory::CreateMatrix44Impl()
304 {
305 #ifdef ENABLE_DDGR_OPTIMIZE
306     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
307         return DDGRImplFactory::CreateMatrix44();
308     }
309 #endif
310     return EngineImplFactory::CreateMatrix44();
311 }
312 
CreateCameraImpl()313 std::unique_ptr<CameraImpl> ImplFactory::CreateCameraImpl()
314 {
315 #ifdef ENABLE_DDGR_OPTIMIZE
316     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
317         return DDGRImplFactory::CreateCamera();
318     }
319 #endif
320     return EngineImplFactory::CreateCamera();
321 }
322 
CreateRegionImpl()323 std::unique_ptr<RegionImpl> ImplFactory::CreateRegionImpl()
324 {
325 #ifdef ENABLE_DDGR_OPTIMIZE
326     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
327         return DDGRImplFactory::CreateRegion();
328     }
329 #endif
330     return EngineImplFactory::CreateRegion();
331 }
332 
CreateFontImpl()333 std::unique_ptr<FontImpl> ImplFactory::CreateFontImpl()
334 {
335 #ifdef ENABLE_DDGR_OPTIMIZE
336     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
337         return DDGRImplFactory::CreateFont();
338     }
339 #endif
340     return EngineImplFactory::CreateFont();
341 }
342 
CreateFontImpl(std::shared_ptr<Typeface> typeface,scalar size,scalar scaleX,scalar skewX)343 std::unique_ptr<FontImpl> ImplFactory::CreateFontImpl(std::shared_ptr<Typeface> typeface,
344     scalar size, scalar scaleX, scalar skewX)
345 {
346 #ifdef ENABLE_DDGR_OPTIMIZE
347     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
348         return DDGRImplFactory::CreateFont(typeface, size, scaleX, skewX);
349     }
350 #endif
351     return EngineImplFactory::CreateFont(typeface, size, scaleX, skewX);
352 }
353 
CreateFontImpl(const Font & font)354 std::unique_ptr<FontImpl> ImplFactory::CreateFontImpl(const Font& font)
355 {
356 #ifdef ENABLE_DDGR_OPTIMIZE
357     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
358         return DDGRImplFactory::CreateFont(font);
359     }
360 #endif
361     return EngineImplFactory::CreateFont(font);
362 }
363 
CreateTextBlobBuilderImpl()364 std::unique_ptr<TextBlobBuilderImpl> ImplFactory::CreateTextBlobBuilderImpl()
365 {
366 #ifdef ENABLE_DDGR_OPTIMIZE
367     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
368         return DDGRImplFactory::CreateTextBlobBuilder();
369     }
370 #endif
371     return EngineImplFactory::CreateTextBlobBuilder();
372 }
373 
CreateDefaultFontMgrImpl()374 std::shared_ptr<FontMgrImpl> ImplFactory::CreateDefaultFontMgrImpl()
375 {
376 #ifdef ENABLE_DDGR_OPTIMIZE
377     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
378         return DDGRImplFactory::CreateDefaultFontMgr();
379     }
380 #endif
381     return EngineImplFactory::CreateDefaultFontMgr();
382 }
383 
384 #ifndef USE_TEXGINE
CreateDynamicFontMgrImpl()385 std::shared_ptr<FontMgrImpl> ImplFactory::CreateDynamicFontMgrImpl()
386 {
387 #ifdef ENABLE_DDGR_OPTIMIZE
388     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
389         return DDGRImplFactory::CreateDynamicFontMgr();
390     }
391 #endif
392     return EngineImplFactory::CreateDynamicFontMgr();
393 }
394 #endif
395 
CreateVerticesImpl()396 std::unique_ptr<VerticesImpl> ImplFactory::CreateVerticesImpl()
397 {
398 #ifdef ENABLE_DDGR_OPTIMIZE
399     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
400         return DDGRImplFactory::CreateVertices();
401     }
402 #endif
403     return EngineImplFactory::CreateVertices();
404 }
405 
CreateVerticesBuilderImpl()406 std::unique_ptr<VerticesImpl::BuilderImpl> ImplFactory::CreateVerticesBuilderImpl()
407 {
408 #ifdef ENABLE_DDGR_OPTIMIZE
409     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
410         return DDGRImplFactory::CreateVerticesBuilder();
411     }
412 #endif
413     return EngineImplFactory::CreateVerticesBuilder();
414 }
415 
CreateMemoryStreamImpl()416 std::shared_ptr<MemoryStreamImpl> ImplFactory::CreateMemoryStreamImpl()
417 {
418 #ifdef ENABLE_DDGR_OPTIMIZE
419     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
420         return DDGRImplFactory::CreateMemoryStream();
421     }
422 #endif
423     return EngineImplFactory::CreateMemoryStream();
424 }
425 
CreateMemoryStreamImpl(const void * data,size_t length,bool copyData)426 std::shared_ptr<MemoryStreamImpl> ImplFactory::CreateMemoryStreamImpl(const void* data, size_t length, bool copyData)
427 {
428 #ifdef ENABLE_DDGR_OPTIMIZE
429     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
430         return DDGRImplFactory::CreateMemoryStream(data, length, copyData);
431     }
432 #endif
433     return EngineImplFactory::CreateMemoryStream(data, length, copyData);
434 }
435 
CreateResourceHolderImpl()436 std::shared_ptr<ResourceHolderImpl> ImplFactory::CreateResourceHolderImpl()
437 {
438 #ifdef ENABLE_DDGR_OPTIMIZE
439     if (SystemProperties::GetGpuApiType() == GpuApiType::DDGR) {
440         return DDGRImplFactory::CreateResourceHolder();
441     }
442 #endif
443     return EngineImplFactory::CreateResourceHolder();
444 }
445 } // namespace Drawing
446 } // namespace Rosen
447 } // namespace OHOS