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