FontRenderer.h revision f942cf10e04567f6b9456f6258e29c803b8bfb41
1694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy/*
2694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * Copyright (C) 2010 The Android Open Source Project
3694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy *
4694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * you may not use this file except in compliance with the License.
6694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * You may obtain a copy of the License at
7694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy *
8694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy *
10694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * Unless required by applicable law or agreed to in writing, software
11694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * See the License for the specific language governing permissions and
14694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy * limitations under the License.
15694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy */
16694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_FONT_RENDERER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_FONT_RENDERER_H
19694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
20694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy#include <utils/String8.h>
2165ef909776c03417d8b597738da54ca211e37e4fAlex Sakhartchouk#include <utils/String16.h>
22694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy#include <utils/Vector.h>
23694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy#include <utils/KeyedVector.h>
24694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
25694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy#include <SkScalerContext.h>
26694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy#include <SkPaint.h>
279777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy#include <SkPathMeasure.h>
289777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy#include <SkPoint.h>
29694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
30694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy#include <GLES2/gl2.h>
31694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
3209147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy#include "Rect.h"
3351769a68a5cb34e9564740c6a854fcb93018789dRomain Guy#include "Properties.h"
3409147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy
35694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guynamespace android {
36694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guynamespace uirenderer {
37694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
38726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
39726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy// Defines
40726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
41726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy
42726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy#if RENDER_TEXT_AS_GLYPHS
43726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    typedef uint16_t glyph_t;
44ae91c4cbc79ea910753be65e2f1d7899abcb4da2Romain Guy    #define TO_GLYPH(g) g
45726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    #define GET_METRICS(paint, glyph) paint->getGlyphMetrics(glyph)
46726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    #define GET_GLYPH(text) nextGlyph((const uint16_t**) &text)
47726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    #define IS_END_OF_STRING(glyph) false
48726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy#else
49726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    typedef SkUnichar glyph_t;
50ae91c4cbc79ea910753be65e2f1d7899abcb4da2Romain Guy    #define TO_GLYPH(g) ((SkUnichar) g)
51726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    #define GET_METRICS(paint, glyph) paint->getUnicharMetrics(glyph)
52726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    #define GET_GLYPH(text) SkUTF16_NextUnichar((const uint16_t**) &text)
53726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    #define IS_END_OF_STRING(glyph) glyph < 0
54726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy#endif
55726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy
56e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase#define TEXTURE_BORDER_SIZE 1
57e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
58726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
59726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy// Declarations
60726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
61726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy
62694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guyclass FontRenderer;
63694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
64e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase/**
65378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase * CacheBlock is a node in a linked list of current free space areas in a CacheTexture.
66378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase * Using CacheBlocks enables us to pack the cache from top to bottom as well as left to right.
67e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase * When we add a glyph to the cache, we see if it fits within one of the existing columns that
68e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase * have already been started (this is the case if the glyph fits vertically as well as
69e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase * horizontally, and if its width is sufficiently close to the column width to avoid
70e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase * sub-optimal packing of small glyphs into wide columns). If there is no column in which the
71378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase * glyph fits, we check the final node, which is the remaining space in the cache, creating
72e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase * a new column as appropriate.
73e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase *
74e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase * As columns fill up, we remove their CacheBlock from the list to avoid having to check
75e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase * small blocks in the future.
76e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase */
77e816baea651476aca4407200d4a5e629b9ab8dfaChet Haasestruct CacheBlock {
78e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    uint16_t mX;
79e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    uint16_t mY;
80e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    uint16_t mWidth;
81e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    uint16_t mHeight;
82e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    CacheBlock* mNext;
83e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    CacheBlock* mPrev;
84e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
85e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    CacheBlock(uint16_t x, uint16_t y, uint16_t width, uint16_t height, bool empty = false):
86e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        mX(x), mY(y), mWidth(width), mHeight(height), mNext(NULL), mPrev(NULL)
87e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    {
88e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
89e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
90e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    static CacheBlock* insertBlock(CacheBlock* head, CacheBlock *newBlock);
91e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
92e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    static CacheBlock* removeBlock(CacheBlock* head, CacheBlock *blockToRemove);
93e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
94e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    void output() {
95e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        CacheBlock *currBlock = this;
96e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        while (currBlock) {
97e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase            ALOGD("Block: this, x, y, w, h = %p, %d, %d, %d, %d",
98e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase                    currBlock, currBlock->mX, currBlock->mY, currBlock->mWidth, currBlock->mHeight);
99e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase            currBlock = currBlock->mNext;
100e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        }
101e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
102e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase};
103e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
104378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haaseclass CacheTexture {
1057de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haasepublic:
106378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    CacheTexture(uint16_t width, uint16_t height) :
107378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase            mTexture(NULL), mTextureId(0), mWidth(width), mHeight(height),
108378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase            mLinearFiltering(false), mDirty(false), mNumGlyphs(0) {
109e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        mCacheBlocks = new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
110378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase                mWidth - TEXTURE_BORDER_SIZE, mHeight - TEXTURE_BORDER_SIZE, true);
111e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
112e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
113378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    ~CacheTexture() {
114378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase        if (mTexture) {
115378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase            delete[] mTexture;
116378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase        }
117378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase        if (mTextureId) {
118378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase            glDeleteTextures(1, &mTextureId);
119378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase        }
120e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        reset();
121e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
122e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
123e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    void reset() {
124e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        // Delete existing cache blocks
125e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        while (mCacheBlocks != NULL) {
126e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase            CacheBlock* tmpBlock = mCacheBlocks;
127e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase            mCacheBlocks = mCacheBlocks->mNext;
128e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase            delete tmpBlock;
129e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        }
130e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        mNumGlyphs = 0;
131e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
132e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
133e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    void init() {
134e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        // reset, then create a new remainder space to start again
135e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        reset();
136e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        mCacheBlocks = new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
137378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase                mWidth - TEXTURE_BORDER_SIZE, mHeight - TEXTURE_BORDER_SIZE, true);
1387de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    }
1397de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase
1407de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    bool fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY);
1417de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase
142378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    uint8_t* mTexture;
143378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    GLuint mTextureId;
144378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    uint16_t mWidth;
145378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    uint16_t mHeight;
146378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    bool mLinearFiltering;
1477de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    bool mDirty;
148e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    uint16_t mNumGlyphs;
149e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    CacheBlock* mCacheBlocks;
1507de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase};
1517de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase
1527de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haasestruct CachedGlyphInfo {
1537de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // Has the cache been invalidated?
1547de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    bool mIsValid;
1557de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // Location of the cached glyph in the bitmap
1567de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // in case we need to resize the texture or
1577de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // render to bitmap
1587de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mStartX;
1597de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mStartY;
1607de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mBitmapWidth;
1617de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mBitmapHeight;
1627de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // Also cache texture coords for the quad
1637de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    float mBitmapMinU;
1647de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    float mBitmapMinV;
1657de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    float mBitmapMaxU;
1667de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    float mBitmapMaxV;
1677de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // Minimize how much we call freetype
1687de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mGlyphIndex;
1697de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mAdvanceX;
1707de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mAdvanceY;
1717de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // Values below contain a glyph's origin in the bitmap
1727de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    int32_t mBitmapLeft;
1737de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    int32_t mBitmapTop;
1747de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    // Auto-kerning
1757de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    SkFixed mLsbDelta;
1767de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    SkFixed mRsbDelta;
177378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    CacheTexture* mCacheTexture;
1787de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase};
1797de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase
1807de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase
181726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
182726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy// Font
183726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
184726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy
18551769a68a5cb34e9564740c6a854fcb93018789dRomain Guy/**
18651769a68a5cb34e9564740c6a854fcb93018789dRomain Guy * Represents a font, defined by a Skia font id and a font size. A font is used
18751769a68a5cb34e9564740c6a854fcb93018789dRomain Guy * to generate glyphs and cache them in the FontState.
18851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy */
189694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guyclass Font {
190694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guypublic:
191325a0f969c1d803d7e39a9caee8cc3d400350659Romain Guy    enum Style {
192c7b25be64f679e78dfa79080b44be18c9974004cRomain Guy        kFakeBold = 1
193325a0f969c1d803d7e39a9caee8cc3d400350659Romain Guy    };
194325a0f969c1d803d7e39a9caee8cc3d400350659Romain Guy
195694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    ~Font();
196694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
19751769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    /**
19851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy     * Renders the specified string of text.
199f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk     * If bitmap is specified, it will be used as the render target
20051769a68a5cb34e9564740c6a854fcb93018789dRomain Guy     */
201726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
202726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy            int numGlyphs, int x, int y, uint8_t *bitmap = NULL,
203726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy            uint32_t bitmapW = 0, uint32_t bitmapH = 0);
204671d6cf460531825a321edb200523d0faa7792c9Romain Guy
205671d6cf460531825a321edb200523d0faa7792c9Romain Guy    void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
206671d6cf460531825a321edb200523d0faa7792c9Romain Guy            int numGlyphs, int x, int y, const float* positions);
207671d6cf460531825a321edb200523d0faa7792c9Romain Guy
2089777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy    void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
2099777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            int numGlyphs, SkPath* path, float hOffset, float vOffset);
2109777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy
21151769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    /**
21251769a68a5cb34e9564740c6a854fcb93018789dRomain Guy     * Creates a new font associated with the specified font state.
21351769a68a5cb34e9564740c6a854fcb93018789dRomain Guy     */
2142577db1ec135a1470a2c42139772ec97a6c30e78Romain Guy    static Font* create(FontRenderer* state, uint32_t fontId, float fontSize,
215bd496bc3d481f9cfc39007d22372d3a1a8809f96Romain Guy            int flags, uint32_t italicStyle, uint32_t scaleX, SkPaint::Style style,
216bd496bc3d481f9cfc39007d22372d3a1a8809f96Romain Guy            uint32_t strokeWidth);
217694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
218694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guyprotected:
219694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    friend class FontRenderer;
220671d6cf460531825a321edb200523d0faa7792c9Romain Guy    typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*,
221671d6cf460531825a321edb200523d0faa7792c9Romain Guy            uint32_t, uint32_t, Rect*, const float*);
222694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
223f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk    enum RenderMode {
224f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        FRAMEBUFFER,
225f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        BITMAP,
226f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        MEASURE,
227f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk    };
228f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk
229e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    void precache(SkPaint* paint, const char* text, int numGlyphs);
230e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
231726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
232726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy            int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap,
233671d6cf460531825a321edb200523d0faa7792c9Romain Guy            uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions);
234f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk
235726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
236416a847633680d94efb926837efdc18726d54918Raph Levien            int numGlyphs, Rect *bounds, const float* positions);
237f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk
2388668f8a633d9299091556c3b2e5ae07be8dce360Chet Haase    Font(FontRenderer* state, uint32_t fontId, float fontSize, int flags, uint32_t italicStyle,
239bd496bc3d481f9cfc39007d22372d3a1a8809f96Romain Guy            uint32_t scaleX, SkPaint::Style style, uint32_t strokeWidth);
240694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
241726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    // Cache of glyphs
242726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs;
243694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
244378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    void invalidateTextureCache(CacheTexture *cacheTexture = NULL);
245bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
246f942cf10e04567f6b9456f6258e29c803b8bfb41Chet Haase    CachedGlyphInfo* cacheGlyph(SkPaint* paint, glyph_t glyph, bool precaching);
247f942cf10e04567f6b9456f6258e29c803b8bfb41Chet Haase    void updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyphInfo* glyph,
248f942cf10e04567f6b9456f6258e29c803b8bfb41Chet Haase            bool precaching);
249671d6cf460531825a321edb200523d0faa7792c9Romain Guy
250671d6cf460531825a321edb200523d0faa7792c9Romain Guy    void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
251671d6cf460531825a321edb200523d0faa7792c9Romain Guy            uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
252671d6cf460531825a321edb200523d0faa7792c9Romain Guy            Rect* bounds, const float* pos);
253671d6cf460531825a321edb200523d0faa7792c9Romain Guy    void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
254671d6cf460531825a321edb200523d0faa7792c9Romain Guy            uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
255671d6cf460531825a321edb200523d0faa7792c9Romain Guy            Rect* bounds, const float* pos);
256671d6cf460531825a321edb200523d0faa7792c9Romain Guy    void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y,
257671d6cf460531825a321edb200523d0faa7792c9Romain Guy            uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
258671d6cf460531825a321edb200523d0faa7792c9Romain Guy            Rect* bounds, const float* pos);
2599777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy    void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,
2609777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            SkPathMeasure& measure, SkPoint* position, SkVector* tangent);
261bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
262f942cf10e04567f6b9456f6258e29c803b8bfb41Chet Haase    CachedGlyphInfo* getCachedGlyph(SkPaint* paint, glyph_t textUnit, bool precaching = false);
263726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy
264726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    static glyph_t nextGlyph(const uint16_t** srcPtr) {
265726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy        const uint16_t* src = *srcPtr;
266726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy        glyph_t g = *src++;
267726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy        *srcPtr = src;
268726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy        return g;
269726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    }
27065ef909776c03417d8b597738da54ca211e37e4fAlex Sakhartchouk
271bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    FontRenderer* mState;
272bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    uint32_t mFontId;
273bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    float mFontSize;
274325a0f969c1d803d7e39a9caee8cc3d400350659Romain Guy    int mFlags;
2752577db1ec135a1470a2c42139772ec97a6c30e78Romain Guy    uint32_t mItalicStyle;
2768668f8a633d9299091556c3b2e5ae07be8dce360Chet Haase    uint32_t mScaleX;
277bd496bc3d481f9cfc39007d22372d3a1a8809f96Romain Guy    SkPaint::Style mStyle;
278bd496bc3d481f9cfc39007d22372d3a1a8809f96Romain Guy    uint32_t mStrokeWidth;
279694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy};
280694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
281726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
282726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy// Renderer
283726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy///////////////////////////////////////////////////////////////////////////////
284726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy
285694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guyclass FontRenderer {
286694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guypublic:
287694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    FontRenderer();
288694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    ~FontRenderer();
289694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
2909a8245629d69d81e0b62e52970feaf9c02580e75Chet Haase    void flushLargeCaches();
291694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
292b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy    void setGammaTable(const uint8_t* gammaTable) {
293b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy        mGammaTable = gammaTable;
294b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy    }
295b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
29665ef909776c03417d8b597738da54ca211e37e4fAlex Sakhartchouk    void setFont(SkPaint* paint, uint32_t fontId, float fontSize);
297e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
298e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    void precache(SkPaint* paint, const char* text, int numGlyphs);
299e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase
300671d6cf460531825a321edb200523d0faa7792c9Romain Guy    // bounds is an out parameter
3015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    bool renderText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
3025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            uint32_t len, int numGlyphs, int x, int y, Rect* bounds);
303671d6cf460531825a321edb200523d0faa7792c9Romain Guy    // bounds is an out parameter
304671d6cf460531825a321edb200523d0faa7792c9Romain Guy    bool renderPosText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
305671d6cf460531825a321edb200523d0faa7792c9Romain Guy            uint32_t len, int numGlyphs, int x, int y, const float* positions, Rect* bounds);
3069777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy    // bounds is an out parameter
3079777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy    bool renderTextOnPath(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex,
3089777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            uint32_t len, int numGlyphs, SkPath* path, float hOffset, float vOffset, Rect* bounds);
309694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
310f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk    struct DropShadow {
3111e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy        DropShadow() { };
3121e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy
3131e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy        DropShadow(const DropShadow& dropShadow):
3141e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy            width(dropShadow.width), height(dropShadow.height),
3151e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy            image(dropShadow.image), penX(dropShadow.penX),
3161e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy            penY(dropShadow.penY) {
3171e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy        }
3181e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy
319f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        uint32_t width;
320f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        uint32_t height;
321f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        uint8_t* image;
322f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        int32_t penX;
323f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk        int32_t penY;
324f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk    };
325f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk
326f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk    // After renderDropShadow returns, the called owns the memory in DropShadow.image
327f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk    // and is responsible for releasing it when it's done with it
328f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk    DropShadow renderDropShadow(SkPaint* paint, const char *text, uint32_t startIndex,
329416a847633680d94efb926837efdc18726d54918Raph Levien            uint32_t len, int numGlyphs, uint32_t radius, const float* positions);
330f18136cb3c881a9d16c1a4f0f341732c276936bfAlex Sakhartchouk
331e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy    GLuint getTexture(bool linearFiltering = false) {
332694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy        checkInit();
333ae91c4cbc79ea910753be65e2f1d7899abcb4da2Romain Guy
3342a47c14e2a6f152496b43104bc785c488583fd59Chet Haase        if (linearFiltering != mCurrentCacheTexture->mLinearFiltering) {
3352a47c14e2a6f152496b43104bc785c488583fd59Chet Haase            mCurrentCacheTexture->mLinearFiltering = linearFiltering;
336e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy            mLinearFiltering = linearFiltering;
337e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy            const GLenum filtering = linearFiltering ? GL_LINEAR : GL_NEAREST;
338e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy
3397de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase            glBindTexture(GL_TEXTURE_2D, mCurrentCacheTexture->mTextureId);
340e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
341e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
342e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy        }
343ae91c4cbc79ea910753be65e2f1d7899abcb4da2Romain Guy
3447de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase        return mCurrentCacheTexture->mTextureId;
345c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
346c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
3477de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t getCacheSize() const {
3487de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase        uint32_t size = 0;
349378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase        for (uint32_t i = 0; i < mCacheTextures.size(); i++) {
350378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase            CacheTexture* cacheTexture = mCacheTextures[i];
351378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase            if (cacheTexture != NULL && cacheTexture->mTexture != NULL) {
352378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase                size += cacheTexture->mWidth * cacheTexture->mHeight;
353378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase            }
3547de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase        }
3557de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase        return size;
356c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
357c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
358694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guyprotected:
359694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    friend class Font;
360694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
361b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy    const uint8_t* mGammaTable;
362b45c0c9774bd19a9dbe77d149abae4e124b08bf6Romain Guy
3632a47c14e2a6f152496b43104bc785c488583fd59Chet Haase    void allocateTextureMemory(CacheTexture* cacheTexture);
3649a8245629d69d81e0b62e52970feaf9c02580e75Chet Haase    void deallocateTextureMemory(CacheTexture* cacheTexture);
3657de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    void initTextTexture();
3669777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy    CacheTexture* createCacheTexture(int width, int height, bool allocate);
3677de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
368f942cf10e04567f6b9456f6258e29c803b8bfb41Chet Haase            uint32_t *retOriginX, uint32_t *retOriginY, bool precaching);
369378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    CacheTexture* cacheBitmapInTexture(const SkGlyph& glyph, uint32_t* startX, uint32_t* startY);
370694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
371694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    void flushAllAndInvalidate();
372694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    void initVertexArrayBuffers();
373694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
374694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    void checkInit();
375671d6cf460531825a321edb200523d0faa7792c9Romain Guy    void initRender(const Rect* clip, Rect* bounds);
376671d6cf460531825a321edb200523d0faa7792c9Romain Guy    void finishRender();
377694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
378694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    void issueDrawCommand();
3799777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy    void appendMeshQuadNoClip(float x1, float y1, float u1, float v1,
3809777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            float x2, float y2, float u2, float v2,
3819777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            float x3, float y3, float u3, float v3,
3829777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            float x4, float y4, float u4, float v4, CacheTexture* texture);
383d71dd367af604571c7d00ca473184a1b9240eca2Romain Guy    void appendMeshQuad(float x1, float y1, float u1, float v1,
384d71dd367af604571c7d00ca473184a1b9240eca2Romain Guy            float x2, float y2, float u2, float v2,
385d71dd367af604571c7d00ca473184a1b9240eca2Romain Guy            float x3, float y3, float u3, float v3,
3867de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase            float x4, float y4, float u4, float v4, CacheTexture* texture);
3879777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy    void appendRotatedMeshQuad(float x1, float y1, float u1, float v1,
3889777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            float x2, float y2, float u2, float v2,
3899777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            float x3, float y3, float u3, float v3,
3909777173eb6c9eb97c7921c8288ebc65e3ab3ce6fRomain Guy            float x4, float y4, float u4, float v4, CacheTexture* texture);
391694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
3927de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mSmallCacheWidth;
3937de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    uint32_t mSmallCacheHeight;
394694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
395378e919ccb75efe24d5a5aa75ac2c6ef255dcb48Chet Haase    Vector<CacheTexture*> mCacheTextures;
396694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
39709147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy    Font* mCurrentFont;
398694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    Vector<Font*> mActiveFonts;
399694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
4007de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    CacheTexture* mCurrentCacheTexture;
4017de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase    CacheTexture* mLastCacheTexture;
4027de0cb12d0e5fd64811da0b5d1ae0c0d58b86f86Chet Haase
4039b9902ddbb01548f4a0199087b7035e7c10b2ae7Alex Sakhartchouk    void checkTextureUpdate();
404694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    bool mUploadTexture;
405694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
406694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    // Pointer to vertex data to speed up frame to frame work
407694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    float *mTextMeshPtr;
408694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    uint32_t mCurrentQuadIndex;
409694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    uint32_t mMaxNumberOfQuads;
410694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
411694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    uint32_t mIndexBufferID;
412694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
41309147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy    const Rect* mClip;
4145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    Rect* mBounds;
4155b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    bool mDrawn;
41609147fbdc8206a0cac78bfe9083e7e15b3c5689cRomain Guy
417694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy    bool mInitialized;
41889a524ac2d4a36739e51b01b336c0bade77e2ee0Alex Sakhartchouk
419e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy    bool mLinearFiltering;
420e8cb9c14309b0f01c0159efdf9a7198f44a62642Romain Guy
42189a524ac2d4a36739e51b01b336c0bade77e2ee0Alex Sakhartchouk    void computeGaussianWeights(float* weights, int32_t radius);
42289a524ac2d4a36739e51b01b336c0bade77e2ee0Alex Sakhartchouk    void horizontalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
4231e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy            int32_t width, int32_t height);
42489a524ac2d4a36739e51b01b336c0bade77e2ee0Alex Sakhartchouk    void verticalBlur(float* weights, int32_t radius, const uint8_t *source, uint8_t *dest,
4251e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy            int32_t width, int32_t height);
42689a524ac2d4a36739e51b01b336c0bade77e2ee0Alex Sakhartchouk    void blurImage(uint8_t* image, int32_t width, int32_t height, int32_t radius);
427694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy};
428694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
429694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy}; // namespace uirenderer
430694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy}; // namespace android
431694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
4325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_FONT_RENDERER_H
433