26 DynamicTextPage(DynamicTextFont *font,
int page_number) :
31 set_compression(CM_off);
35 set_quality_level(text_quality_level);
37 _size = _font->get_page_size();
39 setup_2d_texture(_size[0], _size[1], T_unsigned_byte, font->get_tex_format());
42 std::ostringstream strm;
43 strm << font->get_name() <<
"_" << page_number;
47 set_keep_ram_image(
true);
49 set_minfilter(_font->get_minfilter());
50 set_magfilter(_font->get_magfilter());
52 set_anisotropic_degree(_font->get_anisotropic_degree());
56 set_wrap_u(text_wrap_mode);
57 set_wrap_v(text_wrap_mode);
58 set_border_color(font->get_bg());
61 fill_region(0, 0, _size[0], _size[1], font->get_bg());
68 DynamicTextGlyph *DynamicTextPage::
69 slot_glyph(
int character,
int x_size,
int y_size,
int margin,
70 PN_stdfloat advance) {
72 if (!find_hole(x, y, x_size, y_size)) {
78 PT(DynamicTextGlyph) glyph =
79 new DynamicTextGlyph(character,
this,
80 x, y, x_size, y_size, margin, advance);
81 _glyphs.push_back(glyph);
88 void DynamicTextPage::
89 fill_region(
int x,
int y,
int x_size,
int y_size,
const LColor &color) {
90 nassertv(x >= 0 && x + x_size <= _size[0] && y >= 0 && y + y_size <= _size[1]);
91 int num_components = get_num_components();
92 if (num_components == 1) {
95 if (get_format() != Texture::F_alpha) {
99 unsigned char v = (
unsigned char)(color[ci] * 255.0f);
101 unsigned char *image = modify_ram_image();
102 for (
int yi = y; yi < y + y_size; yi++) {
103 unsigned char *row = image + yi * _size[0];
104 memset(row + x, v, x_size);
107 }
else if (num_components == 2) {
115 v.p[0] = (
unsigned char)(color[0] * 255.0f);
116 v.p[1] = (
unsigned char)(color[3] * 255.0f);
118 uint16_t *image = (uint16_t *)modify_ram_image().p();
119 for (
int yi = y; yi < y + y_size; yi++) {
120 uint16_t *row = image + yi * _size[0] ;
121 for (
int xi = x; xi < x + x_size; xi++) {
126 }
else if (num_components == 3) {
129 unsigned char p0 = (
unsigned char)(color[2] * 255.0f);
130 unsigned char p1 = (
unsigned char)(color[1] * 255.0f);
131 unsigned char p2 = (
unsigned char)(color[0] * 255.0f);
133 unsigned char *image = modify_ram_image();
134 for (
int yi = y; yi < y + y_size; yi++) {
135 unsigned char *row = image + yi * _size[0] * 3;
136 for (
int xi = x; xi < x + x_size; xi++) {
138 row[xi * 3 + 1] = p1;
139 row[xi * 3 + 2] = p2;
150 v.p[0] = (
unsigned char)(color[2] * 255.0f);
151 v.p[1] = (
unsigned char)(color[1] * 255.0f);
152 v.p[2] = (
unsigned char)(color[0] * 255.0f);
153 v.p[3] = (
unsigned char)(color[3] * 255.0f);
155 uint32_t *image = (uint32_t *)modify_ram_image().p();
156 for (
int yi = y; yi < y + y_size; yi++) {
157 uint32_t *row = image + yi * _size[0];
158 for (
int xi = x; xi < x + x_size; xi++) {
171 int DynamicTextPage::
172 garbage_collect(DynamicTextFont *font) {
173 int removed_count = 0;
177 for (gi = _glyphs.begin(); gi != _glyphs.end(); ++gi) {
178 DynamicTextGlyph *glyph = (*gi);
179 if (glyph->get_ref_count() > 1) {
181 new_glyphs.insert(new_glyphs.end(), (*gi));
189 _glyphs.swap(new_glyphs);
190 return removed_count;
198 bool DynamicTextPage::
199 find_hole(
int &x,
int &y,
int x_size,
int y_size)
const {
201 while (y + y_size <= _size[1]) {
202 int next_y = _size[1];
205 while (x + x_size <= _size[0]) {
209 DynamicTextGlyph *overlap = find_overlap(x, y, x_size, y_size);
211 if (overlap ==
nullptr) {
216 next_x = overlap->_x + overlap->_x_size;
217 next_y = std::min(next_y, overlap->_y + overlap->_y_size);
218 nassertr(next_x > x,
false);
222 nassertr(next_y > y,
false);
237 DynamicTextGlyph *DynamicTextPage::
238 find_overlap(
int x,
int y,
int x_size,
int y_size)
const {
239 Glyphs::const_iterator gi;
240 for (gi = _glyphs.begin(); gi != _glyphs.end(); ++gi) {
241 DynamicTextGlyph *glyph = (*gi);
242 if (glyph->intersects(x, y, x_size, y_size)) {
251 #endif // HAVE_FREETYPE PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TypeHandle is the identifier used to differentiate C++ class types.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.