123 lines
2.7 KiB
C++
123 lines
2.7 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#ifndef __FONTRENDERER__
|
|
#define __FONTRENDERER__
|
|
|
|
|
|
#include "font/font_extended.h"
|
|
#include "font/font_cache.h"
|
|
#include "math/vector.h"
|
|
|
|
|
|
namespace GS {
|
|
class Picture;
|
|
struct SubString;
|
|
|
|
/// Text widget state structure.
|
|
class TextState
|
|
{
|
|
int size;
|
|
float tracking, ///< Text tracking (horizontal offset between two characters).
|
|
leading; ///< Text heading (vertical offset between lines).
|
|
|
|
public:
|
|
|
|
enum Format
|
|
{
|
|
Line = 0,
|
|
Paragraph,
|
|
Column
|
|
};
|
|
|
|
enum Alignment
|
|
{
|
|
Left = 0,
|
|
Right,
|
|
Center,
|
|
Justify
|
|
};
|
|
|
|
sFontEx font;
|
|
Color color;
|
|
|
|
Format format; ///< Text format.
|
|
Alignment alignment; ///< Text alignment.
|
|
int column_width; ///< Text column width.
|
|
|
|
int GetSize() const { return font.IsValid() ? (int)(size * font->size_multiplier) : size; }
|
|
float GetTracking() const { return font.IsValid() ? tracking + font->tracking_offset : tracking; }
|
|
float GetLeading() const { return font.IsValid() ? leading + font->leading_offset : leading; }
|
|
|
|
void SetSize(int s) { size = s; }
|
|
void SetTracking(float t) { tracking = t; }
|
|
void SetLeading(float l) { leading = l; }
|
|
|
|
TextState()
|
|
{
|
|
size = 16;
|
|
color = Color::Black;
|
|
|
|
format = Line;
|
|
alignment = Left;
|
|
|
|
column_width = 80;
|
|
tracking = 0;
|
|
leading = 0;
|
|
}
|
|
};
|
|
|
|
/*
|
|
@short Font renderer.
|
|
@author Emmanuel Julien (ejulien@nworks.fr)
|
|
*/
|
|
class FontRenderer
|
|
{
|
|
public:
|
|
|
|
enum CommandCode
|
|
{
|
|
CommandNone = 0,
|
|
CommandColor,
|
|
CommandFont,
|
|
CommandSize,
|
|
|
|
CommandParseError
|
|
};
|
|
|
|
static float default_text_tracking;
|
|
static float default_text_heading;
|
|
|
|
/// Renderer command.
|
|
struct Command
|
|
{
|
|
CommandCode code;
|
|
Vector4 vector;
|
|
sIFont font;
|
|
};
|
|
|
|
protected:
|
|
|
|
/// Check current string for a command.
|
|
static const char *CheckCommand(const char *string, Command &command);
|
|
/// Get the next sub-string from the current text buffer.
|
|
static const char *FetchSubString(const char *string, SubString &sstr, TextState &state, int max_width, int max_character);
|
|
/// Draw a substring to a picture.
|
|
static void DrawSubString(SubString &sub_string, Picture &output, TextState &state, const iRect &out_rect, const iRect &clip_rect, int justification);
|
|
|
|
public:
|
|
|
|
/// Format a string using a text state, return the required output rectangle.
|
|
static iRect Format(const char *text, const TextState &in_state, const iRect &out_rect);
|
|
/// Compose a string using a text state.
|
|
static iRect Compose(Picture &output, const char *text, const TextState &state, const iRect &out_rect, const iRect &clip_rect);
|
|
};
|
|
|
|
} // GS
|
|
|
|
|
|
#endif // __FONTRENDERER__
|