141 lines
4.3 KiB
C++
141 lines
4.3 KiB
C++
/*
|
|
* 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*/
|