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