1/*
2 * Copyright 2006-2012 The Android Open Source Project
3 * Copyright 2012 Mozilla Foundation
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef SKFONTHOST_FREETYPE_COMMON_H_
10#define SKFONTHOST_FREETYPE_COMMON_H_
11
12#include "SkGlyph.h"
13#include "SkScalerContext.h"
14#include "SkTypeface.h"
15
16#include <ft2build.h>
17#include FT_FREETYPE_H
18
19#ifdef SK_DEBUG
20    #define SkASSERT_CONTINUE(pred)                                                         \
21        do {                                                                                \
22            if (!(pred))                                                                    \
23                SkDebugf("file %s:%d: assert failed '" #pred "'\n", __FILE__, __LINE__);    \
24        } while (false)
25#else
26    #define SkASSERT_CONTINUE(pred)
27#endif
28
29class SkScalerContext_FreeType_Base : public SkScalerContext {
30protected:
31    // See http://freetype.sourceforge.net/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden
32    // This value was chosen by eyeballing the result in Firefox and trying to match it.
33    static const FT_Pos kBitmapEmboldenStrength = 1 << 6;
34
35    SkScalerContext_FreeType_Base(SkTypeface* typeface, const SkDescriptor *desc)
36    : INHERITED(typeface, desc)
37    {}
38
39    void generateGlyphImage(FT_Face face, const SkGlyph& glyph);
40    void generateGlyphPath(FT_Face face, SkPath* path);
41
42private:
43    typedef SkScalerContext INHERITED;
44};
45
46class SkTypeface_FreeType : public SkTypeface {
47public:
48    /** For SkFontMgrs to make use of our ability to extract
49     *  name and style from a stream, using FreeType's API.
50     */
51    static bool ScanFont(SkStream* stream, int ttcIndex,
52                         SkString* name, SkTypeface::Style* style, bool* isFixedPitch);
53
54protected:
55    SkTypeface_FreeType(Style style, SkFontID uniqueID, bool isFixedPitch)
56        : INHERITED(style, uniqueID, isFixedPitch)
57        , fGlyphCount(-1)
58    {}
59
60    virtual SkScalerContext* onCreateScalerContext(
61                                        const SkDescriptor*) const SK_OVERRIDE;
62    virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE;
63    virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics(
64                                SkAdvancedTypefaceMetrics::PerGlyphInfo,
65                                const uint32_t*, uint32_t) const SK_OVERRIDE;
66    virtual int onGetUPEM() const SK_OVERRIDE;
67    virtual bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count,
68                                       int32_t adjustments[]) const SK_OVERRIDE;
69    virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[],
70                                int glyphCount) const SK_OVERRIDE;
71    virtual int onCountGlyphs() const SK_OVERRIDE;
72
73    virtual LocalizedStrings* onCreateFamilyNameIterator() const SK_OVERRIDE;
74
75    virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE;
76    virtual size_t onGetTableData(SkFontTableTag, size_t offset,
77                                  size_t length, void* data) const SK_OVERRIDE;
78
79private:
80    mutable int fGlyphCount;
81
82    typedef SkTypeface INHERITED;
83};
84
85#endif // SKFONTHOST_FREETYPE_COMMON_H_
86