Home | History | Annotate | Download | only in font
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_HWUI_FONT_H
     18 #define ANDROID_HWUI_FONT_H
     19 
     20 #include <utils/KeyedVector.h>
     21 
     22 #include <SkScalerContext.h>
     23 #include <SkPaint.h>
     24 #include <SkPathMeasure.h>
     25 
     26 #include "CachedGlyphInfo.h"
     27 #include "../Rect.h"
     28 #include "../Matrix.h"
     29 
     30 namespace android {
     31 namespace uirenderer {
     32 
     33 ///////////////////////////////////////////////////////////////////////////////
     34 // Font
     35 ///////////////////////////////////////////////////////////////////////////////
     36 
     37 class FontRenderer;
     38 
     39 /**
     40  * Represents a font, defined by a Skia font id and a font size. A font is used
     41  * to generate glyphs and cache them in the FontState.
     42  */
     43 class Font {
     44 public:
     45     enum Style {
     46         kFakeBold = 1
     47     };
     48 
     49     struct FontDescription {
     50         FontDescription(const SkPaint* paint, const mat4& matrix);
     51 
     52         static int compare(const FontDescription& lhs, const FontDescription& rhs);
     53 
     54         hash_t hash() const;
     55 
     56         bool operator==(const FontDescription& other) const {
     57             return compare(*this, other) == 0;
     58         }
     59 
     60         bool operator!=(const FontDescription& other) const {
     61             return compare(*this, other) != 0;
     62         }
     63 
     64         SkFontID mFontId;
     65         float mFontSize;
     66         int mFlags;
     67         float mItalicStyle;
     68         float mScaleX;
     69         uint8_t mStyle;
     70         float mStrokeWidth;
     71         bool mAntiAliasing;
     72         SkMatrix mLookupTransform;
     73         SkMatrix mInverseLookupTransform;
     74     };
     75 
     76     ~Font();
     77 
     78     void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
     79             int numGlyphs, int x, int y, const float* positions);
     80 
     81     void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
     82             int numGlyphs, SkPath* path, float hOffset, float vOffset);
     83 
     84     const Font::FontDescription& getDescription() const {
     85         return mDescription;
     86     }
     87 
     88     /**
     89      * Creates a new font associated with the specified font state.
     90      */
     91     static Font* create(FontRenderer* state, const SkPaint* paint, const mat4& matrix);
     92 
     93 private:
     94     friend class FontRenderer;
     95 
     96     Font(FontRenderer* state, const Font::FontDescription& desc);
     97 
     98     typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*,
     99             uint32_t, uint32_t, Rect*, const float*);
    100 
    101     enum RenderMode {
    102         FRAMEBUFFER,
    103         BITMAP,
    104         MEASURE,
    105     };
    106 
    107     void precache(SkPaint* paint, const char* text, int numGlyphs);
    108 
    109     void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
    110             int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap,
    111             uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions);
    112 
    113     void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
    114             int numGlyphs, Rect *bounds, const float* positions);
    115 
    116     void invalidateTextureCache(CacheTexture* cacheTexture = NULL);
    117 
    118     CachedGlyphInfo* cacheGlyph(SkPaint* paint, glyph_t glyph, bool precaching);
    119     void updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyphInfo* glyph,
    120             bool precaching);
    121 
    122     void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
    123             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    124             Rect* bounds, const float* pos);
    125     void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
    126             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    127             Rect* bounds, const float* pos);
    128     void drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y,
    129             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    130             Rect* bounds, const float* pos);
    131     void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y,
    132             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    133             Rect* bounds, const float* pos);
    134     void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,
    135             SkPathMeasure& measure, SkPoint* position, SkVector* tangent);
    136 
    137     CachedGlyphInfo* getCachedGlyph(SkPaint* paint, glyph_t textUnit, bool precaching = false);
    138 
    139     FontRenderer* mState;
    140     FontDescription mDescription;
    141 
    142     // Cache of glyphs
    143     DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs;
    144 
    145     bool mIdentityTransform;
    146 };
    147 
    148 inline int strictly_order_type(const Font::FontDescription& lhs,
    149         const Font::FontDescription& rhs) {
    150     return Font::FontDescription::compare(lhs, rhs) < 0;
    151 }
    152 
    153 inline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) {
    154     return Font::FontDescription::compare(lhs, rhs);
    155 }
    156 
    157 inline hash_t hash_type(const Font::FontDescription& entry) {
    158     return entry.hash();
    159 }
    160 
    161 }; // namespace uirenderer
    162 }; // namespace android
    163 
    164 #endif // ANDROID_HWUI_FONT_H
    165