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>
252ee2d59b7d10733e7e11e398d2316035d3b36c73Victoria Lease#include <SkGlyphCache.h>
269f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPaint.h>
279f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include <SkPathMeasure.h>
289f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
292dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include "FontUtil.h"
309f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#include "../Rect.h"
31e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy#include "../Matrix.h"
329f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
339f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace android {
349f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guynamespace uirenderer {
359f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
369f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy///////////////////////////////////////////////////////////////////////////////
379f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy// Font
389f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy///////////////////////////////////////////////////////////////////////////////
399f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
40e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craikstruct CachedGlyphInfo;
412dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass CacheTexture;
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
84e8c3c813b0e3ac98304b17a751ce6e436e252bd9Chris Craik    void render(const SkPaint* paint, const glyph_t* glyphs,
859f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy            int numGlyphs, int x, int y, const float* positions);
869f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
87e8c3c813b0e3ac98304b17a751ce6e436e252bd9Chris Craik    void render(const SkPaint* paint, const glyph_t* glyphs,
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
113e8c3c813b0e3ac98304b17a751ce6e436e252bd9Chris Craik    void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs);
1149f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
115e8c3c813b0e3ac98304b17a751ce6e436e252bd9Chris Craik    void render(const SkPaint* paint, const glyph_t* glyphs,
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
119e8c3c813b0e3ac98304b17a751ce6e436e252bd9Chris Craik    void measure(const SkPaint* paint, const glyph_t* glyphs,
1209f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy            int numGlyphs, Rect *bounds, const float* positions);
1219f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
122e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik    void invalidateTextureCache(CacheTexture* cacheTexture = nullptr);
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;
1539f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy};
1549f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
155e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline int strictly_order_type(const Font::FontDescription& lhs,
156e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy        const Font::FontDescription& rhs) {
157e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy    return Font::FontDescription::compare(lhs, rhs) < 0;
158e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy}
159e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy
160e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) {
161e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy    return Font::FontDescription::compare(lhs, rhs);
162e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy}
163e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy
164e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guyinline hash_t hash_type(const Font::FontDescription& entry) {
165e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy    return entry.hash();
166e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy}
167e3a9b24b5e3f9b2058486814a6d27729e51ad466Romain Guy
1689f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace uirenderer
1699f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy}; // namespace android
1709f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy
1719f5dab3fc228fa11c32b483e6101ec086895a32bRomain Guy#endif // ANDROID_HWUI_FONT_H
172