448 lines
13 KiB
Text
448 lines
13 KiB
Text
|
/**
|
||
|
* 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 dynamicTextFont.I
|
||
|
* @author drose
|
||
|
* @date 2002-02-08
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Disambiguates the get_name() method between that inherited from TextFont
|
||
|
* and that inherited from FreetypeFont.
|
||
|
*/
|
||
|
INLINE const std::string &DynamicTextFont::
|
||
|
get_name() const {
|
||
|
return TextFont::get_name();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the point size of the font. This controls the apparent size of the
|
||
|
* font onscreen. By convention, a 10 point font is about 1 screen unit high.
|
||
|
*
|
||
|
* This should only be called before any characters have been requested out of
|
||
|
* the font, or immediately after calling clear().
|
||
|
*/
|
||
|
INLINE bool DynamicTextFont::
|
||
|
set_point_size(PN_stdfloat point_size) {
|
||
|
// If this assertion fails, you didn't call clear() first. RTFM.
|
||
|
nassertr(get_num_pages() == 0, false);
|
||
|
|
||
|
return FreetypeFont::set_point_size(point_size);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the point size of the font.
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_point_size() const {
|
||
|
return FreetypeFont::get_point_size();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the resolution of the texture map, and hence the clarity of the
|
||
|
* resulting font. This sets the number of pixels in the texture map that are
|
||
|
* used for each onscreen unit.
|
||
|
*
|
||
|
* Setting this number larger results in an easier to read font, but at the
|
||
|
* cost of more texture memory.
|
||
|
*
|
||
|
* This should only be called before any characters have been requested out of
|
||
|
* the font, or immediately after calling clear().
|
||
|
*/
|
||
|
INLINE bool DynamicTextFont::
|
||
|
set_pixels_per_unit(PN_stdfloat pixels_per_unit) {
|
||
|
// If this assertion fails, you didn't call clear() first. RTFM.
|
||
|
nassertr(get_num_pages() == 0, false);
|
||
|
|
||
|
return FreetypeFont::set_pixels_per_unit(pixels_per_unit);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the resolution of the texture map. See set_pixels_per_unit().
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_pixels_per_unit() const {
|
||
|
return FreetypeFont::get_pixels_per_unit();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the factor by which the font is rendered larger by the FreeType
|
||
|
* library before being filtered down to its actual size in the texture as
|
||
|
* specified by set_pixels_per_unit(). This may be set to a number larger
|
||
|
* than 1.0 to improve the font's antialiasing (since FreeType doesn't really
|
||
|
* do a swell job of antialiasing by itself). There is some performance
|
||
|
* implication for setting this different than 1.0, but it is probably small.
|
||
|
*
|
||
|
* This should only be called before any characters have been requested out of
|
||
|
* the font, or immediately after calling clear().
|
||
|
*/
|
||
|
INLINE bool DynamicTextFont::
|
||
|
set_scale_factor(PN_stdfloat scale_factor) {
|
||
|
// If this assertion fails, you didn't call clear() first. RTFM.
|
||
|
nassertr(get_num_pages() == 0, false);
|
||
|
|
||
|
return FreetypeFont::set_scale_factor(scale_factor);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the antialiasing scale factor. See set_scale_factor().
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_scale_factor() const {
|
||
|
return FreetypeFont::get_scale_factor();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets whether the Freetype library's built-in antialias mode is enabled.
|
||
|
* There are two unrelated ways to achieve antialiasing: with Freetype's
|
||
|
* native antialias mode, and with the use of a scale_factor greater than one.
|
||
|
* By default, both modes are enabled.
|
||
|
*
|
||
|
* At low resolutions, some fonts may do better with one mode or the other.
|
||
|
* In general, Freetype's native antialiasing will produce less blurry
|
||
|
* results, but may introduce more artifacts.
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_native_antialias(bool native_antialias) {
|
||
|
// If this assertion fails, you didn't call clear() first. RTFM.
|
||
|
nassertv(get_num_pages() == 0);
|
||
|
|
||
|
FreetypeFont::set_native_antialias(native_antialias);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns whether Freetype's built-in antialias mode is enabled. See
|
||
|
* set_native_antialias().
|
||
|
*/
|
||
|
INLINE bool DynamicTextFont::
|
||
|
get_native_antialias() const {
|
||
|
return FreetypeFont::get_native_antialias();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This is used to report whether the requested pixel size is being only
|
||
|
* approximated by a fixed-pixel-size font. This returns 0 in the normal
|
||
|
* case, in which a scalable font is used, or the fixed-pixel-size font has
|
||
|
* exactly the requested pixel size.
|
||
|
*
|
||
|
* If this returns non-zero, it is the pixel size of the font that we are
|
||
|
* using to approximate our desired size.
|
||
|
*/
|
||
|
INLINE int DynamicTextFont::
|
||
|
get_font_pixel_size() const {
|
||
|
return FreetypeFont::get_font_pixel_size();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of units high each line of text is.
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_line_height() const {
|
||
|
return TextFont::get_line_height();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of units wide a space is.
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_space_advance() const {
|
||
|
return TextFont::get_space_advance();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the number of pixels of padding that is added around the border of
|
||
|
* each glyph before adding it to the texture map. This reduces the bleed in
|
||
|
* from neighboring glyphs in the texture map.
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_texture_margin(int texture_margin) {
|
||
|
_texture_margin = texture_margin;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of pixels of padding that is added around the border of
|
||
|
* each glyph in the texture map. See set_texture_margin().
|
||
|
*/
|
||
|
INLINE int DynamicTextFont::
|
||
|
get_texture_margin() const {
|
||
|
return _texture_margin;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the number of pixels of padding that is included around each glyph in
|
||
|
* the generated polygons. This helps prevent the edges of the glyphs from
|
||
|
* being cut off at small minifications. It is not related to the amount of
|
||
|
* extra pixels reserved in the texture map (but it should be set somewhat
|
||
|
* smaller than this number, which is controlled by set_texture_margin(), to
|
||
|
* prevent bleed-in from neighboring letters in the texture).
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_poly_margin(PN_stdfloat poly_margin) {
|
||
|
_poly_margin = poly_margin;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of pixels of padding that is included around each glyph
|
||
|
* in the generated polygons. See set_poly_margin().
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_poly_margin() const {
|
||
|
return _poly_margin;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the x, y size of the textures that are created for the
|
||
|
* DynamicTextFont.
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_page_size(const LVecBase2i &page_size) {
|
||
|
_page_size = page_size;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the x, y size of the textures that are created for the
|
||
|
* DynamicTextFont.
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_page_size(int x_size, int y_size) {
|
||
|
_page_size.set(x_size, y_size);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the size of the textures that are created for the DynamicTextFont.
|
||
|
* See set_page_size().
|
||
|
*/
|
||
|
INLINE const LVecBase2i &DynamicTextFont::
|
||
|
get_page_size() const {
|
||
|
return _page_size;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the x size of the textures that are created for the
|
||
|
* DynamicTextFont. See set_page_size().
|
||
|
*/
|
||
|
INLINE int DynamicTextFont::
|
||
|
get_page_x_size() const {
|
||
|
return _page_size.get_x();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the y size of the textures that are created for the
|
||
|
* DynamicTextFont. See set_page_size().
|
||
|
*/
|
||
|
INLINE int DynamicTextFont::
|
||
|
get_page_y_size() const {
|
||
|
return _page_size.get_y();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the filter type used when minimizing the textures created for this
|
||
|
* font.
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_minfilter(SamplerState::FilterType filter) {
|
||
|
_minfilter = filter;
|
||
|
update_filters();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the filter type used when minimizing the textures created for this
|
||
|
* font.
|
||
|
*/
|
||
|
INLINE SamplerState::FilterType DynamicTextFont::
|
||
|
get_minfilter() const {
|
||
|
return _minfilter;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the filter type used when enlarging the textures created for this
|
||
|
* font.
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_magfilter(SamplerState::FilterType filter) {
|
||
|
_magfilter = filter;
|
||
|
update_filters();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the filter type used when enlarging the textures created for this
|
||
|
* font.
|
||
|
*/
|
||
|
INLINE SamplerState::FilterType DynamicTextFont::
|
||
|
get_magfilter() const {
|
||
|
return _magfilter;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enables or disables anisotropic filtering on the textures created for this
|
||
|
* font. The default value is specified by the text-anisotropic-degree
|
||
|
* variable. See Texture::set_anisotropic_degree().
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_anisotropic_degree(int anisotropic_degree) {
|
||
|
_anisotropic_degree = anisotropic_degree;
|
||
|
update_filters();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the current anisotropic degree for textures created for this font.
|
||
|
* See set_anisotropic_degree().
|
||
|
*/
|
||
|
INLINE int DynamicTextFont::
|
||
|
get_anisotropic_degree() const {
|
||
|
return _anisotropic_degree;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Specifies the way the glyphs on this particular font are generated. The
|
||
|
* default is RM_texture, which is the only mode supported for bitmap fonts.
|
||
|
* Other modes are possible for most modern fonts.
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_render_mode(DynamicTextFont::RenderMode render_mode) {
|
||
|
_render_mode = render_mode;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the way the glyphs on this particular font are generated. See
|
||
|
* set_render_mode().
|
||
|
*/
|
||
|
INLINE DynamicTextFont::RenderMode DynamicTextFont::
|
||
|
get_render_mode() const {
|
||
|
return _render_mode;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Changes the color of the foreground pixels of the font as they are rendered
|
||
|
* into the font texture. The default is (1, 1, 1, 1), or opaque white, which
|
||
|
* allows text created with the font to be colored individually. Normally,
|
||
|
* you would not change this unless you really need a particular color effect
|
||
|
* to appear in the font itself.
|
||
|
*
|
||
|
* This should only be called before any characters have been requested out of
|
||
|
* the font, or immediately after calling clear().
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_fg(const LColor &fg) {
|
||
|
// If this assertion fails, you didn't call clear() first. RTFM.
|
||
|
nassertv(get_num_pages() == 0);
|
||
|
|
||
|
_fg = fg;
|
||
|
determine_tex_format();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the color of the foreground pixels of the font as they are rendered
|
||
|
* into the font texture. See set_fg().
|
||
|
*/
|
||
|
INLINE const LColor &DynamicTextFont::
|
||
|
get_fg() const {
|
||
|
return _fg;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Changes the color of the background pixels of the font as they are rendered
|
||
|
* into the font texture. The default is (1, 1, 1, 0), or transparent white,
|
||
|
* which allows text created with the font to be colored individually. (Note
|
||
|
* that it should not generally be (0, 0, 0, 0), which would tend to bleed
|
||
|
* into the foreground color, unless you have also specified a outline color
|
||
|
* of (0, 0, 0, 1)) .
|
||
|
*
|
||
|
* Normally, you would not change this unless you really need a particular
|
||
|
* color effect to appear in the font itself.
|
||
|
*
|
||
|
* This should only be called before any characters have been requested out of
|
||
|
* the font, or immediately after calling clear().
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_bg(const LColor &bg) {
|
||
|
// If this assertion fails, you didn't call clear() first. RTFM.
|
||
|
nassertv(get_num_pages() == 0);
|
||
|
|
||
|
_bg = bg;
|
||
|
determine_tex_format();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the color of the background pixels of the font as they are rendered
|
||
|
* into the font texture. See set_bg().
|
||
|
*/
|
||
|
INLINE const LColor &DynamicTextFont::
|
||
|
get_bg() const {
|
||
|
return _bg;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Sets up the font to have an outline around each font letter. This is
|
||
|
* achieved via a Gaussian post-process as each letter is generated; there is
|
||
|
* some runtime cost for this effect, but it is minimal as each letter is
|
||
|
* normally generated only once and then cached.
|
||
|
*
|
||
|
* The color is the desired color of the outline, width is the number of
|
||
|
* points beyond the letter that the outline extends (a typical font is 10
|
||
|
* points high), and feather is a number in the range 0.0 .. 1.0 that controls
|
||
|
* the softness of the outline. Set the width to 0.0 to disable the outline.
|
||
|
*
|
||
|
* This should only be called before any characters have been requested out of
|
||
|
* the font, or immediately after calling clear().
|
||
|
*/
|
||
|
INLINE void DynamicTextFont::
|
||
|
set_outline(const LColor &outline_color, PN_stdfloat outline_width,
|
||
|
PN_stdfloat outline_feather) {
|
||
|
// If this assertion fails, you didn't call clear() first. RTFM.
|
||
|
nassertv(get_num_pages() == 0);
|
||
|
|
||
|
_outline_color = outline_color;
|
||
|
_outline_width = outline_width;
|
||
|
_outline_feather = outline_feather;
|
||
|
determine_tex_format();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the color of the outline pixels of the font as they are rendered
|
||
|
* into the font texture. See set_outline().
|
||
|
*/
|
||
|
INLINE const LColor &DynamicTextFont::
|
||
|
get_outline_color() const {
|
||
|
return _outline_color;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the width of the outline pixels of the font, as the number of
|
||
|
* points beyond each letter. See set_outline().
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_outline_width() const {
|
||
|
return _outline_width;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the softness of the outline pixels of the font, as a value in the
|
||
|
* range 0.0 to 1.0. See set_outline().
|
||
|
*/
|
||
|
INLINE PN_stdfloat DynamicTextFont::
|
||
|
get_outline_feather() const {
|
||
|
return _outline_feather;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the texture format used to render the individual pages. This is
|
||
|
* set automatically according to the colors selected.
|
||
|
*/
|
||
|
INLINE Texture::Format DynamicTextFont::
|
||
|
get_tex_format() const {
|
||
|
return _tex_format;
|
||
|
}
|
||
|
|
||
|
|
||
|
INLINE std::ostream &
|
||
|
operator << (std::ostream &out, const DynamicTextFont &dtf) {
|
||
|
return out << dtf.get_name();
|
||
|
}
|