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