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