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