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