/*
* 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*/