/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkAdvancedTypefaceMetrics_DEFINED #define SkAdvancedTypefaceMetrics_DEFINED #include "SkRect.h" #include "SkRefCnt.h" #include "SkString.h" #include "SkTDArray.h" #include "SkTemplates.h" #include "SkSinglyLinkedList.h" /** \class SkAdvancedTypefaceMetrics The SkAdvancedTypefaceMetrics class is used by the PDF backend to correctly embed typefaces. This class is created and filled in with information by SkTypeface::getAdvancedTypefaceMetrics. */ class SkAdvancedTypefaceMetrics : public SkRefCnt { public: SkAdvancedTypefaceMetrics() : fType(SkAdvancedTypefaceMetrics::kOther_Font) , fFlags(SkAdvancedTypefaceMetrics::kEmpty_FontFlag) , fLastGlyphID(0) , fEmSize(0) , fStyle(0) , fItalicAngle(0) , fAscent(0) , fDescent(0) , fStemV(0) , fCapHeight(0) , fBBox(SkIRect::MakeEmpty()) {} ~SkAdvancedTypefaceMetrics(); /** Retrieve advance data for glyphs. Used by the PDF backend. It calls underlying platform dependent API getAdvance to acquire the data. @param num_glyphs Total number of glyphs in the given font. @param glyphIDs For per-glyph info, specify subset of the font by giving glyph ids. Each integer represents a glyph id. Passing nullptr means all glyphs in the font. @param glyphIDsCount Number of elements in subsetGlyphIds. Ignored if glyphIDs is nullptr. @param getAdvance A function that takes a glyph id and passes back advance data from the typeface. Returns false on failure. */ typedef std::function GetAdvance; void setGlyphWidths(int num_glyphs, const uint32_t* subsetGlyphIDs, uint32_t subsetGlyphIDsLength, GetAdvance getAdvance); SkString fFontName; enum FontType { kType1_Font, kType1CID_Font, kCFF_Font, kTrueType_Font, kOther_Font, }; // The type of the underlying font program. This field determines which // of the following fields are valid. If it is kOther_Font the per glyph // information will never be populated. FontType fType; enum FontFlags { kEmpty_FontFlag = 0x0, //! struct AdvanceMetric { enum MetricType { kDefault, // Default advance: fAdvance.count = 1 kRange, // Advances for a range: fAdvance.count = fEndID-fStartID kRun // fStartID-fEndID have same advance: fAdvance.count = 1 }; MetricType fType; uint16_t fStartId; uint16_t fEndId; SkTDArray fAdvance; AdvanceMetric(uint16_t startId) : fStartId(startId) {} AdvanceMetric(AdvanceMetric&& other) : fType(other.fType) , fStartId(other.fStartId) , fEndId(other.fEndId) { fAdvance.swap(other.fAdvance); } AdvanceMetric& operator=(AdvanceMetric&& other) { fType = other.fType; fStartId = other.fStartId; fEndId = other.fEndId; fAdvance.swap(other.fAdvance); return *this; } AdvanceMetric(const AdvanceMetric&) = delete; AdvanceMetric& operator=(const AdvanceMetric&) = delete; }; struct VerticalMetric { int16_t fVerticalAdvance; int16_t fOriginXDisp; // Horiz. displacement of the secondary origin. int16_t fOriginYDisp; // Vert. displacement of the secondary origin. }; typedef AdvanceMetric WidthRange; typedef AdvanceMetric VerticalAdvanceRange; // This is indexed by glyph id. SkSinglyLinkedList fGlyphWidths; // Only used for Vertical CID fonts. SkSinglyLinkedList fVerticalMetrics; // The names of each glyph, only populated for postscript fonts. SkAutoTDelete > fGlyphNames; // The mapping from glyph to Unicode, only populated if // kToUnicode_PerGlyphInfo is passed to GetAdvancedTypefaceMetrics. SkTDArray fGlyphToUnicode; static void FinishRange(WidthRange* range, int endId, WidthRange::MetricType type); private: typedef SkRefCnt INHERITED; }; #endif