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