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