1c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com/*
2c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com * Copyright 2006-2012 The Android Open Source Project
3c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com * Copyright 2012 Mozilla Foundation
4c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com *
5c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com * Use of this source code is governed by a BSD-style license that can be
6c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com * found in the LICENSE file.
7c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com */
8c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com
9c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com#ifndef SKFONTHOST_FREETYPE_COMMON_H_
10c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com#define SKFONTHOST_FREETYPE_COMMON_H_
11c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com
12c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com#include "SkGlyph.h"
131b24933e52f50773de29332387a12721811f3012mtklein#include "SkMutex.h"
14c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com#include "SkScalerContext.h"
150da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.com#include "SkTypeface.h"
1614df8339841f246a7337a8fb0d90f1b7ee689619bungeman#include "SkTypes.h"
170da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.com
18f6c7107d0385cc2b556802354b93b7dcff61570dbungeman#include "SkFontMgr.h"
19f6c7107d0385cc2b556802354b93b7dcff61570dbungeman
20fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagner// These are forward declared to avoid pimpl but also hide the FreeType implementation.
21fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagnertypedef struct FT_LibraryRec_* FT_Library;
22fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagnertypedef struct FT_FaceRec_* FT_Face;
23fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagnertypedef struct FT_StreamRec_* FT_Stream;
24fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagnertypedef signed long FT_Pos;
25c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com
262bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary
272bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary#ifdef SK_DEBUG
282bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canaryconst char* SkTraceFtrGetError(int);
292bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary#define SK_TRACEFTR(ERR, MSG, ...) \
302bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary    SkDebugf("%s:%lu:1: error: 0x%x '%s' " MSG "\n", __FILE__, __LINE__, ERR, \
312bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary            SkTraceFtrGetError((int)(ERR)), __VA_ARGS__)
322bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary#else
332bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary#define SK_TRACEFTR(ERR, ...) do { sk_ignore_unused_variable(ERR); } while (false)
342bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary#endif
352bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary
362bcd8431626814671f141f336fa7a3f8d78b4fe4Hal Canary
37c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.comclass SkScalerContext_FreeType_Base : public SkScalerContext {
380da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.comprotected:
39c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com    // See http://freetype.sourceforge.net/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden
40c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com    // This value was chosen by eyeballing the result in Firefox and trying to match it.
41c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com    static const FT_Pos kBitmapEmboldenStrength = 1 << 6;
4201c34ee59906f729f6ca7d35f0c0e5e2f5e693feskia.committer@gmail.com
437cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman    SkScalerContext_FreeType_Base(sk_sp<SkTypeface> typeface, const SkScalerContextEffects& effects,
44a9322c2d86aaef1085c267dfc43cf0747f170a86reed                                  const SkDescriptor *desc)
457cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman        : INHERITED(std::move(typeface), effects, desc)
46c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com    {}
4701c34ee59906f729f6ca7d35f0c0e5e2f5e693feskia.committer@gmail.com
48401ae2d2a0c3f60129e689b922a070e7c367959cbungeman    void generateGlyphImage(FT_Face face, const SkGlyph& glyph, const SkMatrix& bitmapTransform);
4966a58aca8379a33ccc7572a31c74a3334d08b47csugoi@google.com    void generateGlyphPath(FT_Face face, SkPath* path);
500da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.comprivate:
510da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.com    typedef SkScalerContext INHERITED;
520da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.com};
530da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.com
540da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.comclass SkTypeface_FreeType : public SkTypeface {
553a21d61668e0ac6529f9930669dd47be123ec333bungemanpublic:
563a21d61668e0ac6529f9930669dd47be123ec333bungeman    /** For SkFontMgrs to make use of our ability to extract
573a21d61668e0ac6529f9930669dd47be123ec333bungeman     *  name and style from a stream, using FreeType's API.
583a21d61668e0ac6529f9930669dd47be123ec333bungeman     */
5914df8339841f246a7337a8fb0d90f1b7ee689619bungeman    class Scanner : ::SkNoncopyable {
6014df8339841f246a7337a8fb0d90f1b7ee689619bungeman    public:
6114df8339841f246a7337a8fb0d90f1b7ee689619bungeman        Scanner();
6214df8339841f246a7337a8fb0d90f1b7ee689619bungeman        ~Scanner();
6341868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        struct AxisDefinition {
6441868fe5625fc3bd70daa3f461c881b5db6a9265bungeman            SkFourByteTag fTag;
6541868fe5625fc3bd70daa3f461c881b5db6a9265bungeman            SkFixed fMinimum;
6641868fe5625fc3bd70daa3f461c881b5db6a9265bungeman            SkFixed fDefault;
6741868fe5625fc3bd70daa3f461c881b5db6a9265bungeman            SkFixed fMaximum;
6841868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        };
6941868fe5625fc3bd70daa3f461c881b5db6a9265bungeman        using AxisDefinitions = SkSTArray<4, AxisDefinition, true>;
70f93d71122e4fcfcdc674a0163455990b13855f2fbungeman        bool recognizedFont(SkStreamAsset* stream, int* numFonts) const;
71f93d71122e4fcfcdc674a0163455990b13855f2fbungeman        bool scanFont(SkStreamAsset* stream, int ttcIndex,
7241868fe5625fc3bd70daa3f461c881b5db6a9265bungeman                      SkString* name, SkFontStyle* style, bool* isFixedPitch,
7341868fe5625fc3bd70daa3f461c881b5db6a9265bungeman                      AxisDefinitions* axes) const;
74f6c7107d0385cc2b556802354b93b7dcff61570dbungeman        static void computeAxisValues(
75f6c7107d0385cc2b556802354b93b7dcff61570dbungeman            AxisDefinitions axisDefinitions,
76fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagner            const SkFontArguments::VariationPosition position,
77f6c7107d0385cc2b556802354b93b7dcff61570dbungeman            SkFixed* axisValues,
78f6c7107d0385cc2b556802354b93b7dcff61570dbungeman            const SkString& name);
79f6c7107d0385cc2b556802354b93b7dcff61570dbungeman
8014df8339841f246a7337a8fb0d90f1b7ee689619bungeman    private:
81f93d71122e4fcfcdc674a0163455990b13855f2fbungeman        FT_Face openFace(SkStreamAsset* stream, int ttcIndex, FT_Stream ftStream) const;
8214df8339841f246a7337a8fb0d90f1b7ee689619bungeman        FT_Library fLibrary;
8314df8339841f246a7337a8fb0d90f1b7ee689619bungeman        mutable SkMutex fLibraryMutex;
8414df8339841f246a7337a8fb0d90f1b7ee689619bungeman    };
853a21d61668e0ac6529f9930669dd47be123ec333bungeman
860da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.comprotected:
87e3aea10428d1597838fd563c92340beaf969a9b4bungeman    SkTypeface_FreeType(const SkFontStyle& style, bool isFixedPitch)
88e3aea10428d1597838fd563c92340beaf969a9b4bungeman        : INHERITED(style, isFixedPitch)
89b4162b12b1e8e38c48b328f819c97199a0825d2breed@google.com    {}
900da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.com
91a9322c2d86aaef1085c267dfc43cf0747f170a86reed    virtual SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&,
92a9322c2d86aaef1085c267dfc43cf0747f170a86reed                                                   const SkDescriptor*) const override;
9336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onFilterRec(SkScalerContextRec*) const override;
94209e4b1b70a5e9c2f504de15f038999ed9ee4ae5Hal Canary    std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override;
9536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int onGetUPEM() const override;
967cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman    bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count,
977cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman                                     int32_t adjustments[]) const override;
987cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman    int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[],
997cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman                        int glyphCount) const override;
10036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int onCountGlyphs() const override;
101b4162b12b1e8e38c48b328f819c97199a0825d2breed@google.com
10236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    LocalizedStrings* onCreateFamilyNameIterator() const override;
103a980269c2498836101146adc729ef780fb89824ebungeman@google.com
104fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagner    int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
105fc497343cbcbd526f77da913ae2feca0e1b1b866Ben Wagner                                     int coordinateCount) const override;
10636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int onGetTableTags(SkFontTableTag tags[]) const override;
1077cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman    size_t onGetTableData(SkFontTableTag, size_t offset,
1087cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman                          size_t length, void* data) const override;
109ddc218e508c4cdd16ff3461498cbbc2b5189b2bebungeman@google.com
1100da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.comprivate:
1110da48618a758ef46c2174bdc1eaeb6dd8a693a2ereed@google.com    typedef SkTypeface INHERITED;
112c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com};
113c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com
114c59b5dac9081e3613ed80d8b6d498e093c03eb87george@mozilla.com#endif // SKFONTHOST_FREETYPE_COMMON_H_
115