287 lines
10 KiB
C
287 lines
10 KiB
C
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file textProperties.h
|
||
|
* @author drose
|
||
|
* @date 2004-04-06
|
||
|
*/
|
||
|
|
||
|
#ifndef TEXTPROPERTIES_H
|
||
|
#define TEXTPROPERTIES_H
|
||
|
|
||
|
#include "pandabase.h"
|
||
|
|
||
|
#include "config_text.h"
|
||
|
#include "luse.h"
|
||
|
#include "textFont.h"
|
||
|
#include "pointerTo.h"
|
||
|
#include "renderState.h"
|
||
|
|
||
|
/**
|
||
|
* This defines the set of visual properties that may be assigned to the
|
||
|
* individual characters of the text. (Properties which affect the overall
|
||
|
* block of text can only be specified on the TextNode directly).
|
||
|
*
|
||
|
* Typically, there is just one set of properties on a given block of text,
|
||
|
* which is set directly on the TextNode (TextNode inherits from
|
||
|
* TextProperties). That makes all of the text within a particular block have
|
||
|
* the same appearance.
|
||
|
*
|
||
|
* This separate class exists in order to implement multiple different kinds
|
||
|
* of text appearing within one block. The text string itself may reference a
|
||
|
* TextProperties structure by name using the \1 and \2 tokens embedded within
|
||
|
* the string; each nested TextProperties structure modifies the appearance of
|
||
|
* subsequent text within the block.
|
||
|
*/
|
||
|
class EXPCL_PANDA_TEXT TextProperties {
|
||
|
PUBLISHED:
|
||
|
enum Alignment {
|
||
|
A_left,
|
||
|
A_right,
|
||
|
A_center,
|
||
|
A_boxed_left,
|
||
|
A_boxed_right,
|
||
|
A_boxed_center
|
||
|
};
|
||
|
|
||
|
enum Direction {
|
||
|
D_ltr,
|
||
|
D_rtl,
|
||
|
};
|
||
|
|
||
|
TextProperties();
|
||
|
TextProperties(const TextProperties ©);
|
||
|
void operator = (const TextProperties ©);
|
||
|
|
||
|
bool operator == (const TextProperties &other) const;
|
||
|
INLINE bool operator != (const TextProperties &other) const;
|
||
|
|
||
|
void clear();
|
||
|
INLINE bool is_any_specified() const;
|
||
|
|
||
|
INLINE static void set_default_font(TextFont *);
|
||
|
INLINE static TextFont *get_default_font();
|
||
|
|
||
|
INLINE void set_font(TextFont *font);
|
||
|
INLINE void clear_font();
|
||
|
INLINE bool has_font() const;
|
||
|
INLINE TextFont *get_font() const;
|
||
|
|
||
|
INLINE void set_small_caps(bool small_caps);
|
||
|
INLINE void clear_small_caps();
|
||
|
INLINE bool has_small_caps() const;
|
||
|
INLINE bool get_small_caps() const;
|
||
|
|
||
|
INLINE void set_small_caps_scale(PN_stdfloat small_caps_scale);
|
||
|
INLINE void clear_small_caps_scale();
|
||
|
INLINE bool has_small_caps_scale() const;
|
||
|
INLINE PN_stdfloat get_small_caps_scale() const;
|
||
|
|
||
|
INLINE void set_slant(PN_stdfloat slant);
|
||
|
INLINE void clear_slant();
|
||
|
INLINE bool has_slant() const;
|
||
|
INLINE PN_stdfloat get_slant() const;
|
||
|
|
||
|
INLINE void set_underscore(bool underscore);
|
||
|
INLINE void clear_underscore();
|
||
|
INLINE bool has_underscore() const;
|
||
|
INLINE bool get_underscore() const;
|
||
|
|
||
|
INLINE void set_underscore_height(PN_stdfloat underscore_height);
|
||
|
INLINE void clear_underscore_height();
|
||
|
INLINE bool has_underscore_height() const;
|
||
|
INLINE PN_stdfloat get_underscore_height() const;
|
||
|
|
||
|
INLINE void set_align(Alignment align_type);
|
||
|
INLINE void clear_align();
|
||
|
INLINE bool has_align() const;
|
||
|
INLINE Alignment get_align() const;
|
||
|
|
||
|
INLINE void set_indent(PN_stdfloat indent);
|
||
|
INLINE void clear_indent();
|
||
|
INLINE bool has_indent() const;
|
||
|
INLINE PN_stdfloat get_indent() const;
|
||
|
|
||
|
INLINE void set_wordwrap(PN_stdfloat wordwrap);
|
||
|
INLINE void clear_wordwrap();
|
||
|
INLINE bool has_wordwrap() const;
|
||
|
INLINE PN_stdfloat get_wordwrap() const;
|
||
|
|
||
|
INLINE void set_preserve_trailing_whitespace(bool preserve_trailing_whitespace);
|
||
|
INLINE void clear_preserve_trailing_whitespace();
|
||
|
INLINE bool has_preserve_trailing_whitespace() const;
|
||
|
INLINE bool get_preserve_trailing_whitespace() const;
|
||
|
|
||
|
INLINE void set_text_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a);
|
||
|
INLINE void set_text_color(const LColor &text_color);
|
||
|
INLINE void clear_text_color();
|
||
|
INLINE bool has_text_color() const;
|
||
|
INLINE LColor get_text_color() const;
|
||
|
|
||
|
INLINE void set_shadow_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a);
|
||
|
INLINE void set_shadow_color(const LColor &shadow_color);
|
||
|
INLINE void clear_shadow_color();
|
||
|
INLINE bool has_shadow_color() const;
|
||
|
INLINE LColor get_shadow_color() const;
|
||
|
|
||
|
INLINE void set_shadow(PN_stdfloat xoffset, PN_stdfloat yoffset);
|
||
|
INLINE void set_shadow(const LVecBase2 &shadow_offset);
|
||
|
INLINE void clear_shadow();
|
||
|
INLINE bool has_shadow() const;
|
||
|
INLINE LVector2 get_shadow() const;
|
||
|
|
||
|
INLINE void set_bin(const std::string &bin);
|
||
|
INLINE void clear_bin();
|
||
|
INLINE bool has_bin() const;
|
||
|
INLINE const std::string &get_bin() const;
|
||
|
|
||
|
INLINE int set_draw_order(int draw_order);
|
||
|
INLINE void clear_draw_order();
|
||
|
INLINE bool has_draw_order() const;
|
||
|
INLINE int get_draw_order() const;
|
||
|
|
||
|
INLINE void set_tab_width(PN_stdfloat tab_width);
|
||
|
INLINE void clear_tab_width();
|
||
|
INLINE bool has_tab_width() const;
|
||
|
INLINE PN_stdfloat get_tab_width() const;
|
||
|
|
||
|
INLINE void set_glyph_scale(PN_stdfloat glyph_scale);
|
||
|
INLINE void clear_glyph_scale();
|
||
|
INLINE bool has_glyph_scale() const;
|
||
|
INLINE PN_stdfloat get_glyph_scale() const;
|
||
|
|
||
|
INLINE void set_glyph_shift(PN_stdfloat glyph_shift);
|
||
|
INLINE void clear_glyph_shift();
|
||
|
INLINE bool has_glyph_shift() const;
|
||
|
INLINE PN_stdfloat get_glyph_shift() const;
|
||
|
|
||
|
INLINE void set_text_scale(PN_stdfloat text_scale);
|
||
|
INLINE void clear_text_scale();
|
||
|
INLINE bool has_text_scale() const;
|
||
|
INLINE PN_stdfloat get_text_scale() const;
|
||
|
|
||
|
INLINE void set_direction(Direction direction);
|
||
|
INLINE void clear_direction();
|
||
|
INLINE bool has_direction() const;
|
||
|
INLINE Direction get_direction() const;
|
||
|
|
||
|
void add_properties(const TextProperties &other);
|
||
|
|
||
|
void write(std::ostream &out, int indent_level = 0) const;
|
||
|
|
||
|
PUBLISHED:
|
||
|
MAKE_PROPERTY2(font, has_font, get_font, set_font, clear_font);
|
||
|
MAKE_PROPERTY2(small_caps, has_small_caps, get_small_caps,
|
||
|
set_small_caps, clear_small_caps);
|
||
|
MAKE_PROPERTY2(small_caps_scale, has_small_caps_scale, get_small_caps_scale,
|
||
|
set_small_caps_scale, clear_small_caps_scale);
|
||
|
MAKE_PROPERTY2(slant, has_slant, get_slant, set_slant, clear_slant);
|
||
|
MAKE_PROPERTY2(underscore, has_underscore, get_underscore,
|
||
|
set_underscore, clear_underscore);
|
||
|
MAKE_PROPERTY2(underscore_height, has_underscore_height, get_underscore_height,
|
||
|
set_underscore_height, clear_underscore_height);
|
||
|
MAKE_PROPERTY2(align, has_align, get_align, set_align, clear_align);
|
||
|
MAKE_PROPERTY2(indent, has_indent, get_indent, set_indent, clear_indent);
|
||
|
MAKE_PROPERTY2(wordwrap, has_wordwrap, get_wordwrap, set_wordwrap, clear_wordwrap);
|
||
|
MAKE_PROPERTY2(preserve_trailing_whitespace,
|
||
|
has_preserve_trailing_whitespace, get_preserve_trailing_whitespace,
|
||
|
set_preserve_trailing_whitespace, clear_preserve_trailing_whitespace);
|
||
|
MAKE_PROPERTY2(text_color, has_text_color, get_text_color,
|
||
|
set_text_color, clear_text_color);
|
||
|
MAKE_PROPERTY2(shadow_color, has_shadow_color, get_shadow_color,
|
||
|
set_shadow_color, clear_shadow_color);
|
||
|
MAKE_PROPERTY2(shadow, has_shadow, get_shadow, set_shadow, clear_shadow);
|
||
|
MAKE_PROPERTY2(bin, has_bin, get_bin, set_bin, clear_bin);
|
||
|
MAKE_PROPERTY2(draw_order, has_draw_order, get_draw_order,
|
||
|
set_draw_order, clear_draw_order);
|
||
|
MAKE_PROPERTY2(tab_width, has_tab_width, get_tab_width,
|
||
|
set_tab_width, clear_tab_width);
|
||
|
MAKE_PROPERTY2(glyph_scale, has_glyph_scale, get_glyph_scale,
|
||
|
set_glyph_scale, clear_glyph_scale);
|
||
|
MAKE_PROPERTY2(glyph_shift, has_glyph_shift, get_glyph_shift,
|
||
|
set_glyph_shift, clear_glyph_shift);
|
||
|
MAKE_PROPERTY2(text_scale, has_text_scale, get_text_scale,
|
||
|
set_text_scale, clear_text_scale);
|
||
|
MAKE_PROPERTY2(direction, has_direction, get_direction,
|
||
|
set_direction, clear_direction);
|
||
|
|
||
|
public:
|
||
|
const RenderState *get_text_state() const;
|
||
|
const RenderState *get_shadow_state() const;
|
||
|
|
||
|
private:
|
||
|
static void load_default_font();
|
||
|
|
||
|
enum Flags {
|
||
|
F_has_font = 0x00000001,
|
||
|
F_has_small_caps = 0x00000002,
|
||
|
F_has_small_caps_scale = 0x00000004,
|
||
|
F_has_slant = 0x00000008,
|
||
|
F_has_align = 0x00000010,
|
||
|
F_has_indent = 0x00000020,
|
||
|
F_has_wordwrap = 0x00000040,
|
||
|
F_has_preserve_trailing_whitespace = 0x00000080,
|
||
|
F_has_text_color = 0x00000100,
|
||
|
F_has_shadow_color = 0x00000200,
|
||
|
F_has_shadow = 0x00000400,
|
||
|
F_has_bin = 0x00000800,
|
||
|
F_has_draw_order = 0x00001000,
|
||
|
F_has_tab_width = 0x00002000,
|
||
|
F_has_glyph_scale = 0x00004000,
|
||
|
F_has_glyph_shift = 0x00008000,
|
||
|
F_has_underscore = 0x00010000,
|
||
|
F_has_underscore_height = 0x00020000,
|
||
|
F_has_text_scale = 0x00040000,
|
||
|
F_has_direction = 0x00080000,
|
||
|
};
|
||
|
|
||
|
int _specified;
|
||
|
|
||
|
PT(TextFont) _font;
|
||
|
bool _small_caps;
|
||
|
PN_stdfloat _small_caps_scale;
|
||
|
PN_stdfloat _slant;
|
||
|
bool _underscore;
|
||
|
PN_stdfloat _underscore_height;
|
||
|
Alignment _align;
|
||
|
PN_stdfloat _indent_width;
|
||
|
PN_stdfloat _wordwrap_width;
|
||
|
bool _preserve_trailing_whitespace;
|
||
|
LColor _text_color;
|
||
|
LColor _shadow_color;
|
||
|
LVector2 _shadow_offset;
|
||
|
std::string _bin;
|
||
|
int _draw_order;
|
||
|
PN_stdfloat _tab_width;
|
||
|
PN_stdfloat _glyph_scale;
|
||
|
PN_stdfloat _glyph_shift;
|
||
|
PN_stdfloat _text_scale;
|
||
|
Direction _direction;
|
||
|
|
||
|
mutable CPT(RenderState) _text_state;
|
||
|
mutable CPT(RenderState) _shadow_state;
|
||
|
|
||
|
static PT(TextFont) _default_font;
|
||
|
static bool _loaded_default_font;
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
register_type(_type_handle, "TextProperties");
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
};
|
||
|
|
||
|
#include "textProperties.I"
|
||
|
|
||
|
#endif
|