• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/SkStream.h"
12 #include "include/core/SkString.h"
13 #include "include/core/SkTypeface.h"
14 #include "include/private/SkFixed.h"
15 #include "include/private/SkNoncopyable.h"
16 #include "include/private/SkTemplates.h"
17 
18 class SkFontData {
19 public:
20     /** 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)21     SkFontData(std::unique_ptr<SkStreamAsset> stream, int index, int paletteIndex,
22                const SkFixed* axis, int axisCount,
23                const SkFontArguments::Palette::Override* paletteOverrides, int paletteOverrideCount)
24         : fStream(std::move(stream))
25         , fIndex(index)
26         , fPaletteIndex(paletteIndex)
27         , fAxisCount(axisCount)
28         , fPaletteOverrideCount(paletteOverrideCount)
29         , fAxis(fAxisCount)
30         , fPaletteOverrides(fPaletteOverrideCount)
31     {
32         for (int i = 0; i < fAxisCount; ++i) {
33             fAxis[i] = axis[i];
34         }
35         for (int i = 0; i < fPaletteOverrideCount; ++i) {
36             fPaletteOverrides[i] = paletteOverrides[i];
37         }
38     }
39 
SkFontData(const SkFontData & that)40     SkFontData(const SkFontData& that)
41         : fStream(that.fStream->duplicate())
42         , fIndex(that.fIndex)
43         , fPaletteIndex(that.fPaletteIndex)
44         , fAxisCount(that.fAxisCount)
45         , fPaletteOverrideCount(that.fPaletteOverrideCount)
46         , fAxis(fAxisCount)
47         , fPaletteOverrides(fPaletteOverrideCount)
48     {
49         for (int i = 0; i < fAxisCount; ++i) {
50             fAxis[i] = that.fAxis[i];
51         }
52         for (int i = 0; i < fPaletteOverrideCount; ++i) {
53             fPaletteOverrides[i] = that.fPaletteOverrides[i];
54         }
55     }
hasStream()56     bool hasStream() const { return fStream != nullptr; }
detachStream()57     std::unique_ptr<SkStreamAsset> detachStream() { return std::move(fStream); }
getStream()58     SkStreamAsset* getStream() { return fStream.get(); }
getStream()59     SkStreamAsset const* getStream() const { return fStream.get(); }
getIndex()60     int getIndex() const { return fIndex; }
getAxisCount()61     int getAxisCount() const { return fAxisCount; }
getAxis()62     const SkFixed* getAxis() const { return fAxis.get(); }
getPaletteIndex()63     int getPaletteIndex() const { return fPaletteIndex; }
getPaletteOverrideCount()64     int getPaletteOverrideCount() const { return fPaletteOverrideCount; }
getPaletteOverrides()65     const SkFontArguments::Palette::Override* getPaletteOverrides() const {
66         return fPaletteOverrides.get();
67     }
68 
69 private:
70     std::unique_ptr<SkStreamAsset> fStream;
71     int fIndex;
72     int fPaletteIndex;
73     int fAxisCount;
74     int fPaletteOverrideCount;
75     SkAutoSTMalloc<4, SkFixed> fAxis;
76     SkAutoSTMalloc<4, SkFontArguments::Palette::Override> fPaletteOverrides;
77 };
78 
79 class SkFontDescriptor : SkNoncopyable {
80 public:
81     SkFontDescriptor();
82     // Does not affect ownership of SkStream.
83     static bool Deserialize(SkStream*, SkFontDescriptor* result);
84 
85     void serialize(SkWStream*) const;
86 
getStyle()87     SkFontStyle getStyle() const { return fStyle; }
setStyle(SkFontStyle style)88     void setStyle(SkFontStyle style) { fStyle = style; }
89 
getFamilyName()90     const char* getFamilyName() const { return fFamilyName.c_str(); }
getFullName()91     const char* getFullName() const { return fFullName.c_str(); }
getPostscriptName()92     const char* getPostscriptName() const { return fPostscriptName.c_str(); }
93 
setFamilyName(const char * name)94     void setFamilyName(const char* name) { fFamilyName.set(name); }
setFullName(const char * name)95     void setFullName(const char* name) { fFullName.set(name); }
setPostscriptName(const char * name)96     void setPostscriptName(const char* name) { fPostscriptName.set(name); }
97 
hasStream()98     bool hasStream() const { return bool(fStream); }
dupStream()99     std::unique_ptr<SkStreamAsset> dupStream() const { return fStream->duplicate(); }
getCollectionIndex()100     int getCollectionIndex() const { return fCollectionIndex; }
getPaletteIndex()101     int getPaletteIndex() const { return fPaletteIndex; }
getVariationCoordinateCount()102     int getVariationCoordinateCount() const { return fCoordinateCount; }
getVariation()103     const SkFontArguments::VariationPosition::Coordinate* getVariation() const {
104         return fVariation.get();
105     }
getPaletteEntryOverrideCount()106     int getPaletteEntryOverrideCount() const { return fPaletteEntryOverrideCount; }
getPaletteEntryOverrides()107     const SkFontArguments::Palette::Override* getPaletteEntryOverrides() {
108         return fPaletteEntryOverrides.get();
109     }
110 
detachStream()111     std::unique_ptr<SkStreamAsset> detachStream() { return std::move(fStream); }
setStream(std::unique_ptr<SkStreamAsset> stream)112     void setStream(std::unique_ptr<SkStreamAsset> stream) { fStream = std::move(stream); }
setCollectionIndex(int collectionIndex)113     void setCollectionIndex(int collectionIndex) { fCollectionIndex = collectionIndex; }
setPaleteIndex(int paletteIndex)114     void setPaleteIndex(int paletteIndex) { fPaletteIndex = paletteIndex; }
setVariationCoordinates(int coordinateCount)115     SkFontArguments::VariationPosition::Coordinate* setVariationCoordinates(int coordinateCount) {
116         fCoordinateCount = coordinateCount;
117         return fVariation.reset(coordinateCount);
118     }
setPaletteEntryOverrides(int paletteEntryOverrideCount)119     SkFontArguments::Palette::Override* setPaletteEntryOverrides(int paletteEntryOverrideCount) {
120         fPaletteEntryOverrideCount = paletteEntryOverrideCount;
121         return fPaletteEntryOverrides.reset(paletteEntryOverrideCount);
122     }
123 
124     static SkFontStyle::Width SkFontStyleWidthForWidthAxisValue(SkScalar width);
125 
126 private:
127     SkString fFamilyName;
128     SkString fFullName;
129     SkString fPostscriptName;
130     SkFontStyle fStyle;
131 
132     std::unique_ptr<SkStreamAsset> fStream;
133     int fCollectionIndex = 0;
134     using Coordinates = SkAutoSTMalloc<4, SkFontArguments::VariationPosition::Coordinate>;
135     int fCoordinateCount = 0;
136     Coordinates fVariation;
137     int fPaletteIndex = 0;
138     int fPaletteEntryOverrideCount = 0;
139     SkAutoTMalloc<SkFontArguments::Palette::Override> fPaletteEntryOverrides;
140 };
141 
142 #endif // SkFontDescriptor_DEFINED
143