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 
31 #include "text/font_arguments.h"
32 #include "text/font_metrics.h"
33 #include "text/font_style.h"
34 #include "text/rs_xform.h"
35 #include "text/text_blob_builder.h"
36 #include "utils/rect.h"
37 #include "utils/sampling_options.h"
38 
39 namespace OHOS {
40 namespace Rosen {
41 namespace Drawing {
42 class SkiaConvertUtils {
43 public:
DrawingFontMetricsCastToSkFontMetrics(const FontMetrics & fontMetrics,SkFontMetrics & skFontMetrics)44     static void DrawingFontMetricsCastToSkFontMetrics(const FontMetrics& fontMetrics, SkFontMetrics& skFontMetrics)
45     {
46         skFontMetrics.fFlags = fontMetrics.fFlags;
47         skFontMetrics.fTop = fontMetrics.fTop;
48         skFontMetrics.fAscent = fontMetrics.fAscent;
49         skFontMetrics.fDescent = fontMetrics.fDescent;
50         skFontMetrics.fBottom = fontMetrics.fBottom;
51         skFontMetrics.fLeading = fontMetrics.fLeading;
52         skFontMetrics.fAvgCharWidth = fontMetrics.fAvgCharWidth;
53         skFontMetrics.fMaxCharWidth = fontMetrics.fMaxCharWidth;
54         skFontMetrics.fXMin = fontMetrics.fXMin;
55         skFontMetrics.fXMax = fontMetrics.fXMax;
56         skFontMetrics.fXHeight = fontMetrics.fXHeight;
57         skFontMetrics.fCapHeight = fontMetrics.fCapHeight;
58         skFontMetrics.fUnderlineThickness = fontMetrics.fUnderlineThickness;
59         skFontMetrics.fUnderlinePosition = fontMetrics.fUnderlinePosition;
60         skFontMetrics.fStrikeoutThickness = fontMetrics.fStrikeoutThickness;
61         skFontMetrics.fStrikeoutPosition = fontMetrics.fStrikeoutPosition;
62     }
63 
SkFontMetricsCastToDrawingFontMetrics(const SkFontMetrics & skFontMetrics,FontMetrics & fontMetrics)64     static void SkFontMetricsCastToDrawingFontMetrics(const SkFontMetrics& skFontMetrics, FontMetrics& fontMetrics)
65     {
66         fontMetrics.fFlags = skFontMetrics.fFlags;
67         fontMetrics.fTop = skFontMetrics.fTop;
68         fontMetrics.fAscent = skFontMetrics.fAscent;
69         fontMetrics.fDescent = skFontMetrics.fDescent;
70         fontMetrics.fBottom = skFontMetrics.fBottom;
71         fontMetrics.fLeading = skFontMetrics.fLeading;
72         fontMetrics.fAvgCharWidth = skFontMetrics.fAvgCharWidth;
73         fontMetrics.fMaxCharWidth = skFontMetrics.fMaxCharWidth;
74         fontMetrics.fXMin = skFontMetrics.fXMin;
75         fontMetrics.fXMax = skFontMetrics.fXMax;
76         fontMetrics.fXHeight = skFontMetrics.fXHeight;
77         fontMetrics.fCapHeight = skFontMetrics.fCapHeight;
78         fontMetrics.fUnderlineThickness = skFontMetrics.fUnderlineThickness;
79         fontMetrics.fUnderlinePosition = skFontMetrics.fUnderlinePosition;
80         fontMetrics.fStrikeoutThickness = skFontMetrics.fStrikeoutThickness;
81         fontMetrics.fStrikeoutPosition = skFontMetrics.fStrikeoutPosition;
82     }
83 
DrawingRectCastToSkRect(const Rect & rect,SkRect & skRect)84     static inline void DrawingRectCastToSkRect(const Rect& rect, SkRect& skRect)
85     {
86         skRect.fLeft = rect.GetLeft();
87         skRect.fTop = rect.GetTop();
88         skRect.fRight = rect.GetRight();
89         skRect.fBottom = rect.GetBottom();
90     }
91 
SkRectCastToDrawingRect(const SkRect & skRect,Rect & rect)92     static inline void SkRectCastToDrawingRect(const SkRect& skRect, Rect& rect)
93     {
94         rect.SetLeft(skRect.fLeft);
95         rect.SetTop(skRect.fTop);
96         rect.SetRight(skRect.fRight);
97         rect.SetBottom(skRect.fBottom);
98     }
99 
SkRunBufferCastToDrawingRunBuffer(const SkTextBlobBuilder::RunBuffer & skRunBuffer,TextBlobBuilder::RunBuffer & runBuffer)100     static inline void SkRunBufferCastToDrawingRunBuffer(const SkTextBlobBuilder::RunBuffer& skRunBuffer,
101         TextBlobBuilder::RunBuffer& runBuffer)
102     {
103         runBuffer.glyphs = skRunBuffer.glyphs;
104         runBuffer.pos = skRunBuffer.pos;
105         runBuffer.utf8text = skRunBuffer.utf8text;
106         runBuffer.clusters = skRunBuffer.clusters;
107     }
108 
DrawingFontStyleCastToSkFontStyle(const FontStyle & fontStyle,SkFontStyle & skFontStyle)109     static inline void DrawingFontStyleCastToSkFontStyle(const FontStyle& fontStyle, SkFontStyle& skFontStyle)
110     {
111         skFontStyle = SkFontStyle{fontStyle.GetWeight(), fontStyle.GetWidth(),
112             static_cast<SkFontStyle::Slant>(fontStyle.GetSlant())};
113     }
114 
SkFontStyleCastToDrawingFontStyle(const SkFontStyle & skFontStyle,FontStyle & fontStyle)115     static inline void SkFontStyleCastToDrawingFontStyle(const SkFontStyle& skFontStyle, FontStyle& fontStyle)
116     {
117         fontStyle = FontStyle{skFontStyle.weight(), skFontStyle.width(),
118             static_cast<FontStyle::Slant>(skFontStyle.slant())};
119     }
120 
StdStringCastToSkString(const std::string & str,SkString & skStr)121     static inline void StdStringCastToSkString(const std::string& str, SkString& skStr)
122     {
123         skStr = str.c_str();
124     }
125 
SkStringCastToStdString(const SkString & skStr,std::string & str)126     static inline void SkStringCastToStdString(const SkString& skStr, std::string& str)
127     {
128         str = skStr.c_str();
129     }
130 
DrawingRSXformCastToSkXform(const RSXform & xform,SkRSXform & skXform)131     static inline void DrawingRSXformCastToSkXform(const RSXform& xform, SkRSXform& skXform)
132     {
133         skXform.fSCos = xform.cos_;
134         skXform.fSSin = xform.sin_;
135         skXform.fTx = xform.tx_;
136         skXform.fTy = xform.ty_;
137     }
138 
DrawingSamplingCastToSkSampling(const SamplingOptions & sampling,SkSamplingOptions & skSampling)139     static inline void DrawingSamplingCastToSkSampling(const SamplingOptions& sampling, SkSamplingOptions& skSampling)
140     {
141         if (sampling.GetUseCubic()) {
142             skSampling = SkSamplingOptions({ sampling.GetCubicCoffB(), sampling.GetCubicCoffC() });
143         } else {
144             skSampling = SkSamplingOptions(static_cast<SkFilterMode>(sampling.GetFilterMode()),
145                 static_cast<SkMipmapMode>(sampling.GetMipmapMode()));
146         }
147     }
148 
DrawingFontArgumentsCastToSkFontArguments(const FontArguments & fontArgs,SkFontArguments & skFontArgs)149     static void DrawingFontArgumentsCastToSkFontArguments(const FontArguments& fontArgs, SkFontArguments& skFontArgs)
150     {
151         skFontArgs.setCollectionIndex(fontArgs.GetCollectionIndex());
152 
153         SkFontArguments::VariationPosition pos;
154         pos.coordinates = reinterpret_cast<const SkFontArguments::VariationPosition::Coordinate*>(
155             fontArgs.GetVariationDesignPosition().coordinates);
156         pos.coordinateCount = fontArgs.GetVariationDesignPosition().coordinateCount;
157         skFontArgs.setVariationDesignPosition(pos);
158 
159         SkFontArguments::Palette pal;
160         pal.overrides = reinterpret_cast<const SkFontArguments::Palette::Override*>(
161             fontArgs.GetPalette().overrides);
162         pal.index = fontArgs.GetPalette().index;
163         pal.overrideCount = fontArgs.GetPalette().overrideCount;
164         skFontArgs.setPalette(pal);
165     }
166 };
167 } // namespace Drawing
168 } // namespace Rosen
169 } // namespace OHOS
170 #endif