1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_HWUI_FONT_H 18 #define ANDROID_HWUI_FONT_H 19 20 #include <vector> 21 22 #include <utils/KeyedVector.h> 23 24 #include <SkScalar.h> 25 #include <SkPaint.h> 26 #include <SkPathMeasure.h> 27 #include <SkTypeface.h> 28 29 #include "FontUtil.h" 30 #include "../Rect.h" 31 #include "../Matrix.h" 32 33 class SkGlyphCache; 34 35 namespace android { 36 namespace uirenderer { 37 38 /////////////////////////////////////////////////////////////////////////////// 39 // Font 40 /////////////////////////////////////////////////////////////////////////////// 41 42 struct CachedGlyphInfo; 43 class CacheTexture; 44 class FontRenderer; 45 46 /** 47 * Represents a font, defined by a Skia font id and a font size. A font is used 48 * to generate glyphs and cache them in the FontState. 49 */ 50 class Font { 51 public: 52 enum Style { 53 kFakeBold = 1 54 }; 55 56 struct FontDescription { 57 FontDescription(const SkPaint* paint, const SkMatrix& matrix); 58 59 static int compare(const FontDescription& lhs, const FontDescription& rhs); 60 61 hash_t hash() const; 62 63 bool operator==(const FontDescription& other) const { 64 return compare(*this, other) == 0; 65 } 66 67 bool operator!=(const FontDescription& other) const { 68 return compare(*this, other) != 0; 69 } 70 71 SkFontID mFontId; 72 float mFontSize; 73 int mFlags; 74 float mItalicStyle; 75 float mScaleX; 76 uint8_t mStyle; 77 float mStrokeWidth; 78 bool mAntiAliasing; 79 uint8_t mHinting; 80 SkMatrix mLookupTransform; 81 SkMatrix mInverseLookupTransform; 82 }; 83 84 ~Font(); 85 86 void render(const SkPaint* paint, const glyph_t* glyphs, 87 int numGlyphs, int x, int y, const float* positions); 88 89 void render(const SkPaint* paint, const glyph_t* glyphs, 90 int numGlyphs, const SkPath* path, float hOffset, float vOffset); 91 92 const Font::FontDescription& getDescription() const { 93 return mDescription; 94 } 95 96 /** 97 * Creates a new font associated with the specified font state. 98 */ 99 static Font* create(FontRenderer* state, const SkPaint* paint, const SkMatrix& matrix); 100 101 private: 102 friend class FontRenderer; 103 104 Font(FontRenderer* state, const Font::FontDescription& desc); 105 106 typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*, 107 uint32_t, uint32_t, Rect*, const float*); 108 109 enum RenderMode { 110 FRAMEBUFFER, 111 BITMAP, 112 MEASURE, 113 }; 114 115 void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs); 116 117 void render(const SkPaint* paint, const glyph_t* glyphs, 118 int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap, 119 uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions); 120 121 void measure(const SkPaint* paint, const glyph_t* glyphs, 122 int numGlyphs, Rect *bounds, const float* positions); 123 124 void invalidateTextureCache(CacheTexture* cacheTexture = nullptr); 125 126 CachedGlyphInfo* cacheGlyph(const SkPaint* paint, glyph_t glyph, bool precaching); 127 void updateGlyphCache(const SkPaint* paint, const SkGlyph& skiaGlyph, 128 SkGlyphCache* skiaGlyphCache, CachedGlyphInfo* glyph, bool precaching); 129 130 void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 131 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 132 Rect* bounds, const float* pos); 133 void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 134 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 135 Rect* bounds, const float* pos); 136 void drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y, 137 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 138 Rect* bounds, const float* pos); 139 void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, 140 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 141 Rect* bounds, const float* pos); 142 void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset, 143 SkPathMeasure& measure, SkPoint* position, SkVector* tangent); 144 145 CachedGlyphInfo* getCachedGlyph(const SkPaint* paint, glyph_t textUnit, 146 bool precaching = false); 147 148 FontRenderer* mState; 149 FontDescription mDescription; 150 151 // Cache of glyphs 152 DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs; 153 154 bool mIdentityTransform; 155 }; 156 157 inline int strictly_order_type(const Font::FontDescription& lhs, 158 const Font::FontDescription& rhs) { 159 return Font::FontDescription::compare(lhs, rhs) < 0; 160 } 161 162 inline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) { 163 return Font::FontDescription::compare(lhs, rhs); 164 } 165 166 inline hash_t hash_type(const Font::FontDescription& entry) { 167 return entry.hash(); 168 } 169 170 }; // namespace uirenderer 171 }; // namespace android 172 173 #endif // ANDROID_HWUI_FONT_H 174