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