1441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
2441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Copyright 2013 The Android Open Source Project
3441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
4441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5441e847feb0e055ecb004802802cea07782ab228Andy McFadden * you may not use this file except in compliance with the License.
6441e847feb0e055ecb004802802cea07782ab228Andy McFadden * You may obtain a copy of the License at
7441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
8441e847feb0e055ecb004802802cea07782ab228Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
10441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Unless required by applicable law or agreed to in writing, software
11441e847feb0e055ecb004802802cea07782ab228Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12441e847feb0e055ecb004802802cea07782ab228Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13441e847feb0e055ecb004802802cea07782ab228Andy McFadden * See the License for the specific language governing permissions and
14441e847feb0e055ecb004802802cea07782ab228Andy McFadden * limitations under the License.
15441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
16441e847feb0e055ecb004802802cea07782ab228Andy McFadden
17441e847feb0e055ecb004802802cea07782ab228Andy McFadden#ifndef SCREENRECORD_TEXT_RENDER_H
18441e847feb0e055ecb004802802cea07782ab228Andy McFadden#define SCREENRECORD_TEXT_RENDER_H
19441e847feb0e055ecb004802802cea07782ab228Andy McFadden
20441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include "Program.h"
21441e847feb0e055ecb004802802cea07782ab228Andy McFadden
22441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <utils/String8.h>
23441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <utils/Errors.h>
24441e847feb0e055ecb004802802cea07782ab228Andy McFadden
25441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <GLES2/gl2.h>
26441e847feb0e055ecb004802802cea07782ab228Andy McFadden
27441e847feb0e055ecb004802802cea07782ab228Andy McFadden
28441e847feb0e055ecb004802802cea07782ab228Andy McFaddennamespace android {
29441e847feb0e055ecb004802802cea07782ab228Andy McFadden
30441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
31441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Simple font representation.
32441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
33441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Not thread-safe.
34441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
35441e847feb0e055ecb004802802cea07782ab228Andy McFaddenclass TextRenderer {
36441e847feb0e055ecb004802802cea07782ab228Andy McFaddenpublic:
37441e847feb0e055ecb004802802cea07782ab228Andy McFadden    TextRenderer() :
38441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mTextureName(0),
39441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mScale(1.0f),
40441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mBorderWidth(10.0f),
41441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mIndentMult(30.0f),
42441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mScreenWidth(0),
43441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mScreenHeight(0)
44441e847feb0e055ecb004802802cea07782ab228Andy McFadden        {}
45441e847feb0e055ecb004802802cea07782ab228Andy McFadden    ~TextRenderer() {}
46441e847feb0e055ecb004802802cea07782ab228Andy McFadden
47441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Load the glyph bitmap into a 2D texture in the current context.
48441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t loadIntoTexture();
49441e847feb0e055ecb004802802cea07782ab228Andy McFadden
50441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Set the screen dimensions, used for scaling and line wrap.
51441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void setScreenSize(uint32_t width, uint32_t height) {
52441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mScreenWidth = width;
53441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mScreenHeight = height;
54441e847feb0e055ecb004802802cea07782ab228Andy McFadden    }
55441e847feb0e055ecb004802802cea07782ab228Andy McFadden
56441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Get/set the font scaling.
57441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float getScale() const { return mScale; }
58441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void setScale(float scale) { mScale = scale; }
59441e847feb0e055ecb004802802cea07782ab228Andy McFadden
60441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Set the font scaling based on the desired number of lines per screen.
61441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // The display's tallest axis is used, so if the device is in landscape
62441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // the screen will fit fewer lines.
63441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void setProportionalScale(float linesPerScreen);
64441e847feb0e055ecb004802802cea07782ab228Andy McFadden
65441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Render the text string at the specified coordinates.  Pass in the
66441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // upper-left corner in non-GL-flipped coordinates, i.e. to print text
67441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // at the top left of the screen use (0,0).
68441e847feb0e055ecb004802802cea07782ab228Andy McFadden    //
69441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Set blend func (1, 1-srcAlpha) before calling if drawing onto
70441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // something other than black.
71441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void drawString(const Program& program, const float* texMatrix,
72441e847feb0e055ecb004802802cea07782ab228Andy McFadden            float x, float y, const String8& str) const;
73441e847feb0e055ecb004802802cea07782ab228Andy McFadden
74441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Draw a string, possibly wrapping it at the screen boundary.  Top-left
75441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // is at (0,0).
76441e847feb0e055ecb004802802cea07782ab228Andy McFadden    //
77441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Returns the updated Y position.
78441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float drawWrappedString(const Program& texRender, float xpos, float ypos,
79441e847feb0e055ecb004802802cea07782ab228Andy McFadden            const String8& str);
80441e847feb0e055ecb004802802cea07782ab228Andy McFadden
81441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Returns the name of the texture the font was loaded into.
82441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLuint getTextureName() const { return mTextureName; }
83441e847feb0e055ecb004802802cea07782ab228Andy McFadden
84441e847feb0e055ecb004802802cea07782ab228Andy McFaddenprivate:
85441e847feb0e055ecb004802802cea07782ab228Andy McFadden    TextRenderer(const TextRenderer&);
86441e847feb0e055ecb004802802cea07782ab228Andy McFadden    TextRenderer& operator=(const TextRenderer&);
87441e847feb0e055ecb004802802cea07782ab228Andy McFadden
88441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Perform one-time initialization.
89441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static void initOnce();
90441e847feb0e055ecb004802802cea07782ab228Andy McFadden
91441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Populate the mXOffset array.
92441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static void initXOffset();
93441e847feb0e055ecb004802802cea07782ab228Andy McFadden
94441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Find a good place to break the string.  Returns NULL if the entire
95441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // string will fit.
96441e847feb0e055ecb004802802cea07782ab228Andy McFadden    char* breakString(const char* str, float maxWidth) const;
97441e847feb0e055ecb004802802cea07782ab228Andy McFadden
98441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Computes the width of the string, in pixels.
99441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float computeScaledStringWidth(const String8& str8) const;
100441e847feb0e055ecb004802802cea07782ab228Andy McFadden
101441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Computes the width of first N characters in the string.
102441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float computeScaledStringWidth(const char* str, size_t len) const;
103441e847feb0e055ecb004802802cea07782ab228Andy McFadden
104441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Returns the font's glyph height.  This is the full pixel height of the
105441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // tallest glyph, both above and below the baseline, NOT adjusted by the
106441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // current scale factor.
107441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float getGlyphHeight() const;
108441e847feb0e055ecb004802802cea07782ab228Andy McFadden
109441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Like getGlyphHeight(), but result is scaled.
110441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float getScaledGlyphHeight() const { return getGlyphHeight() * mScale; }
111441e847feb0e055ecb004802802cea07782ab228Andy McFadden
1127a66622c2c9250ce4ad0091195331ce4cb91a63dAndy McFadden    // Convert an ASCII character to a glyph index.  Returns the glyph for
1137a66622c2c9250ce4ad0091195331ce4cb91a63dAndy McFadden    // '?' if we have no glyph for the specified character.
1147a66622c2c9250ce4ad0091195331ce4cb91a63dAndy McFadden    size_t glyphIndex(char ch) const;
1157a66622c2c9250ce4ad0091195331ce4cb91a63dAndy McFadden
116441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLuint mTextureName;
117441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float mScale;
118441e847feb0e055ecb004802802cea07782ab228Andy McFadden
119441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Number of pixels preserved at the left/right edges of the screen by
120441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // drawWrappedString().  Not scaled.
121441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float mBorderWidth;
122441e847feb0e055ecb004802802cea07782ab228Andy McFadden
123441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Distance to indent a broken line.  Used by drawWrappedString().
124441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Value will be adjusted by the current scale factor.
125441e847feb0e055ecb004802802cea07782ab228Andy McFadden    float mIndentMult;
126441e847feb0e055ecb004802802cea07782ab228Andy McFadden
127441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Screen dimensions.
128441e847feb0e055ecb004802802cea07782ab228Andy McFadden    uint32_t mScreenWidth;
129441e847feb0e055ecb004802802cea07782ab228Andy McFadden    uint32_t mScreenHeight;
130441e847feb0e055ecb004802802cea07782ab228Andy McFadden
131441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Static font info.
132441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static bool mInitialized;
133441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static uint32_t mXOffset[];
134441e847feb0e055ecb004802802cea07782ab228Andy McFadden
135441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static const char kWhitespace[];
136441e847feb0e055ecb004802802cea07782ab228Andy McFadden};
137441e847feb0e055ecb004802802cea07782ab228Andy McFadden
138441e847feb0e055ecb004802802cea07782ab228Andy McFadden}; // namespace android
139441e847feb0e055ecb004802802cea07782ab228Andy McFadden
140441e847feb0e055ecb004802802cea07782ab228Andy McFadden#endif /*SCREENRECORD_TEXT_RENDER_H*/
141