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         uint8_t mHinting;
     73         SkMatrix mLookupTransform;
     74         SkMatrix mInverseLookupTransform;
     75     };
     76 
     77     ~Font();
     78 
     79     void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
     80             int numGlyphs, int x, int y, const float* positions);
     81 
     82     void render(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
     83             int numGlyphs, SkPath* path, float hOffset, float vOffset);
     84 
     85     const Font::FontDescription& getDescription() const {
     86         return mDescription;
     87     }
     88 
     89     /**
     90      * Creates a new font associated with the specified font state.
     91      */
     92     static Font* create(FontRenderer* state, const SkPaint* paint, const mat4& matrix);
     93 
     94 private:
     95     friend class FontRenderer;
     96 
     97     Font(FontRenderer* state, const Font::FontDescription& desc);
     98 
     99     typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*,
    100             uint32_t, uint32_t, Rect*, const float*);
    101 
    102     enum RenderMode {
    103         FRAMEBUFFER,
    104         BITMAP,
    105         MEASURE,
    106     };
    107 
    108     void precache(SkPaint* paint, const char* text, int numGlyphs);
    109 
    110     void render(SkPaint* paint, const char *text, uint32_t start, uint32_t len,
    111             int numGlyphs, int x, int y, RenderMode mode, uint8_t *bitmap,
    112             uint32_t bitmapW, uint32_t bitmapH, Rect *bounds, const float* positions);
    113 
    114     void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len,
    115             int numGlyphs, Rect *bounds, const float* positions);
    116 
    117     void invalidateTextureCache(CacheTexture* cacheTexture = NULL);
    118 
    119     CachedGlyphInfo* cacheGlyph(SkPaint* paint, glyph_t glyph, bool precaching);
    120     void updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyphInfo* glyph,
    121             bool precaching);
    122 
    123     void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
    124             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    125             Rect* bounds, const float* pos);
    126     void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y,
    127             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    128             Rect* bounds, const float* pos);
    129     void drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y,
    130             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    131             Rect* bounds, const float* pos);
    132     void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y,
    133             uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH,
    134             Rect* bounds, const float* pos);
    135     void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,
    136             SkPathMeasure& measure, SkPoint* position, SkVector* tangent);
    137 
    138     CachedGlyphInfo* getCachedGlyph(SkPaint* paint, glyph_t textUnit, bool precaching = false);
    139 
    140     FontRenderer* mState;
    141     FontDescription mDescription;
    142 
    143     // Cache of glyphs
    144     DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs;
    145 
    146     bool mIdentityTransform;
    147 };
    148 
    149 inline int strictly_order_type(const Font::FontDescription& lhs,
    150         const Font::FontDescription& rhs) {
    151     return Font::FontDescription::compare(lhs, rhs) < 0;
    152 }
    153 
    154 inline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) {
    155     return Font::FontDescription::compare(lhs, rhs);
    156 }
    157 
    158 inline hash_t hash_type(const Font::FontDescription& entry) {
    159     return entry.hash();
    160 }
    161 
    162 }; // namespace uirenderer
    163 }; // namespace android
    164 
    165 #endif // ANDROID_HWUI_FONT_H
    166