Home | History | Annotate | Download | only in ports
      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 
     29 class SkScalerContext_FreeType_Base : public SkScalerContext {
     30 protected:
     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 
     42 private:
     43     typedef SkScalerContext INHERITED;
     44 };
     45 
     46 class SkTypeface_FreeType : public SkTypeface {
     47 public:
     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 
     54 protected:
     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 
     79 private:
     80     mutable int fGlyphCount;
     81 
     82     typedef SkTypeface INHERITED;
     83 };
     84 
     85 #endif // SKFONTHOST_FREETYPE_COMMON_H_
     86