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  */
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::
188 }
189 
190 /**
191  * Factory method to generate a GeomTextGlyph object
192  */
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 }
static TypedWritable * make_GeomTextGlyph(const FactoryParams &params)
Factory method to generate a GeomTextGlyph object.
virtual bool copy_primitives_from(const Geom *other)
Copies the primitives from the indicated Geom into this one.
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
virtual Geom * make_copy() const
Returns a newly-allocated Geom that is a shallow copy of this one.
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
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...
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
Definition: indent.cxx:20
This defines the actual numeric vertex data stored in a Geom, in the structure defined by a particula...
A container for geometry primitives.
Definition: geom.h:54
An instance of this class is passed to the Factory when requesting it to do its business and construc...
Definition: factoryParams.h:36
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
A representation of a single glyph (character) from a font.
Definition: textGlyph.h:28
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
get_character
Returns the Unicode value that corresponds to the character this glyph represents.
Definition: textGlyph.h:44
static WritableFactory * get_factory()
Returns the global WritableFactory for generating TypedWritable objects.
Definition: bamReader.I:177
void add_glyph(const TextGlyph *glyph)
Adds a glyph to the list of glyphs referenced by this Geom.
virtual bool copy_primitives_from(const Geom *other)
Copies the primitives from the indicated Geom into this one.
Definition: geom.cxx:941
static void register_with_read_factory()
Factory method to generate a GeomTextGlyph object.
bool is_of_type(TypeHandle handle) const
Returns true if the current object is or derives from the indicated type.
Definition: typedObject.I:28
A class to retrieve the individual data elements previously stored in a Datagram.
void operator=(const Geom &copy)
The copy assignment operator is not pipeline-safe.
Definition: geom.cxx:71
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
This is a specialization on Geom for containing a primitive intended to represent a TextGlyph.
Definition: geomTextGlyph.h:27
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.