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