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 229f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkScalerContext.h> 239f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPaint.h> 249f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPathMeasure.h> 259f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 269f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include "CachedGlyphInfo.h" 279f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include "../Rect.h" 289f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 299f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace android { 309f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace uirenderer { 319f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 329f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/////////////////////////////////////////////////////////////////////////////// 339f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy// Font 349f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/////////////////////////////////////////////////////////////////////////////// 359f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 369f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyclass FontRenderer; 379f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 389f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy/** 399f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Represents a font, defined by a Skia font id and a font size. A font is used 409f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * to generate glyphs and cache them in the FontState. 419f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 429f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyclass Font { 439f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guypublic: 449f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy enum Style { 459f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy kFakeBold = 1 469f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy }; 479f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 489f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy ~Font(); 499f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 509f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy /** 519f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Renders the specified string of text. 529f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * If bitmap is specified, it will be used as the render target 539f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 549f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len, 559f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, int x, int y, uint8_t *bitmap = NULL, 569f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t bitmapW = 0, uint32_t bitmapH = 0); 579f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 589f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len, 599f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, int x, int y, const float* positions); 609f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 619f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len, 629f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, SkPath* path, float hOffset, float vOffset); 639f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 649f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy /** 659f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy * Creates a new font associated with the specified font state. 669f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy */ 679f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy static Font* create(FontRenderer* state, uint32_t fontId, float fontSize, 689f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int flags, uint32_t italicStyle, uint32_t scaleX, SkPaint::Style style, 699f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t strokeWidth); 709f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 719f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guyprivate: 729f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy friend class FontRenderer; 739f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*, 749f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t, uint32_t, Rect*, const float*); 759f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 769f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy enum RenderMode { 779f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy FRAMEBUFFER, 789f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy BITMAP, 799f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy MEASURE, 809f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy }; 819f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 829f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void precache(SkPaint* paint, const char* text, int numGlyphs); 839f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 849f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len, 859f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap, 869f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions); 879f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 889f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len, 899f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int numGlyphs, Rect *bounds, const float* positions); 909f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 919f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Font(FontRenderer* state, uint32_t fontId, float fontSize, int flags, uint32_t italicStyle, 929f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t scaleX, SkPaint::Style style, uint32_t strokeWidth); 939f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 949f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy // Cache of glyphs 959f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs; 969f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 978087246d9964b11de8ce116bc63b156faa4197e0Romain Guy void invalidateTextureCache(CacheTexture* cacheTexture = NULL); 989f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 999f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy CachedGlyphInfo* cacheGlyph(SkPaint* paint, glyph_t glyph, bool precaching); 1009f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyphInfo* glyph, 1019f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy bool precaching); 1029f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1039f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 1049f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1059f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 1069f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, 1079f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1089f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 1099f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, 1109f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH, 1119f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy Rect* bounds, const float* pos); 1129f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset, 1139f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy SkPathMeasure& measure, SkPoint* position, SkVector* tangent); 1149f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1159f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy CachedGlyphInfo* getCachedGlyph(SkPaint* paint, glyph_t textUnit, bool precaching = false); 1169f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1179f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy FontRenderer* mState; 1189f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t mFontId; 1199f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy float mFontSize; 1209f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy int mFlags; 1219f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t mItalicStyle; 1229f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t mScaleX; 1239f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy SkPaint::Style mStyle; 1249f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy uint32_t mStrokeWidth; 1259f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; 1269f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1279f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace uirenderer 1289f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace android 1299f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy 1309f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#endif // ANDROID_HWUI_FONT_H 131