19f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/* 29f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Copyright (C) 2012 The Android Open Source Project 39f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * 49f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 59f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * you may not use this file except in compliance with the License. 69f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * You may obtain a copy of the License at 79f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * 89f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 99f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * 109f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Unless required by applicable law or agreed to in writing, software 119f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 129f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * See the License for the specific language governing permissions and 149f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * limitations under the License. 159f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 169f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 179f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#ifndef ANDROID_HWUI_FONT_H 189f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#define ANDROID_HWUI_FONT_H 199f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 209f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <utils/KeyedVector.h> 219f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 225e49b497ae2019586937aae0e8159292363728b5Leon Scroggins III#include <SkGlyphCache.h> 239f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkScalerContext.h> 249f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPaint.h> 259f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPathMeasure.h> 269f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 279f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include "CachedGlyphInfo.h" 289f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include "../Rect.h" 29e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy#include "../Matrix.h" 309f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 319f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace android { 329f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace uirenderer { 339f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 349f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/////////////////////////////////////////////////////////////////////////////// 359f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy// Font 369f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/////////////////////////////////////////////////////////////////////////////// 379f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 389f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyclass FontRenderer; 399f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 409f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/** 419f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Represents a font, defined by a Skia font id and a font size. A font is used 429f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * to generate glyphs and cache them in the FontState. 439f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 449f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyclass Font { 459f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guypublic: 469f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy enum Style { 479f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy kFakeBold = 1 489f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy }; 499f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 50e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy struct FontDescription { 51e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy FontDescription(const SkPaint* paint, const mat4& matrix); 529f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 53e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy static int compare(const FontDescription& lhs, const FontDescription& rhs); 549f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 55e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy hash_t hash() const; 56e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 57e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy bool operator==(const FontDescription& other) const { 58e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return compare(*this, other) == 0; 59e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 60e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 61e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy bool operator!=(const FontDescription& other) const { 62e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return compare(*this, other) != 0; 63e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 64e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 65e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy SkFontID mFontId; 66e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mFontSize; 67e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy int mFlags; 68e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mItalicStyle; 69e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mScaleX; 70e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy uint8_t mStyle; 71e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mStrokeWidth; 72b969a0de65730b071d846f8302e751e2637e6dbeRomain Guy bool mAntiAliasing; 732d5945e88731787babce1061f44cd54f02eeefc5Romain Guy uint8_t mHinting; 74c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy SkMatrix mLookupTransform; 75874f5c6e4ac655b4f118074c90d51e6a44abe50cRomain Guy SkMatrix mInverseLookupTransform; 76e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy }; 77e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 78e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy ~Font(); 79e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 80e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len, 819f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, int x, int y, const float* positions); 829f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 83e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len, 849f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, SkPath* path, float hOffset, float vOffset); 859f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 86e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy const Font::FontDescription& getDescription() const { 87e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return mDescription; 88e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 89e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 909f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy /** 919f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Creates a new font associated with the specified font state. 929f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 93e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy static Font* create(FontRenderer* state, const SkPaint* paint, const mat4& matrix); 949f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 959f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyprivate: 969f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy friend class FontRenderer; 97e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 98e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy Font(FontRenderer* state, const Font::FontDescription& desc); 99e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 1009f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*, 1019f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t, uint32_t, Rect*, const float*); 1029f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1039f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy enum RenderMode { 1049f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy FRAMEBUFFER, 1059f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy BITMAP, 1069f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy MEASURE, 1079f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy }; 1089f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1099f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void precache(SkPaint* paint, const char* text, int numGlyphs); 1109f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1119f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len, 1129f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap, 1139f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions); 1149f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1159f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len, 1169f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, Rect *bounds, const float* positions); 1179f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1188087246d9964b11de8ce116bc63b156faa4197e0Romain Guy void invalidateTextureCache(CacheTexture* cacheTexture = NULL); 1199f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1209f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy CachedGlyphInfo* cacheGlyph(SkPaint* paint, glyph_t glyph, bool precaching); 1215e49b497ae2019586937aae0e8159292363728b5Leon Scroggins III void updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, SkGlyphCache* skiaGlyphCache, 1225e49b497ae2019586937aae0e8159292363728b5Leon Scroggins III CachedGlyphInfo* glyph, bool precaching); 1239f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1249f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 1259f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1269f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 1279f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 1289f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1299f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 130624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy void drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y, 131a4adcf0239039eb8f005be252409901c41b28839Romain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 132a4adcf0239039eb8f005be252409901c41b28839Romain Guy Rect* bounds, const float* pos); 1339f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, 1349f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1359f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 1369f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset, 1379f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy SkPathMeasure& measure, SkPoint* position, SkVector* tangent); 1389f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1399f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy CachedGlyphInfo* getCachedGlyph(SkPaint* paint, glyph_t textUnit, bool precaching = false); 1409f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1419f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy FontRenderer* mState; 142e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy FontDescription mDescription; 143e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 144e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy // Cache of glyphs 145e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs; 146c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy 147624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy bool mIdentityTransform; 1489f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; 1499f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 150e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline int strictly_order_type(const Font::FontDescription& lhs, 151e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy const Font::FontDescription& rhs) { 152e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return Font::FontDescription::compare(lhs, rhs) < 0; 153e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy} 154e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 155e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) { 156e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return Font::FontDescription::compare(lhs, rhs); 157e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy} 158e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 159e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline hash_t hash_type(const Font::FontDescription& entry) { 160e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return entry.hash(); 161e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy} 162e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 1639f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace uirenderer 1649f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace android 1659f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1669f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#endif // ANDROID_HWUI_FONT_H 167