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