| /* |
| * Copyright 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef SCREENRECORD_TEXT_RENDER_H |
| #define SCREENRECORD_TEXT_RENDER_H |
| |
| #include "Program.h" |
| |
| #include <utils/String8.h> |
| #include <utils/Errors.h> |
| |
| #include <GLES2/gl2.h> |
| |
| |
| namespace android { |
| |
| /* |
| * Simple font representation. |
| * |
| * Not thread-safe. |
| */ |
| class TextRenderer { |
| public: |
| TextRenderer() : |
| mTextureName(0), |
| mScale(1.0f), |
| mBorderWidth(10.0f), |
| mIndentMult(30.0f), |
| mScreenWidth(0), |
| mScreenHeight(0) |
| {} |
| ~TextRenderer() {} |
| |
| // Load the glyph bitmap into a 2D texture in the current context. |
| status_t loadIntoTexture(); |
| |
| // Set the screen dimensions, used for scaling and line wrap. |
| void setScreenSize(uint32_t width, uint32_t height) { |
| mScreenWidth = width; |
| mScreenHeight = height; |
| } |
| |
| // Get/set the font scaling. |
| float getScale() const { return mScale; } |
| void setScale(float scale) { mScale = scale; } |
| |
| // Set the font scaling based on the desired number of lines per screen. |
| // The display's tallest axis is used, so if the device is in landscape |
| // the screen will fit fewer lines. |
| void setProportionalScale(float linesPerScreen); |
| |
| // Render the text string at the specified coordinates. Pass in the |
| // upper-left corner in non-GL-flipped coordinates, i.e. to print text |
| // at the top left of the screen use (0,0). |
| // |
| // Set blend func (1, 1-srcAlpha) before calling if drawing onto |
| // something other than black. |
| void drawString(const Program& program, const float* texMatrix, |
| float x, float y, const String8& str) const; |
| |
| // Draw a string, possibly wrapping it at the screen boundary. Top-left |
| // is at (0,0). |
| // |
| // Returns the updated Y position. |
| float drawWrappedString(const Program& texRender, float xpos, float ypos, |
| const String8& str); |
| |
| // Returns the name of the texture the font was loaded into. |
| GLuint getTextureName() const { return mTextureName; } |
| |
| private: |
| TextRenderer(const TextRenderer&); |
| TextRenderer& operator=(const TextRenderer&); |
| |
| // Perform one-time initialization. |
| static void initOnce(); |
| |
| // Populate the mXOffset array. |
| static void initXOffset(); |
| |
| // Find a good place to break the string. Returns NULL if the entire |
| // string will fit. |
| char* breakString(const char* str, float maxWidth) const; |
| |
| // Computes the width of the string, in pixels. |
| float computeScaledStringWidth(const String8& str8) const; |
| |
| // Computes the width of first N characters in the string. |
| float computeScaledStringWidth(const char* str, size_t len) const; |
| |
| // Returns the font's glyph height. This is the full pixel height of the |
| // tallest glyph, both above and below the baseline, NOT adjusted by the |
| // current scale factor. |
| float getGlyphHeight() const; |
| |
| // Like getGlyphHeight(), but result is scaled. |
| float getScaledGlyphHeight() const { return getGlyphHeight() * mScale; } |
| |
| // Convert an ASCII character to a glyph index. Returns the glyph for |
| // '?' if we have no glyph for the specified character. |
| size_t glyphIndex(char ch) const; |
| |
| GLuint mTextureName; |
| float mScale; |
| |
| // Number of pixels preserved at the left/right edges of the screen by |
| // drawWrappedString(). Not scaled. |
| float mBorderWidth; |
| |
| // Distance to indent a broken line. Used by drawWrappedString(). |
| // Value will be adjusted by the current scale factor. |
| float mIndentMult; |
| |
| // Screen dimensions. |
| uint32_t mScreenWidth; |
| uint32_t mScreenHeight; |
| |
| // Static font info. |
| static bool mInitialized; |
| static uint32_t mXOffset[]; |
| |
| static const char kWhitespace[]; |
| }; |
| |
| }; // namespace android |
| |
| #endif /*SCREENRECORD_TEXT_RENDER_H*/ |