• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 #ifndef SKIA_CONVERT_UTILS_H
17 #define SKIA_CONVERT_UTILS_H
18 
19 #include <memory>
20 #include <string>
21 
22 #include "include/core/SkFontArguments.h"
23 #include "include/core/SkFontMetrics.h"
24 #include "include/core/SkFontStyle.h"
25 #include "include/core/SkRect.h"
26 #include "include/core/SkRSXform.h"
27 #include "include/core/SkSamplingOptions.h"
28 #include "include/core/SkString.h"
29 #include "include/core/SkTextBlob.h"
30 #ifndef USE_M133_SKIA
31 #include "src/gpu/GrPerfMonitorReporter.h"
32 #endif
33 
34 #include "text/font_arguments.h"
35 #include "text/font_metrics.h"
36 #include "text/font_style.h"
37 #include "text/rs_xform.h"
38 #include "text/text_blob_builder.h"
39 #include "utils/perfevent.h"
40 #include "utils/rect.h"
41 #include "utils/sampling_options.h"
42 
43 namespace OHOS {
44 namespace Rosen {
45 namespace Drawing {
46 
47 #ifdef USE_M133_SKIA
48 struct SamplingOptionsUtils {
49     int maxAniso = 0;
50     bool useCubic = false;
51     CubicResampler cubic = {0, 0};
52     FilterMode filter = FilterMode::NEAREST;
53     MipmapMode mipmap = MipmapMode::NONE;
54 };
55 
ConvertSamplingOptions(SamplingOptionsUtils & tempSamplingOptions,const SamplingOptions & sampling)56 inline void ConvertSamplingOptions(SamplingOptionsUtils& tempSamplingOptions, const SamplingOptions& sampling)
57 {
58     tempSamplingOptions.useCubic = sampling.GetUseCubic();
59     tempSamplingOptions.cubic.cubicCoffB = sampling.GetCubicCoffB();
60     tempSamplingOptions.cubic.cubicCoffC = sampling.GetCubicCoffC();
61     tempSamplingOptions.filter = sampling.GetFilterMode();
62     tempSamplingOptions.mipmap = sampling.GetMipmapMode();
63 }
64 #endif
65 
66 class SkiaConvertUtils {
67 public:
DrawingFontMetricsCastToSkFontMetrics(const FontMetrics & fontMetrics,SkFontMetrics & skFontMetrics)68     static void DrawingFontMetricsCastToSkFontMetrics(const FontMetrics& fontMetrics, SkFontMetrics& skFontMetrics)
69     {
70         // Tell the compiler there is no alias and to select wider load/store instructions.
71         uint32_t fFlags = fontMetrics.fFlags;
72         scalar fTop = fontMetrics.fTop;
73         scalar fAscent = fontMetrics.fAscent;
74         scalar fDescent = fontMetrics.fDescent;
75         scalar fBottom = fontMetrics.fBottom;
76         scalar fLeading = fontMetrics.fLeading;
77         scalar fAvgCharWidth = fontMetrics.fAvgCharWidth;
78         scalar fMaxCharWidth = fontMetrics.fMaxCharWidth;
79         scalar fXMin = fontMetrics.fXMin;
80         scalar fXMax = fontMetrics.fXMax;
81         scalar fXHeight = fontMetrics.fXHeight;
82         scalar fCapHeight = fontMetrics.fCapHeight;
83         scalar fUnderlineThickness = fontMetrics.fUnderlineThickness;
84         scalar fUnderlinePosition = fontMetrics.fUnderlinePosition;
85         scalar fStrikeoutThickness = fontMetrics.fStrikeoutThickness;
86         scalar fStrikeoutPosition = fontMetrics.fStrikeoutPosition;
87 
88         skFontMetrics.fFlags = fFlags;
89         skFontMetrics.fTop = fTop;
90         skFontMetrics.fAscent = fAscent;
91         skFontMetrics.fDescent = fDescent;
92         skFontMetrics.fBottom = fBottom;
93         skFontMetrics.fLeading = fLeading;
94         skFontMetrics.fAvgCharWidth = fAvgCharWidth;
95         skFontMetrics.fMaxCharWidth = fMaxCharWidth;
96         skFontMetrics.fXMin = fXMin;
97         skFontMetrics.fXMax = fXMax;
98         skFontMetrics.fXHeight = fXHeight;
99         skFontMetrics.fCapHeight = fCapHeight;
100         skFontMetrics.fUnderlineThickness = fUnderlineThickness;
101         skFontMetrics.fUnderlinePosition = fUnderlinePosition;
102         skFontMetrics.fStrikeoutThickness = fStrikeoutThickness;
103         skFontMetrics.fStrikeoutPosition = fStrikeoutPosition;
104     }
105 
SkFontMetricsCastToDrawingFontMetrics(const SkFontMetrics & skFontMetrics,FontMetrics & fontMetrics)106     static void SkFontMetricsCastToDrawingFontMetrics(const SkFontMetrics& skFontMetrics, FontMetrics& fontMetrics)
107     {
108         // Tell the compiler there is no alias and to select wider load/store instructions.
109         uint32_t fFlags = skFontMetrics.fFlags;
110         scalar fTop = skFontMetrics.fTop;
111         scalar fAscent = skFontMetrics.fAscent;
112         scalar fDescent = skFontMetrics.fDescent;
113         scalar fBottom = skFontMetrics.fBottom;
114         scalar fLeading = skFontMetrics.fLeading;
115         scalar fAvgCharWidth = skFontMetrics.fAvgCharWidth;
116         scalar fMaxCharWidth = skFontMetrics.fMaxCharWidth;
117         scalar fXMin = skFontMetrics.fXMin;
118         scalar fXMax = skFontMetrics.fXMax;
119         scalar fXHeight = skFontMetrics.fXHeight;
120         scalar fCapHeight = skFontMetrics.fCapHeight;
121         scalar fUnderlineThickness = skFontMetrics.fUnderlineThickness;
122         scalar fUnderlinePosition = skFontMetrics.fUnderlinePosition;
123         scalar fStrikeoutThickness = skFontMetrics.fStrikeoutThickness;
124         scalar fStrikeoutPosition = skFontMetrics.fStrikeoutPosition;
125 
126         fontMetrics.fFlags = fFlags;
127         fontMetrics.fTop = fTop;
128         fontMetrics.fAscent = fAscent;
129         fontMetrics.fDescent = fDescent;
130         fontMetrics.fBottom = fBottom;
131         fontMetrics.fLeading = fLeading;
132         fontMetrics.fAvgCharWidth = fAvgCharWidth;
133         fontMetrics.fMaxCharWidth = fMaxCharWidth;
134         fontMetrics.fXMin = fXMin;
135         fontMetrics.fXMax = fXMax;
136         fontMetrics.fXHeight = fXHeight;
137         fontMetrics.fCapHeight = fCapHeight;
138         fontMetrics.fUnderlineThickness = fUnderlineThickness;
139         fontMetrics.fUnderlinePosition = fUnderlinePosition;
140         fontMetrics.fStrikeoutThickness = fStrikeoutThickness;
141         fontMetrics.fStrikeoutPosition = fStrikeoutPosition;
142     }
143 
DrawingRectCastToSkRect(const Rect & rect,SkRect & skRect)144     static inline void DrawingRectCastToSkRect(const Rect& rect, SkRect& skRect)
145     {
146         scalar fLeft = rect.GetLeft();
147         scalar fTop = rect.GetTop();
148         scalar fRight = rect.GetRight();
149         scalar fBottom = rect.GetBottom();
150         skRect.fLeft = fLeft;
151         skRect.fTop = fTop;
152         skRect.fRight = fRight;
153         skRect.fBottom = fBottom;
154     }
155 
SkRectCastToDrawingRect(const SkRect & skRect,Rect & rect)156     static inline void SkRectCastToDrawingRect(const SkRect& skRect, Rect& rect)
157     {
158         SkScalar fLeft = skRect.fLeft;
159         SkScalar fTop = skRect.fTop;
160         SkScalar fRight = skRect.fRight;
161         SkScalar fBottom = skRect.fBottom;
162         rect.SetLeft(fLeft);
163         rect.SetTop(fTop);
164         rect.SetRight(fRight);
165         rect.SetBottom(fBottom);
166     }
167 
SkRunBufferCastToDrawingRunBuffer(const SkTextBlobBuilder::RunBuffer & skRunBuffer,TextBlobBuilder::RunBuffer & runBuffer)168     static inline void SkRunBufferCastToDrawingRunBuffer(const SkTextBlobBuilder::RunBuffer& skRunBuffer,
169         TextBlobBuilder::RunBuffer& runBuffer)
170     {
171         uint16_t* glyphs = skRunBuffer.glyphs;
172         float* pos = skRunBuffer.pos;
173         char* utf8text = skRunBuffer.utf8text;
174         uint32_t* clusters = skRunBuffer.clusters;
175         runBuffer.glyphs = glyphs;
176         runBuffer.pos = pos;
177         runBuffer.utf8text = utf8text;
178         runBuffer.clusters = clusters;
179     }
180 
DrawingFontStyleCastToSkFontStyle(const FontStyle & fontStyle,SkFontStyle & skFontStyle)181     static inline void DrawingFontStyleCastToSkFontStyle(const FontStyle& fontStyle, SkFontStyle& skFontStyle)
182     {
183         skFontStyle = SkFontStyle{fontStyle.GetWeight(), fontStyle.GetWidth(),
184             static_cast<SkFontStyle::Slant>(fontStyle.GetSlant())};
185     }
186 
SkFontStyleCastToDrawingFontStyle(const SkFontStyle & skFontStyle,FontStyle & fontStyle)187     static inline void SkFontStyleCastToDrawingFontStyle(const SkFontStyle& skFontStyle, FontStyle& fontStyle)
188     {
189         fontStyle = FontStyle{skFontStyle.weight(), skFontStyle.width(),
190             static_cast<FontStyle::Slant>(skFontStyle.slant())};
191     }
192 
StdStringCastToSkString(const std::string & str,SkString & skStr)193     static inline void StdStringCastToSkString(const std::string& str, SkString& skStr)
194     {
195         skStr = str.c_str();
196     }
197 
SkStringCastToStdString(const SkString & skStr,std::string & str)198     static inline void SkStringCastToStdString(const SkString& skStr, std::string& str)
199     {
200         str = skStr.c_str();
201     }
202 
DrawingRSXformCastToSkXform(const RSXform & xform,SkRSXform & skXform)203     static inline void DrawingRSXformCastToSkXform(const RSXform& xform, SkRSXform& skXform)
204     {
205         skXform.fSCos = xform.cos_;
206         skXform.fSSin = xform.sin_;
207         skXform.fTx = xform.tx_;
208         skXform.fTy = xform.ty_;
209     }
210 
DrawingSamplingCastToSkSampling(const SamplingOptions & sampling,SkSamplingOptions & skSampling)211     static inline void DrawingSamplingCastToSkSampling(const SamplingOptions& sampling, SkSamplingOptions& skSampling)
212     {
213         if (sampling.GetUseCubic()) {
214             skSampling = SkSamplingOptions({ sampling.GetCubicCoffB(), sampling.GetCubicCoffC() });
215         } else {
216             skSampling = SkSamplingOptions(static_cast<SkFilterMode>(sampling.GetFilterMode()),
217                 static_cast<SkMipmapMode>(sampling.GetMipmapMode()));
218         }
219     }
220 
DrawingFontArgumentsCastToSkFontArguments(const FontArguments & fontArgs,SkFontArguments & skFontArgs)221     static void DrawingFontArgumentsCastToSkFontArguments(const FontArguments& fontArgs, SkFontArguments& skFontArgs)
222     {
223         skFontArgs.setCollectionIndex(fontArgs.GetCollectionIndex());
224 
225         SkFontArguments::VariationPosition pos;
226         pos.coordinates = reinterpret_cast<const SkFontArguments::VariationPosition::Coordinate*>(
227             fontArgs.GetVariationDesignPosition().coordinates);
228         pos.coordinateCount = fontArgs.GetVariationDesignPosition().coordinateCount;
229         skFontArgs.setVariationDesignPosition(pos);
230 
231         SkFontArguments::Palette pal;
232         pal.overrides = reinterpret_cast<const SkFontArguments::Palette::Override*>(
233             fontArgs.GetPalette().overrides);
234         pal.index = fontArgs.GetPalette().index;
235         pal.overrideCount = fontArgs.GetPalette().overrideCount;
236         skFontArgs.setPalette(pal);
237     }
238 
239 #ifndef TODO_M133_SKIA
DrawingTextureEventToRsTextureEvent(const TextureEvent & grTextureEvent,RsTextureEvent & rsTextureEvent)240     static inline void DrawingTextureEventToRsTextureEvent(const TextureEvent& grTextureEvent,
241         RsTextureEvent& rsTextureEvent)
242     {
243         rsTextureEvent.fPid = grTextureEvent.fPid;
244         rsTextureEvent.fMaxBytes = grTextureEvent.fMaxBytes;
245         rsTextureEvent.fBudgetedBytes = grTextureEvent.fBudgetedBytes;
246         rsTextureEvent.fAllocTime = grTextureEvent.fAllocTime;
247         rsTextureEvent.fClearCache = grTextureEvent.fClearCache;
248     }
249 
DrawingBlurEventToRsBlurEvent(const BlurEvent & grBlurEvent,RsBlurEvent & rsBlurEvent)250     static inline void DrawingBlurEventToRsBlurEvent(const BlurEvent& grBlurEvent, RsBlurEvent& rsBlurEvent)
251     {
252         rsBlurEvent.fPid = grBlurEvent.fPid;
253         rsBlurEvent.fFilterType = grBlurEvent.fFilterType;
254         rsBlurEvent.fBlurRadius = grBlurEvent.fBlurRadius;
255         rsBlurEvent.fWidth = grBlurEvent.fWidth;
256         rsBlurEvent.fHeight = grBlurEvent.fHeight;
257         rsBlurEvent.fBlurTime = grBlurEvent.fBlurTime;
258     }
259 #endif
260 };
261 } // namespace Drawing
262 } // namespace Rosen
263 } // namespace OHOS
264 #endif
265