xref: /aosp_15_r20/external/skia/src/core/SkFontMetricsPriv.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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)15 void 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)34 std::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