1 /* 2 * Copyright 2023 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #include "include/core/SkFontMetrics.h" 8 #include "include/private/base/SkAssert.h" 9 #include "src/core/SkFontMetricsPriv.h" 10 #include "src/core/SkReadBuffer.h" 11 #include "src/core/SkWriteBuffer.h" 12 13 #include <optional> 14 Flatten(SkWriteBuffer & buffer,const SkFontMetrics & metrics)15void SkFontMetricsPriv::Flatten(SkWriteBuffer& buffer, const SkFontMetrics& metrics) { 16 buffer.writeUInt(metrics.fFlags); 17 buffer.writeScalar(metrics.fTop); 18 buffer.writeScalar(metrics.fAscent); 19 buffer.writeScalar(metrics.fDescent); 20 buffer.writeScalar(metrics.fBottom); 21 buffer.writeScalar(metrics.fLeading); 22 buffer.writeScalar(metrics.fAvgCharWidth); 23 buffer.writeScalar(metrics.fMaxCharWidth); 24 buffer.writeScalar(metrics.fXMin); 25 buffer.writeScalar(metrics.fXMax); 26 buffer.writeScalar(metrics.fXHeight); 27 buffer.writeScalar(metrics.fCapHeight); 28 buffer.writeScalar(metrics.fUnderlineThickness); 29 buffer.writeScalar(metrics.fUnderlinePosition); 30 buffer.writeScalar(metrics.fStrikeoutThickness); 31 buffer.writeScalar(metrics.fStrikeoutPosition); 32 } 33 MakeFromBuffer(SkReadBuffer & buffer)34std::optional<SkFontMetrics> SkFontMetricsPriv::MakeFromBuffer(SkReadBuffer& buffer) { 35 SkASSERT(buffer.isValid()); 36 37 SkFontMetrics metrics; 38 metrics.fFlags = buffer.readUInt(); 39 metrics.fTop = buffer.readScalar(); 40 metrics.fAscent = buffer.readScalar(); 41 metrics.fDescent = buffer.readScalar(); 42 metrics.fBottom = buffer.readScalar(); 43 metrics.fLeading = buffer.readScalar(); 44 metrics.fAvgCharWidth = buffer.readScalar(); 45 metrics.fMaxCharWidth = buffer.readScalar(); 46 metrics.fXMin = buffer.readScalar(); 47 metrics.fXMax = buffer.readScalar(); 48 metrics.fXHeight = buffer.readScalar(); 49 metrics.fCapHeight = buffer.readScalar(); 50 metrics.fUnderlineThickness = buffer.readScalar(); 51 metrics.fUnderlinePosition = buffer.readScalar(); 52 metrics.fStrikeoutThickness = buffer.readScalar(); 53 metrics.fStrikeoutPosition = buffer.readScalar(); 54 55 // All the reads above were valid, so return the metrics. 56 if (buffer.isValid()) { 57 return metrics; 58 } 59 60 return std::nullopt; 61 } 62