xref: /aosp_15_r20/external/skia/src/core/SkFontDescriptor.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2012 Google Inc.
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 
8 #ifndef SkFontDescriptor_DEFINED
9 #define SkFontDescriptor_DEFINED
10 
11 #include "include/core/SkFontArguments.h"
12 #include "include/core/SkFontStyle.h"
13 #include "include/core/SkScalar.h"
14 #include "include/core/SkStream.h"
15 #include "include/core/SkString.h"
16 #include "include/core/SkTypeface.h"
17 #include "include/private/base/SkFixed.h"
18 #include "include/private/base/SkNoncopyable.h"
19 #include "include/private/base/SkTemplates.h"
20 
21 #include <memory>
22 #include <utility>
23 
24 class SkFontData {
25 public:
26     /** Makes a copy of the data in 'axis'. */
SkFontData(std::unique_ptr<SkStreamAsset> stream,int index,int paletteIndex,const SkFixed * axis,int axisCount,const SkFontArguments::Palette::Override * paletteOverrides,int paletteOverrideCount)27     SkFontData(std::unique_ptr<SkStreamAsset> stream, int index, int paletteIndex,
28                const SkFixed* axis, int axisCount,
29                const SkFontArguments::Palette::Override* paletteOverrides, int paletteOverrideCount)
30         : fStream(std::move(stream))
31         , fIndex(index)
32         , fPaletteIndex(paletteIndex)
33         , fAxisCount(axisCount)
34         , fPaletteOverrideCount(paletteOverrideCount)
35         , fAxis(fAxisCount)
36         , fPaletteOverrides(fPaletteOverrideCount)
37     {
38         for (int i = 0; i < fAxisCount; ++i) {
39             fAxis[i] = axis[i];
40         }
41         for (int i = 0; i < fPaletteOverrideCount; ++i) {
42             fPaletteOverrides[i] = paletteOverrides[i];
43         }
44     }
45 
SkFontData(const SkFontData & that)46     SkFontData(const SkFontData& that)
47         : fStream(that.fStream->duplicate())
48         , fIndex(that.fIndex)
49         , fPaletteIndex(that.fPaletteIndex)
50         , fAxisCount(that.fAxisCount)
51         , fPaletteOverrideCount(that.fPaletteOverrideCount)
52         , fAxis(fAxisCount)
53         , fPaletteOverrides(fPaletteOverrideCount)
54     {
55         for (int i = 0; i < fAxisCount; ++i) {
56             fAxis[i] = that.fAxis[i];
57         }
58         for (int i = 0; i < fPaletteOverrideCount; ++i) {
59             fPaletteOverrides[i] = that.fPaletteOverrides[i];
60         }
61     }
hasStream()62     bool hasStream() const { return fStream != nullptr; }
detachStream()63     std::unique_ptr<SkStreamAsset> detachStream() { return std::move(fStream); }
getStream()64     SkStreamAsset* getStream() { return fStream.get(); }
getStream()65     SkStreamAsset const* getStream() const { return fStream.get(); }
getIndex()66     int getIndex() const { return fIndex; }
getAxisCount()67     int getAxisCount() const { return fAxisCount; }
getAxis()68     const SkFixed* getAxis() const { return fAxis.get(); }
getPaletteIndex()69     int getPaletteIndex() const { return fPaletteIndex; }
getPaletteOverrideCount()70     int getPaletteOverrideCount() const { return fPaletteOverrideCount; }
getPaletteOverrides()71     const SkFontArguments::Palette::Override* getPaletteOverrides() const {
72         return fPaletteOverrides.get();
73     }
74 
75 private:
76     std::unique_ptr<SkStreamAsset> fStream;
77     int fIndex;
78     int fPaletteIndex;
79     int fAxisCount;
80     int fPaletteOverrideCount;
81     skia_private::AutoSTMalloc<4, SkFixed> fAxis;
82     skia_private::AutoSTMalloc<4, SkFontArguments::Palette::Override> fPaletteOverrides;
83 };
84 
85 class SkFontDescriptor : SkNoncopyable {
86 public:
87     SkFontDescriptor();
88     // Does not affect ownership of SkStream.
89     static bool Deserialize(SkStream*, SkFontDescriptor* result);
90 
91     void serialize(SkWStream*) const;
92 
getStyle()93     SkFontStyle getStyle() const { return fStyle; }
setStyle(SkFontStyle style)94     void setStyle(SkFontStyle style) { fStyle = style; }
95 
getFamilyName()96     const char* getFamilyName() const { return fFamilyName.c_str(); }
getFullName()97     const char* getFullName() const { return fFullName.c_str(); }
getPostscriptName()98     const char* getPostscriptName() const { return fPostscriptName.c_str(); }
99 
setFamilyName(const char * name)100     void setFamilyName(const char* name) { fFamilyName.set(name); }
setFullName(const char * name)101     void setFullName(const char* name) { fFullName.set(name); }
setPostscriptName(const char * name)102     void setPostscriptName(const char* name) { fPostscriptName.set(name); }
103 
hasStream()104     bool hasStream() const { return bool(fStream); }
dupStream()105     std::unique_ptr<SkStreamAsset> dupStream() const { return fStream->duplicate(); }
getCollectionIndex()106     int getCollectionIndex() const { return fCollectionIndex; }
getPaletteIndex()107     int getPaletteIndex() const { return fPaletteIndex; }
getVariationCoordinateCount()108     int getVariationCoordinateCount() const { return fCoordinateCount; }
getVariation()109     const SkFontArguments::VariationPosition::Coordinate* getVariation() const {
110         return fVariation.get();
111     }
getPaletteEntryOverrideCount()112     int getPaletteEntryOverrideCount() const { return fPaletteEntryOverrideCount; }
getPaletteEntryOverrides()113     const SkFontArguments::Palette::Override* getPaletteEntryOverrides() const {
114         return fPaletteEntryOverrides.get();
115     }
getFactoryId()116     SkTypeface::FactoryId getFactoryId() {
117         return fFactoryId;
118     }
119 
detachStream()120     std::unique_ptr<SkStreamAsset> detachStream() { return std::move(fStream); }
setStream(std::unique_ptr<SkStreamAsset> stream)121     void setStream(std::unique_ptr<SkStreamAsset> stream) { fStream = std::move(stream); }
setCollectionIndex(int collectionIndex)122     void setCollectionIndex(int collectionIndex) { fCollectionIndex = collectionIndex; }
setPaletteIndex(int paletteIndex)123     void setPaletteIndex(int paletteIndex) { fPaletteIndex = paletteIndex; }
setVariationCoordinates(int coordinateCount)124     SkFontArguments::VariationPosition::Coordinate* setVariationCoordinates(int coordinateCount) {
125         fCoordinateCount = coordinateCount;
126         return fVariation.reset(coordinateCount);
127     }
setPaletteEntryOverrides(int paletteEntryOverrideCount)128     SkFontArguments::Palette::Override* setPaletteEntryOverrides(int paletteEntryOverrideCount) {
129         fPaletteEntryOverrideCount = paletteEntryOverrideCount;
130         return fPaletteEntryOverrides.reset(paletteEntryOverrideCount);
131     }
setFactoryId(SkTypeface::FactoryId factoryId)132     void setFactoryId(SkTypeface::FactoryId factoryId) {
133         fFactoryId = factoryId;
134     }
135 
getFontArguments()136     SkFontArguments getFontArguments() const {
137         return SkFontArguments()
138             .setCollectionIndex(this->getCollectionIndex())
139             .setVariationDesignPosition({this->getVariation(),this->getVariationCoordinateCount()})
140             .setPalette({this->getPaletteIndex(),
141                          this->getPaletteEntryOverrides(),
142                          this->getPaletteEntryOverrideCount()});
143     }
144     static SkFontStyle::Width SkFontStyleWidthForWidthAxisValue(SkScalar width);
145 
146 private:
147     SkString fFamilyName;
148     SkString fFullName;
149     SkString fPostscriptName;
150     SkFontStyle fStyle;
151 
152     std::unique_ptr<SkStreamAsset> fStream;
153     int fCollectionIndex = 0;
154     using Coordinates =
155             skia_private::AutoSTMalloc<4, SkFontArguments::VariationPosition::Coordinate>;
156     int fCoordinateCount = 0;
157     Coordinates fVariation;
158     int fPaletteIndex = 0;
159     int fPaletteEntryOverrideCount = 0;
160     skia_private::AutoTMalloc<SkFontArguments::Palette::Override> fPaletteEntryOverrides;
161     SkTypeface::FactoryId fFactoryId = 0;
162 };
163 
164 #endif // SkFontDescriptor_DEFINED
165