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 2059744b79ec302000802cd56d30a1bf70f0183c80Chris Craik#include <vector> 2159744b79ec302000802cd56d30a1bf70f0183c80Chris Craik 229f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <utils/KeyedVector.h> 239f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 24b66270eac288de53207e55d10879b070a0ec8b6bVictoria Lease#include <SkScalar.h> 25b66270eac288de53207e55d10879b070a0ec8b6bVictoria Lease#include <SkDeviceProperties.h> 262ee2d59b7d10733e7e11e398d2316035d3b36c73Victoria Lease#include <SkGlyphCache.h> 279f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkScalerContext.h> 289f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPaint.h> 299f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPathMeasure.h> 309f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 319f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include "CachedGlyphInfo.h" 329f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include "../Rect.h" 33e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy#include "../Matrix.h" 349f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 359f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace android { 369f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace uirenderer { 379f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 389f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/////////////////////////////////////////////////////////////////////////////// 399f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy// Font 409f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/////////////////////////////////////////////////////////////////////////////// 419f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 429f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyclass FontRenderer; 439f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 449f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/** 459f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Represents a font, defined by a Skia font id and a font size. A font is used 469f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * to generate glyphs and cache them in the FontState. 479f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 489f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyclass Font { 499f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guypublic: 509f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy enum Style { 519f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy kFakeBold = 1 529f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy }; 539f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 54e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy struct FontDescription { 5559744b79ec302000802cd56d30a1bf70f0183c80Chris Craik FontDescription(const SkPaint* paint, const SkMatrix& matrix); 569f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 57e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy static int compare(const FontDescription& lhs, const FontDescription& rhs); 589f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 59e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy hash_t hash() const; 60e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 61e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy bool operator==(const FontDescription& other) const { 62e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return compare(*this, other) == 0; 63e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 64e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 65e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy bool operator!=(const FontDescription& other) const { 66e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return compare(*this, other) != 0; 67e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 68e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 69e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy SkFontID mFontId; 70e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mFontSize; 71e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy int mFlags; 72e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mItalicStyle; 73e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mScaleX; 74e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy uint8_t mStyle; 75e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy float mStrokeWidth; 76b969a0de65730b071d846f8302e751e2637e6dbeRomain Guy bool mAntiAliasing; 772d5945e88731787babce1061f44cd54f02eeefc5Romain Guy uint8_t mHinting; 78c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy SkMatrix mLookupTransform; 79874f5c6e4ac655b4f118074c90d51e6a44abe50cRomain Guy SkMatrix mInverseLookupTransform; 80e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy }; 81e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 82e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy ~Font(); 83e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 84d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void render(const SkPaint* paint, const char* text, uint32_t start, uint32_t len, 859f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, int x, int y, const float* positions); 869f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 87d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void render(const SkPaint* paint, const char* text, uint32_t start, uint32_t len, 88d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik int numGlyphs, const SkPath* path, float hOffset, float vOffset); 899f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 90e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy const Font::FontDescription& getDescription() const { 91e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return mDescription; 92e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy } 93e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 949f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy /** 959f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Creates a new font associated with the specified font state. 969f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 9759744b79ec302000802cd56d30a1bf70f0183c80Chris Craik static Font* create(FontRenderer* state, const SkPaint* paint, const SkMatrix& matrix); 989f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 999f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyprivate: 1009f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy friend class FontRenderer; 101e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 102e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy Font(FontRenderer* state, const Font::FontDescription& desc); 103e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 1049f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*, 1059f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t, uint32_t, Rect*, const float*); 1069f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1079f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy enum RenderMode { 1089f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy FRAMEBUFFER, 1099f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy BITMAP, 1109f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy MEASURE, 1119f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy }; 1129f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 113d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void precache(const SkPaint* paint, const char* text, int numGlyphs); 1149f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 115d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void render(const SkPaint* paint, const char *text, uint32_t start, uint32_t len, 1169f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap, 1179f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions); 1189f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 119d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void measure(const SkPaint* paint, const char* text, uint32_t start, uint32_t len, 1209f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, Rect *bounds, const float* positions); 1219f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1228087246d9964b11de8ce116bc63b156faa4197e0Romain Guy void invalidateTextureCache(CacheTexture* cacheTexture = NULL); 1239f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 124d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik CachedGlyphInfo* cacheGlyph(const SkPaint* paint, glyph_t glyph, bool precaching); 125d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void updateGlyphCache(const SkPaint* paint, const SkGlyph& skiaGlyph, 126d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik SkGlyphCache* skiaGlyphCache, CachedGlyphInfo* glyph, bool precaching); 1279f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1289f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 1299f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1309f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 1319f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 1329f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1339f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 134624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy void drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y, 135a4adcf0239039eb8f005be252409901c41b28839Romain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 136a4adcf0239039eb8f005be252409901c41b28839Romain Guy Rect* bounds, const float* pos); 1379f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, 1389f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1399f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 1409f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset, 1419f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy SkPathMeasure& measure, SkPoint* position, SkVector* tangent); 1429f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 143d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik CachedGlyphInfo* getCachedGlyph(const SkPaint* paint, glyph_t textUnit, 144d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik bool precaching = false); 1459f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1469f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy FontRenderer* mState; 147e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy FontDescription mDescription; 148e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 149e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy // Cache of glyphs 150e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs; 151c74f45a334f0e3725c23cdd270cbcb0efac4ea75Romain Guy 152624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy bool mIdentityTransform; 153b66270eac288de53207e55d10879b070a0ec8b6bVictoria Lease SkDeviceProperties mDeviceProperties; 1549f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; 1559f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 156e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline int strictly_order_type(const Font::FontDescription& lhs, 157e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy const Font::FontDescription& rhs) { 158e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return Font::FontDescription::compare(lhs, rhs) < 0; 159e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy} 160e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 161e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) { 162e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return Font::FontDescription::compare(lhs, rhs); 163e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy} 164e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 165e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline hash_t hash_type(const Font::FontDescription& entry) { 166e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy return entry.hash(); 167e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy} 168e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy 1699f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace uirenderer 1709f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace android 1719f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1729f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#endif // ANDROID_HWUI_FONT_H 173