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 <utils/KeyedVector.h> 21 22 #include <SkScalerContext.h> 23 #include <SkPaint.h> 24 #include <SkPathMeasure.h> 25 26 #include "CachedGlyphInfo.h" 27 #include "../Rect.h" 28 #include "../Matrix.h" 29 30 namespace android { 31 namespace uirenderer { 32 33 /////////////////////////////////////////////////////////////////////////////// 34 // Font 35 /////////////////////////////////////////////////////////////////////////////// 36 37 class FontRenderer; 38 39 /** 40 * Represents a font, defined by a Skia font id and a font size. A font is used 41 * to generate glyphs and cache them in the FontState. 42 */ 43 class Font { 44 public: 45 enum Style { 46 kFakeBold = 1 47 }; 48 49 struct FontDescription { 50 FontDescription(const SkPaint* paint, const mat4& matrix); 51 52 static int compare(const FontDescription& lhs, const FontDescription& rhs); 53 54 hash_t hash() const; 55 56 bool operator==(const FontDescription& other) const { 57 return compare(*this, other) == 0; 58 } 59 60 bool operator!=(const FontDescription& other) const { 61 return compare(*this, other) != 0; 62 } 63 64 SkFontID mFontId; 65 float mFontSize; 66 int mFlags; 67 float mItalicStyle; 68 float mScaleX; 69 uint8_t mStyle; 70 float mStrokeWidth; 71 bool mAntiAliasing; 72 uint8_t mHinting; 73 SkMatrix mLookupTransform; 74 SkMatrix mInverseLookupTransform; 75 }; 76 77 ~Font(); 78 79 void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len, 80 int numGlyphs, int x, int y, const float* positions); 81 82 void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len, 83 int numGlyphs, SkPath* path, float hOffset, float vOffset); 84 85 const Font::FontDescription& getDescription() const { 86 return mDescription; 87 } 88 89 /** 90 * Creates a new font associated with the specified font state. 91 */ 92 static Font* create(FontRenderer* state, const SkPaint* paint, const mat4& matrix); 93 94 private: 95 friend class FontRenderer; 96 97 Font(FontRenderer* state, const Font::FontDescription& desc); 98 99 typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*, 100 uint32_t, uint32_t, Rect*, const float*); 101 102 enum RenderMode { 103 FRAMEBUFFER, 104 BITMAP, 105 MEASURE, 106 }; 107 108 void precache(SkPaint* paint, const char* text, int numGlyphs); 109 110 void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len, 111 int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap, 112 uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions); 113 114 void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len, 115 int numGlyphs, Rect *bounds, const float* positions); 116 117 void invalidateTextureCache(CacheTexture* cacheTexture = NULL); 118 119 CachedGlyphInfo* cacheGlyph(SkPaint* paint, glyph_t glyph, bool precaching); 120 void updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyphInfo* glyph, 121 bool precaching); 122 123 void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 124 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 125 Rect* bounds, const float* pos); 126 void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 127 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 128 Rect* bounds, const float* pos); 129 void drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y, 130 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 131 Rect* bounds, const float* pos); 132 void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, 133 uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 134 Rect* bounds, const float* pos); 135 void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset, 136 SkPathMeasure& measure, SkPoint* position, SkVector* tangent); 137 138 CachedGlyphInfo* getCachedGlyph(SkPaint* paint, glyph_t textUnit, bool precaching = false); 139 140 FontRenderer* mState; 141 FontDescription mDescription; 142 143 // Cache of glyphs 144 DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs; 145 146 bool mIdentityTransform; 147 }; 148 149 inline int strictly_order_type(const Font::FontDescription& lhs, 150 const Font::FontDescription& rhs) { 151 return Font::FontDescription::compare(lhs, rhs) < 0; 152 } 153 154 inline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) { 155 return Font::FontDescription::compare(lhs, rhs); 156 } 157 158 inline hash_t hash_type(const Font::FontDescription& entry) { 159 return entry.hash(); 160 } 161 162 }; // namespace uirenderer 163 }; // namespace android 164 165 #endif // ANDROID_HWUI_FONT_H 166