1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 22a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 42a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 72a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org */ 82a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 10c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org#ifndef SkAdvancedTypefaceMetrics_DEFINED 11c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org#define SkAdvancedTypefaceMetrics_DEFINED 122a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 132a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org#include "SkRect.h" 142a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org#include "SkRefCnt.h" 152a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org#include "SkString.h" 162a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org#include "SkTDArray.h" 172a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org#include "SkTemplates.h" 182a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 19c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org/** \class SkAdvancedTypefaceMetrics 202a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 21c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org The SkAdvancedTypefaceMetrics class is used by the PDF backend to correctly 22c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org embed typefaces. This class is filled in with information about a given 23c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org typeface by the SkFontHost class. 242a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org*/ 252a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 26c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.orgclass SkAdvancedTypefaceMetrics : public SkRefCnt { 272a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.orgpublic: 2815e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com SK_DECLARE_INST_COUNT(SkAdvancedTypefaceMetrics) 2915e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com 30c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org SkString fFontName; 31c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org 322a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org enum FontType { 332a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org kType1_Font, 342a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org kType1CID_Font, 352a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org kCFF_Font, 362a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org kTrueType_Font, 372a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org kOther_Font, 382a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org }; 392a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org // The type of the underlying font program. This field determines which 400f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo // of the following fields are valid. If it is kOther_Font the per glyph 410f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo // information will never be populated. 422a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org FontType fType; 432a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 440f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo enum FontFlags { 450f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo kEmpty_FontFlag = 0x0, //!<No flags set 460f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo kMultiMaster_FontFlag = 0x1, //!<May be true for Type1 or CFF fonts. 470f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo kNotEmbeddable_FontFlag = 0x2, //!<May not be embedded. 480f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo kNotSubsettable_FontFlag = 0x4, //!<May not be subset. 490f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo }; 500f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo // Global font flags. 510f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo FontFlags fFlags; 520f9bad01b0e7ad592ffb342dcf1d238b15329be1vandebo 53c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org uint16_t fLastGlyphID; // The last valid glyph ID in the font. 54c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org uint16_t fEmSize; // The size of the em box (defines font units). 552a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 56c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org // These enum values match the values used in the PDF file format. 57c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org enum StyleFlags { 58c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org kFixedPitch_Style = 0x00001, 59c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org kSerif_Style = 0x00002, 60c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org kScript_Style = 0x00008, 61c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org kItalic_Style = 0x00040, 62c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org kAllCaps_Style = 0x10000, 63c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org kSmallCaps_Style = 0x20000, 641f90287df3129cb267422e482c52ebeca6a8990ftomhudson@google.com kForceBold_Style = 0x40000 65c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org }; 66c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org uint16_t fStyle; // Font style characteristics. 67c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fItalicAngle; // Counterclockwise degrees from vertical of the 68c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org // dominant vertical stroke for an Italic face. 69c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org // The following fields are all in font units. 70c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fAscent; // Max height above baseline, not including accents. 71c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fDescent; // Max depth below baseline (negative). 72c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fStemV; // Thickness of dominant vertical stem. 73c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fCapHeight; // Height (from baseline) of top of flat capitals. 74c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org 75c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org SkIRect fBBox; // The bounding box of all glyphs (in font units). 762a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 77325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org // The type of advance data wanted. 78325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org enum PerGlyphInfo { 79325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org kNo_PerGlyphInfo = 0x0, // Don't populate any per glyph info. 80325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org kHAdvance_PerGlyphInfo = 0x1, // Populate horizontal advance data. 81325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org kVAdvance_PerGlyphInfo = 0x2, // Populate vertical advance data. 82325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org kGlyphNames_PerGlyphInfo = 0x4, // Populate glyph names (Type 1 only). 831f90287df3129cb267422e482c52ebeca6a8990ftomhudson@google.com kToUnicode_PerGlyphInfo = 0x8 // Populate ToUnicode table, ignored 846744d498fcbbbcf503ec80c4d43dd8f118a88597vandebo@chromium.org // for Type 1 fonts 85325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org }; 86325cb9aa17b94258b362082eb3a799524f4345f3vandebo@chromium.org 872a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org template <typename Data> 882a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org struct AdvanceMetric { 892a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org enum MetricType { 902a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org kDefault, // Default advance: fAdvance.count = 1 912a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org kRange, // Advances for a range: fAdvance.count = fEndID-fStartID 921f90287df3129cb267422e482c52ebeca6a8990ftomhudson@google.com kRun // fStartID-fEndID have same advance: fAdvance.count = 1 932a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org }; 942a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org MetricType fType; 95c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org uint16_t fStartId; 96c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org uint16_t fEndId; 972a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org SkTDArray<Data> fAdvance; 98e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<AdvanceMetric<Data> > fNext; 992a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org }; 1002a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 1012a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org struct VerticalMetric { 102c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fVerticalAdvance; 103c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fOriginXDisp; // Horiz. displacement of the secondary origin. 104c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org int16_t fOriginYDisp; // Vert. displacement of the secondary origin. 1052a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org }; 106c48b2b330f8bf0e01381e27ca36f48ef5c7d8d5fvandebo@chromium.org typedef AdvanceMetric<int16_t> WidthRange; 1072a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org typedef AdvanceMetric<VerticalMetric> VerticalAdvanceRange; 1082a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 1092a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org // This is indexed by glyph id. 110e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<WidthRange> fGlyphWidths; 1112a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org // Only used for Vertical CID fonts. 112e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<VerticalAdvanceRange> fVerticalMetrics; 1132a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 1142a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org // The names of each glyph, only populated for postscript fonts. 115e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<SkAutoTArray<SkString> > fGlyphNames; 1166744d498fcbbbcf503ec80c4d43dd8f118a88597vandebo@chromium.org 1176744d498fcbbbcf503ec80c4d43dd8f118a88597vandebo@chromium.org // The mapping from glyph to Unicode, only populated if 1186744d498fcbbbcf503ec80c4d43dd8f118a88597vandebo@chromium.org // kToUnicode_PerGlyphInfo is passed to GetAdvancedTypefaceMetrics. 1196744d498fcbbbcf503ec80c4d43dd8f118a88597vandebo@chromium.org SkTDArray<SkUnichar> fGlyphToUnicode; 12015e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com 12115e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.comprivate: 12215e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com typedef SkRefCnt INHERITED; 1232a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org}; 1242a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org 1256f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgnamespace skia_advanced_typeface_metrics_utils { 1266f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org 1276f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgtemplate <typename Data> 1286f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgvoid resetRange(SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range, 1296f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org int startId); 1306f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org 1316f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgtemplate <typename Data> 1326f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgSkAdvancedTypefaceMetrics::AdvanceMetric<Data>* appendRange( 133e02944075840d672bd1797f3d945ff82d302282fcommit-bot@chromium.org SkAutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> >* nextSlot, 1346f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org int startId); 1356f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org 1366f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgtemplate <typename Data> 1376f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgvoid finishRange( 1386f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range, 1396f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org int endId, 1406f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org typename SkAdvancedTypefaceMetrics::AdvanceMetric<Data>::MetricType 1416f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org type); 1426f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org 14337ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org/** Retrieve advance data for glyphs. Used by the PDF backend. It calls 14437ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org underlying platform dependent API getAdvance to acquire the data. 14537ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org @param num_glyphs Total number of glyphs in the given font. 14637ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org @param glyphIDs For per-glyph info, specify subset of the font by 14737ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org giving glyph ids. Each integer represents a glyph 14837ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org id. Passing NULL means all glyphs in the font. 14937ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org @param glyphIDsCount Number of elements in subsetGlyphIds. Ignored if 15037ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org glyphIDs is NULL. 15137ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org*/ 1526f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgtemplate <typename Data, typename FontHandle> 1536f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.orgSkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( 1546f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org FontHandle fontHandle, 1556f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org int num_glyphs, 15637ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org const uint32_t* glyphIDs, 15737ad8fb72ff1b3faac93b01ead2c79e1a06fc172vandebo@chromium.org uint32_t glyphIDsCount, 1586f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org bool (*getAdvance)(FontHandle fontHandle, int gId, Data* data)); 1596f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org 1606f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org} // namespace skia_advanced_typeface_metrics_utils 1616f72d1eacd66d2a9c0059962a75c0ca6a99ff98evandebo@chromium.org 1622a22e10ab2946c5590cd2a258427ce3ccfca9bfavandebo@chromium.org#endif 163