Panda3D

geomTextGlyph.cxx
Go to the documentation of this file.
1 /**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file geomTextGlyph.cxx
10 * @author drose
11 * @date 2005-03-31
12 */
13
14 #include "geomTextGlyph.h"
15 #include "datagramIterator.h"
16 #include "bamReader.h"
17 #include "indent.h"
18
19 TypeHandle GeomTextGlyph::_type_handle;
20
21
22 /**
23 *
24 */
25 GeomTextGlyph::
26 GeomTextGlyph(const TextGlyph *glyph, const GeomVertexData *data) :
27 Geom(data)
28 {
29 // Initially, there is only one glyph in the Geom. There might be
30 // additional Glyphs later when we flatten the graph and call Geom::unify().
31 if (glyph != nullptr) {
32 _glyphs.reserve(1);
33 _glyphs.push_back(glyph);
34 }
35 }
36
37 /**
38 *
39 */
40 GeomTextGlyph::
41 GeomTextGlyph(const GeomVertexData *data) :
42 Geom(data)
43 {
44 // With this constructor, there are no glyphs initially.
45 }
46
47 /**
48 *
49 */
50 GeomTextGlyph::
51 GeomTextGlyph(const GeomTextGlyph &copy) :
52 Geom(copy),
53 _glyphs(copy._glyphs)
54 {
55 }
56
57 /**
58 *
59 */
60 GeomTextGlyph::
61 GeomTextGlyph(const Geom &copy, const TextGlyph *glyph) :
62 Geom(copy)
63 {
64 if (glyph != nullptr) {
65 _glyphs.reserve(1);
66 _glyphs.push_back(glyph);
67 }
68 }
69
70 /**
71 *
72 */
73 void GeomTextGlyph::
74 operator = (const GeomTextGlyph &copy) {
75 Geom::operator = (copy);
76 _glyphs = copy._glyphs;
77 }
78
79 /**
80 *
81 */
82 GeomTextGlyph::
83 ~GeomTextGlyph() {
84 }
85
86 /**
87 * Returns a newly-allocated Geom that is a shallow copy of this one. It will
88 * be a different Geom pointer, but its internal data may or may not be shared
89 * with that of the original Geom.
90 */
91 Geom *GeomTextGlyph::
92 make_copy() const {
93 return new GeomTextGlyph(*this);
94 }
95
96 /**
97 * Copies the primitives from the indicated Geom into this one. This does
98 * require that both Geoms contain the same fundamental type primitives, both
99 * have a compatible shade model, and both use the same GeomVertexData. Both
100 * Geoms must also be the same specific class type (i.e. if one is a
101 * GeomTextGlyph, they both must be.)
102 *
103 * Returns true if the copy is successful, or false otherwise (because the
104 * Geoms were mismatched).
105 */
106 bool GeomTextGlyph::
107 copy_primitives_from(const Geom *other) {
108 if (!Geom::copy_primitives_from(other)) {
109 return false;
110 }
111
112 const GeomTextGlyph *tother;
113 DCAST_INTO_R(tother, other, false);
114
115 // Also copy the glyph pointers.
116 _glyphs.reserve(_glyphs.size() + tother->_glyphs.size());
117 _glyphs.insert(_glyphs.end(), tother->_glyphs.begin(), tother->_glyphs.end());
118
119 return true;
120 }
121
122 /**
123 * Records the reference count of the other Geom within this Geom, as if the
124 * primitives were copied in via copy_primitives_from() (but does not actually
125 * copy any primitives). This is particularly necessary for GeomTextGlyph's
126 * reference counting mechanism.
127 *
128 * Does nothing if the other Geom is not a GeomTextGlyph.
129 */
130 void GeomTextGlyph::
131 count_geom(const Geom *other) {
132 if (other->is_of_type(GeomTextGlyph::get_class_type())) {
133 const GeomTextGlyph *tother;
134 DCAST_INTO_V(tother, other);
135
136 _glyphs.reserve(_glyphs.size() + tother->_glyphs.size());
137 _glyphs.insert(_glyphs.end(), tother->_glyphs.begin(), tother->_glyphs.end());
138 }
139 }
140
141 /**
142 *
143 */
144 void GeomTextGlyph::
145 output(std::ostream &out) const {
146 Geom::output(out);
147 out << ", glyphs: [";
148 Glyphs::const_iterator gi;
149 for (gi = _glyphs.begin(); gi != _glyphs.end(); ++gi) {
150 const TextGlyph *glyph = (*gi);
151 nassertv(glyph != nullptr);
152 out << " " << glyph->get_character();
153 }
154 out << " ]";
155 }
156
157 /**
158 *
159 */
160 void GeomTextGlyph::
161 write(std::ostream &out, int indent_level) const {
162 Geom::write(out, indent_level);
163 indent(out, indent_level)
164 << "Glyphs: [";
165 Glyphs::const_iterator gi;
166 for (gi = _glyphs.begin(); gi != _glyphs.end(); ++gi) {
167 const TextGlyph *glyph = (*gi);
168 nassertv(glyph != nullptr);
169 out << " " << glyph->get_character();
170 }
171 out << " ]\n";
172 }
173
174 /**
175 * Adds a glyph to the list of glyphs referenced by this Geom.
176 */
177 void GeomTextGlyph::
178 add_glyph(const TextGlyph *glyph) {
179 _glyphs.push_back(glyph);
180 }
181
182 /**
183 * Factory method to generate a GeomTextGlyph object
184 */
185 void GeomTextGlyph::
186 register_with_read_factory() {
187 BamReader::get_factory()->register_factory(get_class_type(), make_GeomTextGlyph);
188 }
189
190 /**
191 * Factory method to generate a GeomTextGlyph object
192 */
193 TypedWritable* GeomTextGlyph::
194 make_GeomTextGlyph(const FactoryParams &params) {
195 GeomTextGlyph *me = new GeomTextGlyph(nullptr,
196 nullptr);
197 DatagramIterator scan;
198 BamReader *manager;
199
200 parse_params(params, scan, manager);
201 me->fillin(scan, manager);
202 return me;
203 }
bamReader.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
parse_params
void parse_params(const FactoryParams &params, DatagramIterator &scan, BamReader *&manager)
Takes in a FactoryParams, passed from a WritableFactory into any TypedWritable's make function,...
Definition: bamReader.I:275
BamReader
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
BamReader::get_factory
static WritableFactory * get_factory()
Returns the global WritableFactory for generating TypedWritable objects.
Definition: bamReader.I:177
DatagramIterator
A class to retrieve the individual data elements previously stored in a Datagram.
Definition: datagramIterator.h:27
FactoryParams
An instance of this class is passed to the Factory when requesting it to do its business and construc...
Definition: factoryParams.h:36
Factory::register_factory
void register_factory(TypeHandle handle, CreateFunc *func, void *user_data=nullptr)
Registers a new kind of thing the Factory will be able to create.
Definition: factory.I:73
GeomTextGlyph
This is a specialization on Geom for containing a primitive intended to represent a TextGlyph.
Definition: geomTextGlyph.h:27
GeomTextGlyph::make_copy
virtual Geom * make_copy() const
Returns a newly-allocated Geom that is a shallow copy of this one.
Definition: geomTextGlyph.cxx:92
GeomTextGlyph::register_with_read_factory
static void register_with_read_factory()
Factory method to generate a GeomTextGlyph object.
Definition: geomTextGlyph.cxx:186
GeomTextGlyph::add_glyph
void add_glyph(const TextGlyph *glyph)
Adds a glyph to the list of glyphs referenced by this Geom.
Definition: geomTextGlyph.cxx:178
GeomTextGlyph::copy_primitives_from
virtual bool copy_primitives_from(const Geom *other)
Copies the primitives from the indicated Geom into this one.
Definition: geomTextGlyph.cxx:107
GeomTextGlyph::make_GeomTextGlyph
static TypedWritable * make_GeomTextGlyph(const FactoryParams &params)
Factory method to generate a GeomTextGlyph object.
Definition: geomTextGlyph.cxx:194
GeomTextGlyph::count_geom
void count_geom(const Geom *other)
Records the reference count of the other Geom within this Geom, as if the primitives were copied in v...
Definition: geomTextGlyph.cxx:131
GeomVertexData
This defines the actual numeric vertex data stored in a Geom, in the structure defined by a particula...
Definition: geomVertexData.h:68
Geom
A container for geometry primitives.
Definition: geom.h:54
Geom::copy_primitives_from
virtual bool copy_primitives_from(const Geom *other)
Copies the primitives from the indicated Geom into this one.
Definition: geom.cxx:941
Geom::operator=
void operator=(const Geom &copy)
The copy assignment operator is not pipeline-safe.
Definition: geom.cxx:71
TextGlyph
A representation of a single glyph (character) from a font.
Definition: textGlyph.h:28
TextGlyph::get_character
get_character
Returns the Unicode value that corresponds to the character this glyph represents.
Definition: textGlyph.h:44
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
TypedObject::is_of_type
bool is_of_type(TypeHandle handle) const
Returns true if the current object is or derives from the indicated type.
Definition: typedObject.I:28
TypedWritable
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
datagramIterator.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
geomTextGlyph.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
indent
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
Definition: indent.cxx:20
indent.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.