1 /* 2 * Copyright 2013 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 SCREENRECORD_TEXT_RENDER_H 18 #define SCREENRECORD_TEXT_RENDER_H 19 20 #include "Program.h" 21 22 #include <utils/String8.h> 23 #include <utils/Errors.h> 24 25 #include <GLES2/gl2.h> 26 27 28 namespace android { 29 30 /* 31 * Simple font representation. 32 * 33 * Not thread-safe. 34 */ 35 class TextRenderer { 36 public: TextRenderer()37 TextRenderer() : 38 mTextureName(0), 39 mScale(1.0f), 40 mBorderWidth(10.0f), 41 mIndentMult(30.0f), 42 mScreenWidth(0), 43 mScreenHeight(0) 44 {} ~TextRenderer()45 ~TextRenderer() {} 46 47 // Load the glyph bitmap into a 2D texture in the current context. 48 status_t loadIntoTexture(); 49 50 // Set the screen dimensions, used for scaling and line wrap. setScreenSize(uint32_t width,uint32_t height)51 void setScreenSize(uint32_t width, uint32_t height) { 52 mScreenWidth = width; 53 mScreenHeight = height; 54 } 55 56 // Get/set the font scaling. getScale()57 float getScale() const { return mScale; } setScale(float scale)58 void setScale(float scale) { mScale = scale; } 59 60 // Set the font scaling based on the desired number of lines per screen. 61 // The display's tallest axis is used, so if the device is in landscape 62 // the screen will fit fewer lines. 63 void setProportionalScale(float linesPerScreen); 64 65 // Render the text string at the specified coordinates. Pass in the 66 // upper-left corner in non-GL-flipped coordinates, i.e. to print text 67 // at the top left of the screen use (0,0). 68 // 69 // Set blend func (1, 1-srcAlpha) before calling if drawing onto 70 // something other than black. 71 void drawString(const Program& program, const float* texMatrix, 72 float x, float y, const String8& str) const; 73 74 // Draw a string, possibly wrapping it at the screen boundary. Top-left 75 // is at (0,0). 76 // 77 // Returns the updated Y position. 78 float drawWrappedString(const Program& texRender, float xpos, float ypos, 79 const String8& str); 80 81 // Returns the name of the texture the font was loaded into. getTextureName()82 GLuint getTextureName() const { return mTextureName; } 83 84 private: 85 TextRenderer(const TextRenderer&); 86 TextRenderer& operator=(const TextRenderer&); 87 88 // Perform one-time initialization. 89 static void initOnce(); 90 91 // Populate the mXOffset array. 92 static void initXOffset(); 93 94 // Find a good place to break the string. Returns NULL if the entire 95 // string will fit. 96 char* breakString(const char* str, float maxWidth) const; 97 98 // Computes the width of the string, in pixels. 99 float computeScaledStringWidth(const String8& str8) const; 100 101 // Computes the width of first N characters in the string. 102 float computeScaledStringWidth(const char* str, size_t len) const; 103 104 // Returns the font's glyph height. This is the full pixel height of the 105 // tallest glyph, both above and below the baseline, NOT adjusted by the 106 // current scale factor. 107 float getGlyphHeight() const; 108 109 // Like getGlyphHeight(), but result is scaled. getScaledGlyphHeight()110 float getScaledGlyphHeight() const { return getGlyphHeight() * mScale; } 111 112 // Convert an ASCII character to a glyph index. Returns the glyph for 113 // '?' if we have no glyph for the specified character. 114 size_t glyphIndex(char ch) const; 115 116 GLuint mTextureName; 117 float mScale; 118 119 // Number of pixels preserved at the left/right edges of the screen by 120 // drawWrappedString(). Not scaled. 121 float mBorderWidth; 122 123 // Distance to indent a broken line. Used by drawWrappedString(). 124 // Value will be adjusted by the current scale factor. 125 float mIndentMult; 126 127 // Screen dimensions. 128 uint32_t mScreenWidth; 129 uint32_t mScreenHeight; 130 131 // Static font info. 132 static bool mInitialized; 133 static uint32_t mXOffset[]; 134 135 static const char kWhitespace[]; 136 }; 137 138 }; // namespace android 139 140 #endif /*SCREENRECORD_TEXT_RENDER_H*/ 141