Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Functions | Variables
SkPDFUtils Namespace Reference

Functions

const char * BlendModeName (SkBlendMode)
 
std::unique_ptr< SkPDFArrayRectToArray (const SkRect &rect)
 
std::unique_ptr< SkPDFArrayMatrixToArray (const SkMatrix &matrix)
 
void MoveTo (SkScalar x, SkScalar y, SkWStream *content)
 
void AppendLine (SkScalar x, SkScalar y, SkWStream *content)
 
void AppendRectangle (const SkRect &rect, SkWStream *content)
 
void EmitPath (const SkPath &path, SkPaint::Style paintStyle, bool doConsumeDegerates, SkWStream *content, SkScalar tolerance=0.25f)
 
void EmitPath (const SkPath &path, SkPaint::Style paintStyle, SkWStream *content, SkScalar tolerance=0.25f)
 
void ClosePath (SkWStream *content)
 
void PaintPath (SkPaint::Style style, SkPathFillType fill, SkWStream *content)
 
void StrokePath (SkWStream *content)
 
void ApplyGraphicState (int objectIndex, SkWStream *content)
 
void ApplyPattern (int objectIndex, SkWStream *content)
 
size_t ColorToDecimal (uint8_t value, char result[5])
 
size_t ColorToDecimalF (float value, char result[kFloatColorDecimalCount+2])
 
void AppendColorComponent (uint8_t value, SkWStream *wStream)
 
void AppendColorComponentF (float value, SkWStream *wStream)
 
void AppendScalar (SkScalar value, SkWStream *stream)
 
void WriteUInt16BE (SkWStream *wStream, uint16_t value)
 
void WriteUInt8 (SkWStream *wStream, uint8_t value)
 
void WriteUTF16beHex (SkWStream *wStream, SkUnichar utf32)
 
SkMatrix GetShaderLocalMatrix (const SkShader *shader)
 
bool InverseTransformBBox (const SkMatrix &matrix, SkRect *bbox)
 
void PopulateTilingPatternDict (SkPDFDict *pattern, SkRect &bbox, std::unique_ptr< SkPDFDict > resources, const SkMatrix &matrix)
 
bool ToBitmap (const SkImage *img, SkBitmap *dst)
 
void AppendTransform (const SkMatrix &, SkWStream *)
 
void GetDateTime (SkPDF::DateTime *)
 

Variables

static constexpr unsigned kFloatColorDecimalCount = 4
 

Function Documentation

◆ AppendColorComponent()

void SkPDFUtils::AppendColorComponent ( uint8_t  value,
SkWStream wStream 
)
inline

Definition at line 75 of file SkPDFUtils.h.

75 {
76 char buffer[5];
77 size_t len = SkPDFUtils::ColorToDecimal(value, buffer);
78 wStream->write(buffer, len);
79}
virtual bool write(const void *buffer, size_t size)=0
static const uint8_t buffer[]
size_t ColorToDecimal(uint8_t value, char result[5])

◆ AppendColorComponentF()

void SkPDFUtils::AppendColorComponentF ( float  value,
SkWStream wStream 
)
inline

Definition at line 80 of file SkPDFUtils.h.

80 {
82 size_t len = SkPDFUtils::ColorToDecimalF(value, buffer);
83 wStream->write(buffer, len);
84}
size_t ColorToDecimalF(float value, char result[kFloatColorDecimalCount+2])
static constexpr unsigned kFloatColorDecimalCount
Definition SkPDFUtils.h:73

◆ AppendLine()

void SkPDFUtils::AppendLine ( SkScalar  x,
SkScalar  y,
SkWStream content 
)

Definition at line 75 of file SkPDFUtils.cpp.

75 {
77 content->writeText(" ");
79 content->writeText(" l\n");
80}
union flutter::testing::@2838::KeyboardChange::@76 content
double y
double x
void AppendScalar(SkScalar value, SkWStream *stream)
Definition SkPDFUtils.h:86

◆ AppendRectangle()

void SkPDFUtils::AppendRectangle ( const SkRect rect,
SkWStream content 
)

Definition at line 111 of file SkPDFUtils.cpp.

111 {
112 // Skia has 0,0 at top left, pdf at bottom left. Do the right thing.
113 SkScalar bottom = std::min(rect.fBottom, rect.fTop);
114
116 content->writeText(" ");
118 content->writeText(" ");
119 SkPDFUtils::AppendScalar(rect.width(), content);
120 content->writeText(" ");
121 SkPDFUtils::AppendScalar(rect.height(), content);
122 content->writeText(" re\n");
123}
float SkScalar
Definition extension.cpp:12

◆ AppendScalar()

void SkPDFUtils::AppendScalar ( SkScalar  value,
SkWStream stream 
)
inline

Definition at line 86 of file SkPDFUtils.h.

86 {
88 size_t len = SkFloatToDecimal(value, result);
90 stream->write(result, len);
91}
#define SkASSERT(cond)
Definition SkAssert.h:116
unsigned SkFloatToDecimal(float value, char output[kMaximumSkFloatToDecimalLength])
constexpr unsigned kMaximumSkFloatToDecimalLength
GAsyncResult * result

◆ AppendTransform()

void SkPDFUtils::AppendTransform ( const SkMatrix matrix,
SkWStream content 
)

Definition at line 392 of file SkPDFUtils.cpp.

392 {
393 SkScalar values[6];
394 if (!matrix.asAffine(values)) {
396 }
397 for (SkScalar v : values) {
399 content->writeText(" ");
400 }
401 content->writeText("cm\n");
402}
static void SetAffineIdentity(SkScalar affine[6])
Definition SkMatrix.cpp:746

◆ ApplyGraphicState()

void SkPDFUtils::ApplyGraphicState ( int  objectIndex,
SkWStream content 
)

Definition at line 247 of file SkPDFUtils.cpp.

247 {
249 content->writeText(" gs\n");
250}
void SkPDFWriteResourceName(SkWStream *dst, SkPDFResourceType type, int key)

◆ ApplyPattern()

void SkPDFUtils::ApplyPattern ( int  objectIndex,
SkWStream content 
)

Definition at line 252 of file SkPDFUtils.cpp.

252 {
253 // Select Pattern color space (CS, cs) and set pattern object as current
254 // color (SCN, scn)
255 content->writeText("/Pattern CS/Pattern cs");
257 content->writeText(" SCN");
259 content->writeText(" scn\n");
260}

◆ BlendModeName()

const char * SkPDFUtils::BlendModeName ( SkBlendMode  mode)

Definition at line 30 of file SkPDFUtils.cpp.

30 {
31 // PDF32000.book section 11.3.5 "Blend Mode"
32 switch (mode) {
33 case SkBlendMode::kSrcOver: return "Normal";
34 case SkBlendMode::kXor: return "Normal"; // (unsupported mode)
35 case SkBlendMode::kPlus: return "Normal"; // (unsupported mode)
36 case SkBlendMode::kScreen: return "Screen";
37 case SkBlendMode::kOverlay: return "Overlay";
38 case SkBlendMode::kDarken: return "Darken";
39 case SkBlendMode::kLighten: return "Lighten";
40 case SkBlendMode::kColorDodge: return "ColorDodge";
41 case SkBlendMode::kColorBurn: return "ColorBurn";
42 case SkBlendMode::kHardLight: return "HardLight";
43 case SkBlendMode::kSoftLight: return "SoftLight";
44 case SkBlendMode::kDifference: return "Difference";
45 case SkBlendMode::kExclusion: return "Exclusion";
46 case SkBlendMode::kMultiply: return "Multiply";
47 case SkBlendMode::kHue: return "Hue";
48 case SkBlendMode::kSaturation: return "Saturation";
49 case SkBlendMode::kColor: return "Color";
50 case SkBlendMode::kLuminosity: return "Luminosity";
51 // Other blendmodes are handled in SkPDFDevice::setUpContentEntry.
52 default: return nullptr;
53 }
54}
@ kExclusion
rc = s + d - two(s*d), ra = kSrcOver
@ kSaturation
saturation of source with hue and luminosity of destination
@ kColorBurn
darken destination to reflect source
@ kPlus
r = min(s + d, 1)
@ kLighten
rc = s + d - min(s*da, d*sa), ra = kSrcOver
@ kHue
hue of source with saturation and luminosity of destination
@ kMultiply
r = s*(1-da) + d*(1-sa) + s*d
@ kColorDodge
brighten destination to reflect source
@ kScreen
r = s + d - s*d
@ kSrcOver
r = s + (1-sa)*d
@ kXor
r = s*(1-da) + d*(1-sa)
@ kLuminosity
luminosity of source with hue and saturation of destination
@ kSoftLight
lighten or darken, depending on source
@ kDifference
rc = s + d - 2*(min(s*da, d*sa)), ra = kSrcOver
@ kOverlay
multiply or screen, depending on destination
@ kColor
hue and saturation of source with luminosity of destination
@ kHardLight
multiply or screen, depending on source
@ kDarken
rc = s + d - max(s*da, d*sa), ra = kSrcOver

◆ ClosePath()

void SkPDFUtils::ClosePath ( SkWStream content)

Definition at line 220 of file SkPDFUtils.cpp.

220 {
221 content->writeText("h\n");
222}

◆ ColorToDecimal()

size_t SkPDFUtils::ColorToDecimal ( uint8_t  value,
char  result[5] 
)

Definition at line 300 of file SkPDFUtils.cpp.

300 {
301 if (value == 255 || value == 0) {
302 result[0] = value ? '1' : '0';
303 result[1] = '\0';
304 return 1;
305 }
306 // int x = 0.5 + (1000.0 / 255.0) * value;
307 int x = SkFixedRoundToInt((SK_Fixed1 * 1000 / 255) * value);
308 return print_permil_as_decimal(x, result, 3);
309}
#define SK_Fixed1
Definition SkFixed.h:26
#define SkFixedRoundToInt(x)
Definition SkFixed.h:76
static size_t print_permil_as_decimal(int x, char *result, unsigned places)
uint8_t value

◆ ColorToDecimalF()

size_t SkPDFUtils::ColorToDecimalF ( float  value,
char  result[kFloatColorDecimalCount+2] 
)

Definition at line 289 of file SkPDFUtils.cpp.

289 {
290 static constexpr int kFactor = int_pow(10, kFloatColorDecimalCount);
291 int x = sk_float_round2int(value * kFactor);
292 if (x >= kFactor || x <= 0) { // clamp to 0-1
293 result[0] = x > 0 ? '1' : '0';
294 result[1] = '\0';
295 return 1;
296 }
297 return print_permil_as_decimal(x, result, kFloatColorDecimalCount);
298}
#define sk_float_round2int(x)
static constexpr int int_pow(int base, unsigned exp, int acc=1)

◆ EmitPath() [1/2]

void SkPDFUtils::EmitPath ( const SkPath path,
SkPaint::Style  paintStyle,
bool  doConsumeDegerates,
SkWStream content,
SkScalar  tolerance = 0.25f 
)

Definition at line 125 of file SkPDFUtils.cpp.

127 {
128 if (path.isEmpty() && SkPaint::kFill_Style == paintStyle) {
130 return;
131 }
132 // Filling a path with no area results in a drawing in PDF renderers but
133 // Chrome expects to be able to draw some such entities with no visible
134 // result, so we detect those cases and discard the drawing for them.
135 // Specifically: moveTo(X), lineTo(Y) and moveTo(X), lineTo(X), lineTo(Y).
136
137 SkRect rect;
138 bool isClosed; // Both closure and direction need to be checked.
139 SkPathDirection direction;
140 if (path.isRect(&rect, &isClosed, &direction) &&
141 isClosed &&
142 (SkPathDirection::kCW == direction ||
143 SkPathFillType::kEvenOdd == path.getFillType()))
144 {
146 return;
147 }
148
149 enum SkipFillState {
150 kEmpty_SkipFillState,
151 kSingleLine_SkipFillState,
152 kNonSingleLine_SkipFillState,
153 };
154 SkipFillState fillState = kEmpty_SkipFillState;
155 //if (paintStyle != SkPaint::kFill_Style) {
156 // fillState = kNonSingleLine_SkipFillState;
157 //}
158 SkPoint lastMovePt = SkPoint::Make(0,0);
159 SkDynamicMemoryWStream currentSegment;
160 SkPoint args[4];
161 SkPath::Iter iter(path, false);
162 for (SkPath::Verb verb = iter.next(args);
163 verb != SkPath::kDone_Verb;
164 verb = iter.next(args)) {
165 // args gets all the points, even the implicit first point.
166 switch (verb) {
168 MoveTo(args[0].fX, args[0].fY, &currentSegment);
169 lastMovePt = args[0];
170 fillState = kEmpty_SkipFillState;
171 break;
173 if (!doConsumeDegerates || !SkPathPriv::AllPointsEq(args, 2)) {
174 AppendLine(args[1].fX, args[1].fY, &currentSegment);
175 if ((fillState == kEmpty_SkipFillState) && (args[0] != lastMovePt)) {
176 fillState = kSingleLine_SkipFillState;
177 break;
178 }
179 fillState = kNonSingleLine_SkipFillState;
180 }
181 break;
183 if (!doConsumeDegerates || !SkPathPriv::AllPointsEq(args, 3)) {
184 append_quad(args, &currentSegment);
185 fillState = kNonSingleLine_SkipFillState;
186 }
187 break;
189 if (!doConsumeDegerates || !SkPathPriv::AllPointsEq(args, 3)) {
191 const SkPoint* quads = converter.computeQuads(args, iter.conicWeight(), tolerance);
192 for (int i = 0; i < converter.countQuads(); ++i) {
193 append_quad(&quads[i * 2], &currentSegment);
194 }
195 fillState = kNonSingleLine_SkipFillState;
196 }
197 break;
199 if (!doConsumeDegerates || !SkPathPriv::AllPointsEq(args, 4)) {
200 append_cubic(args[1].fX, args[1].fY, args[2].fX, args[2].fY,
201 args[3].fX, args[3].fY, &currentSegment);
202 fillState = kNonSingleLine_SkipFillState;
203 }
204 break;
206 ClosePath(&currentSegment);
207 currentSegment.writeToStream(content);
208 currentSegment.reset();
209 break;
210 default:
211 SkASSERT(false);
212 break;
213 }
214 }
215 if (currentSegment.bytesWritten() > 0) {
216 currentSegment.writeToStream(content);
217 }
218}
static void append_quad(const SkPoint quad[], SkWStream *content)
static void append_cubic(SkScalar ctl1X, SkScalar ctl1Y, SkScalar ctl2X, SkScalar ctl2Y, SkScalar dstX, SkScalar dstY, SkWStream *content)
SkPathDirection
Definition SkPathTypes.h:34
size_t bytesWritten() const override
Definition SkStream.cpp:526
bool writeToStream(SkWStream *dst) const
Definition SkStream.cpp:642
@ kFill_Style
set to fill geometry
Definition SkPaint.h:193
static bool AllPointsEq(const SkPoint pts[], int count)
Definition SkPathPriv.h:339
@ kClose_Verb
Definition SkPath.h:1463
@ kMove_Verb
Definition SkPath.h:1458
@ kConic_Verb
Definition SkPath.h:1461
@ kDone_Verb
Definition SkPath.h:1464
@ kCubic_Verb
Definition SkPath.h:1462
@ kQuad_Verb
Definition SkPath.h:1460
@ kLine_Verb
Definition SkPath.h:1459
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
void AppendRectangle(const SkRect &rect, SkWStream *content)
void AppendLine(SkScalar x, SkScalar y, SkWStream *content)
void ClosePath(SkWStream *content)
sk_sp< SkBlender > blender SkRect rect
Definition SkRecords.h:350
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition switches.h:57
void MoveTo(PathBuilder *builder, Scalar x, Scalar y)
static constexpr SkPoint Make(float x, float y)

◆ EmitPath() [2/2]

void SkPDFUtils::EmitPath ( const SkPath path,
SkPaint::Style  paintStyle,
SkWStream content,
SkScalar  tolerance = 0.25f 
)
inline

Definition at line 59 of file SkPDFUtils.h.

60 {
61 SkPDFUtils::EmitPath(path, paintStyle, true, content, tolerance);
62}
void EmitPath(const SkPath &path, SkPaint::Style paintStyle, bool doConsumeDegerates, SkWStream *content, SkScalar tolerance=0.25f)

◆ GetDateTime()

void SkPDFUtils::GetDateTime ( SkPDF::DateTime dt)

Definition at line 424 of file SkPDFUtils.cpp.

424 {
425 if (dt) {
426 time_t m_time;
427 time(&m_time);
428 struct tm tstruct;
429 gmtime_r(&m_time, &tstruct);
430 dt->fTimeZoneMinutes = 0;
431 dt->fYear = tstruct.tm_year + 1900;
432 dt->fMonth = SkToU8(tstruct.tm_mon + 1);
433 dt->fDayOfWeek = SkToU8(tstruct.tm_wday);
434 dt->fDay = SkToU8(tstruct.tm_mday);
435 dt->fHour = SkToU8(tstruct.tm_hour);
436 dt->fMinute = SkToU8(tstruct.tm_min);
437 dt->fSecond = SkToU8(tstruct.tm_sec);
438 }
439}
constexpr uint8_t SkToU8(S x)
Definition SkTo.h:22
uint8_t fMinute
0..59
uint8_t fMonth
1..12
uint8_t fDay
1..31
uint16_t fYear
e.g. 2005
uint8_t fSecond
0..59
int16_t fTimeZoneMinutes
uint8_t fHour
0..23
uint8_t fDayOfWeek
0..6, 0==Sunday

◆ GetShaderLocalMatrix()

SkMatrix SkPDFUtils::GetShaderLocalMatrix ( const SkShader shader)
inline

Definition at line 117 of file SkPDFUtils.h.

117 {
118 SkMatrix localMatrix;
119 if (sk_sp<SkShader> s = as_SB(shader)->makeAsALocalMatrixShader(&localMatrix)) {
120 return localMatrix;
121 }
122 return SkMatrix::I();
123}
SkShaderBase * as_SB(SkShader *shader)
static const SkMatrix & I()
struct MyStruct s

◆ InverseTransformBBox()

bool SkPDFUtils::InverseTransformBBox ( const SkMatrix matrix,
SkRect bbox 
)

Definition at line 311 of file SkPDFUtils.cpp.

311 {
312 SkMatrix inverse;
313 if (!matrix.invert(&inverse)) {
314 return false;
315 }
316 inverse.mapRect(bbox);
317 return true;
318}
bool mapRect(SkRect *dst, const SkRect &src, SkApplyPerspectiveClip pc=SkApplyPerspectiveClip::kYes) const

◆ MatrixToArray()

std::unique_ptr< SkPDFArray > SkPDFUtils::MatrixToArray ( const SkMatrix matrix)

Definition at line 60 of file SkPDFUtils.cpp.

60 {
61 SkScalar a[6];
62 if (!matrix.asAffine(a)) {
64 }
65 return SkPDFMakeArray(a[0], a[1], a[2], a[3], a[4], a[5]);
66}
static std::unique_ptr< SkPDFArray > SkPDFMakeArray(Args... args)
Definition SkPDFTypes.h:135
struct MyStruct a[10]

◆ MoveTo()

void SkPDFUtils::MoveTo ( SkScalar  x,
SkScalar  y,
SkWStream content 
)

Definition at line 68 of file SkPDFUtils.cpp.

68 {
70 content->writeText(" ");
72 content->writeText(" m\n");
73}

◆ PaintPath()

void SkPDFUtils::PaintPath ( SkPaint::Style  style,
SkPathFillType  fill,
SkWStream content 
)

Definition at line 224 of file SkPDFUtils.cpp.

224 {
225 if (style == SkPaint::kFill_Style) {
226 content->writeText("f");
227 } else if (style == SkPaint::kStrokeAndFill_Style) {
228 content->writeText("B");
229 } else if (style == SkPaint::kStroke_Style) {
230 content->writeText("S");
231 }
232
233 if (style != SkPaint::kStroke_Style) {
236 if (fill == SkPathFillType::kEvenOdd) {
237 content->writeText("*");
238 }
239 }
240 content->writeText("\n");
241}
#define NOT_IMPLEMENTED(condition, assert)
Definition SkPDFUtils.h:39
@ kStroke_Style
set to stroke geometry
Definition SkPaint.h:194
@ kStrokeAndFill_Style
sets to stroke and fill geometry
Definition SkPaint.h:195

◆ PopulateTilingPatternDict()

void SkPDFUtils::PopulateTilingPatternDict ( SkPDFDict pattern,
SkRect bbox,
std::unique_ptr< SkPDFDict resources,
const SkMatrix matrix 
)

Definition at line 320 of file SkPDFUtils.cpp.

323 {
324 const int kTiling_PatternType = 1;
325 const int kColoredTilingPattern_PaintType = 1;
326 const int kConstantSpacing_TilingType = 1;
327
328 pattern->insertName("Type", "Pattern");
329 pattern->insertInt("PatternType", kTiling_PatternType);
330 pattern->insertInt("PaintType", kColoredTilingPattern_PaintType);
331 pattern->insertInt("TilingType", kConstantSpacing_TilingType);
332 pattern->insertObject("BBox", SkPDFUtils::RectToArray(bbox));
333 pattern->insertScalar("XStep", bbox.width());
334 pattern->insertScalar("YStep", bbox.height());
335 pattern->insertObject("Resources", std::move(resources));
336 if (!matrix.isIdentity()) {
337 pattern->insertObject("Matrix", SkPDFUtils::MatrixToArray(matrix));
338 }
339}
void insertName(const char key[], const char nameValue[])
void insertObject(const char key[], std::unique_ptr< SkPDFObject > &&)
void insertInt(const char key[], int32_t value)
void insertScalar(const char key[], SkScalar value)
std::unique_ptr< SkPDFArray > MatrixToArray(const SkMatrix &matrix)
std::unique_ptr< SkPDFArray > RectToArray(const SkRect &rect)
constexpr float height() const
Definition SkRect.h:769
constexpr float width() const
Definition SkRect.h:762

◆ RectToArray()

std::unique_ptr< SkPDFArray > SkPDFUtils::RectToArray ( const SkRect rect)

Definition at line 56 of file SkPDFUtils.cpp.

56 {
57 return SkPDFMakeArray(r.left(), r.top(), r.right(), r.bottom());
58}

◆ StrokePath()

void SkPDFUtils::StrokePath ( SkWStream content)

Definition at line 243 of file SkPDFUtils.cpp.

243 {
245}
void PaintPath(SkPaint::Style style, SkPathFillType fill, SkWStream *content)

◆ ToBitmap()

bool SkPDFUtils::ToBitmap ( const SkImage img,
SkBitmap dst 
)

Definition at line 341 of file SkPDFUtils.cpp.

341 {
342 SkASSERT(img);
343 SkASSERT(dst);
345 // TODO: support GPU images
346 if(as_IB(img)->getROPixels(nullptr, &bitmap)) {
347 SkASSERT(bitmap.dimensions() == img->dimensions());
348 SkASSERT(!bitmap.drawsNothing());
349 *dst = std::move(bitmap);
350 return true;
351 }
352 return false;
353}
static SkImage_Base * as_IB(SkImage *image)
SkISize dimensions() const
Definition SkImage.h:297

◆ WriteUInt16BE()

void SkPDFUtils::WriteUInt16BE ( SkWStream wStream,
uint16_t  value 
)
inline

Definition at line 93 of file SkPDFUtils.h.

93 {
94 char result[4] = { SkHexadecimalDigits::gUpper[ value >> 12 ],
96 SkHexadecimalDigits::gUpper[0xF & (value >> 4 )],
98 wStream->write(result, 4);
99}
const char gUpper[16]
Definition SkUtils.cpp:10

◆ WriteUInt8()

void SkPDFUtils::WriteUInt8 ( SkWStream wStream,
uint8_t  value 
)
inline

Definition at line 101 of file SkPDFUtils.h.

101 {
102 char result[2] = { SkHexadecimalDigits::gUpper[value >> 4],
104 wStream->write(result, 2);
105}

◆ WriteUTF16beHex()

void SkPDFUtils::WriteUTF16beHex ( SkWStream wStream,
SkUnichar  utf32 
)
inline

Definition at line 107 of file SkPDFUtils.h.

107 {
108 uint16_t utf16[2] = {0, 0};
109 size_t len = SkUTF::ToUTF16(utf32, utf16);
110 SkASSERT(len == 1 || len == 2);
111 SkPDFUtils::WriteUInt16BE(wStream, utf16[0]);
112 if (len == 2) {
113 SkPDFUtils::WriteUInt16BE(wStream, utf16[1]);
114 }
115}
void WriteUInt16BE(SkWStream *wStream, uint16_t value)
Definition SkPDFUtils.h:93
SK_SPI size_t ToUTF16(SkUnichar uni, uint16_t utf16[2]=nullptr)
Definition SkUTF.cpp:243

Variable Documentation

◆ kFloatColorDecimalCount

constexpr unsigned SkPDFUtils::kFloatColorDecimalCount = 4
staticconstexpr

Definition at line 73 of file SkPDFUtils.h.