LASi
LASi.h
Go to the documentation of this file.
1#ifndef LASI_H
2#define LASI_H
3
9#include <string>
10#include <ostream>
11#include <sstream>
12#include <map>
13#include <pango/pango.h>
14#include <ft2build.h>
15#include FT_GLYPH_H
16
18class ContextMgr;
19
20// These macros are needed for Visual C++ and other Windows compilers as well
21// as gcc 4.x or higher with -fvisibility=hidden option.
22// All functions/classes marked with LASIDLLIMPEXP can be imported
23// from/exported to the Windows dll/gcc shared library.
24// Has no impact on other platforms.
25// Details handled identically to PLplot include/pldll.h(.in)
26#if defined ( WIN32 )
27/* Visual C/C++, Borland, MinGW and Watcom */
28 #if defined ( __VISUALC__ ) || defined ( _MSC_VER ) || defined ( __BORLANDC__ ) || defined ( __GNUC__ ) || defined ( __WATCOMC__ )
29 #define LASIDLLEXPORT __declspec( dllexport )
30 #define LASIDLLIMPORT __declspec( dllimport )
31 #else
32 #define LASIDLLEXPORT
33 #define LASIDLLIMPORT
34 #endif
35#elif defined ( __CYGWIN__ )
36 #define LASIDLLEXPORT __declspec( dllexport )
37 #define LASIDLLIMPORT __declspec( dllimport )
38#elif defined ( __GNUC__ ) && __GNUC__ > 3
39 // Follow ideas in http://gcc.gnu.org/wiki/Visibility for GCC version 4.x
40 // The following forces exported symbols specifically designated with
41 // LASIDLLEXPORT to be visible.
42 #define LASIDLLEXPORT __attribute__ ( ( visibility( "default" ) ) )
43 #define LASIDLLIMPORT
44#endif
45
46// For an unknown compiler or static built we clear the macros.
47#ifndef LASIDLLEXPORT
48 #define LASIDLLEXPORT
49 #define LASIDLLIMPORT
50#endif
51
52#if defined(LASi_EXPORTS)
53 #define LASIDLLIMPEXP LASIDLLEXPORT
54 #define LASIDLLIMPEXP_DATA(type) LASIDLLEXPORT type
55#elif defined(LASi_DLL)
56 #define LASIDLLIMPEXP LASIDLLIMPORT
57 #define LASIDLLIMPEXP_DATA(type) LASIDLLIMPORT type
58#else
59 #define LASIDLLIMPEXP
60 #define LASIDLLIMPEXP_DATA(type) type
61#endif
62
63namespace LASi {
64
68 ITALIC
69 };
70
77 HEAVY
78 };
79
83 };
84
95 };
96
97 class PostscriptDocument;
98 class write_glyph_routine_to_stream;
99
103 class LASIDLLIMPEXP oPostscriptStream : public std::ostringstream {
104 public:
105 friend class PostscriptDocument;
106 friend class show;
107 friend class setFont;
108 friend class setFontSize;
109
110 oPostscriptStream(PostscriptDocument& psDoc) : _psDoc(psDoc) {}
111
112 protected:
113 PostscriptDocument& doc() {return _psDoc;}
114
115 private:
117 };
118
119 template<class T>
121 static_cast<std::ostream&>(os) << t;
122 return os;
123 }
124
131 public:
132 friend class write_glyph_routine_to_stream; // helper class
133 friend class show;
134
137
141 void setFont(
142 const char* const family = "sans",
147 );
148
152 void setFontSize(const double size) {_fontSize = size;}
153
156 std::ostringstream& osHeader() {return _osHeader;}
157
160 oPostscriptStream& osBody() {return _osBody;}
161
164 oPostscriptStream& osFooter() {return _osFooter;}
165
175 void write(std::ostream& os, double llx=0, double lly=0, double urx=0, double ury=0);
176
183 void get_dimensions(const char* s, double *lineSpacing, double *xAdvance=NULL, double *yMin=NULL, double *yMax=NULL);
184 void get_dimensions(std::string s, double *lineSpacing, double *xAdvance=NULL, double *yMin=NULL, double *yMax=NULL);
185
186 protected:
191 class GlyphId {
192 public:
193 friend bool operator==(const GlyphId id1, const GlyphId id2) {
194 return id1._str == id2._str;
195 }
196
197 friend bool operator<(const GlyphId id1, const GlyphId id2) {
198 return id1._str < id2._str;
199 }
200
202 GlyphId(FT_Face, const FT_UInt, uint32_t unichar);
203
205 std::string str() const {return _str;}
206
207 private:
209 std::string _str;
210 };
211
214 typedef std::map<GlyphId, FreetypeGlyphMgr> GlyphMap;
215
220 typedef void (PostscriptDocument::*GLYPH_FUNC)(
221 const GlyphMap::value_type&, void* contextData);
222
223 void invoke_glyph_routine(const GlyphMap::value_type&, void* contextData);
224
225 void accrue_dimensions( const GlyphMap::value_type&, void* contextData);
226
231 FT_Error PangoItem_do(const char* s, PangoItem* const pItem,
232 const GLYPH_FUNC func, void* contextData,
233 bool applyOffset = false);
234
237 void for_each_glyph_do(const std::string& s, const GLYPH_FUNC func, void* contextData,
238 bool applyOffset = false);
239
240 PangoContext* pangoContext() const;
241
244 std::string glyphProcName() const;
245
248 double getFontSize() {return _fontSize;}
249
253 private:
254 std::ostream& os;
255 PangoContext* pangoCtx;
256
257 public:
258 write_glyph_routine_to_stream(std::ostream& os, PangoContext* pangoCtx)
259 : os(os), pangoCtx(pangoCtx) {}
260 void operator()(PostscriptDocument::GlyphMap::value_type v);
261 };
262
263 private:
265
266 static const unsigned int DRAWING_SCALE;
267
268 // Use pointers instead of objects in order to minimize namespace pollution of .h file user
269 // Requires fwd declarations above.
270 ContextMgr* _pContextMgr; // manage PangoContext*
271 double _fontSize; // font size to be used when rendering next show()
272 std::ostringstream _osHeader; // Postscript header
273 oPostscriptStream _osBody; // Postscript body
274 oPostscriptStream _osFooter; // Postscript footer
275 };
276
280 public:
284 x.apply(os);
285 return os;
286 }
287
292 const char* const family = "sans",
297 : _family(family), _style(style), _weight(weight), _variant(variant), _stretch(stretch)
298 {}
299
300 protected:
301 void apply(oPostscriptStream& os) const {
302 os.doc().setFont(_family, _style,_weight, _variant, _stretch);
303 }
304
305 private:
306 const char* const _family;
311
312 };
313
317 public:
321 x.apply(os);
322 return os;
323 }
324
329 setFontSize(double size) : _size(size) {}
330
331 protected:
332 void apply(oPostscriptStream& os) const {
333 os.doc().setFontSize(_size);
334 }
335
336 private:
337 double _size;
338 };
339
343 public:
346 friend inline oPostscriptStream& operator<<(oPostscriptStream& os, const show& x) {
347 x.apply(os);
348 return os;
349 }
350
354 show(const char* c_str ) : _str(c_str ) {}
355 show(std::string stl_str ) : _str(stl_str) {}
356
357 protected:
358 void apply(oPostscriptStream& os) const;
359
360 private:
361 std::string _str;
362 };
363}
364#endif
365
#define LASIDLLIMPEXP
Definition: LASi.h:59
Manage PangoContext*.
Definition: contextMgr.h:17
Manage FT_Glyph by insuring that FT_Glyph is handled correctly.
Definition: glyphMgr.h:22
For internal use only.
Definition: LASi.h:191
GlyphId()
Definition: LASi.h:201
friend bool operator==(const GlyphId id1, const GlyphId id2)
Definition: LASi.h:193
friend bool operator<(const GlyphId id1, const GlyphId id2)
Definition: LASi.h:197
std::string str() const
Definition: LASi.h:205
std::string _str
Definition: LASi.h:209
For internal use only.
Definition: LASi.h:252
write_glyph_routine_to_stream(std::ostream &os, PangoContext *pangoCtx)
Definition: LASi.h:258
PangoContext * pangoCtx
Definition: LASi.h:255
Composes Postscript document as three separate and independant streams for header,...
Definition: LASi.h:130
double _fontSize
Definition: LASi.h:271
oPostscriptStream & osFooter()
Returns stream for Postscript footer.
Definition: LASi.h:164
double getFontSize()
Definition: LASi.h:248
void setFontSize(const double size)
Sets the font size, in points, that all subsequent text written to bodyStream() or footerStream() wil...
Definition: LASi.h:152
void setFont(const char *const family="sans", LASi::FontStyle=LASi::NORMAL_STYLE, LASi::FontWeight=LASi::NORMAL_WEIGHT, LASi::FontVariant=LASi::NORMAL_VARIANT, LASi::FontStretch=LASi::NORMAL_STRETCH)
Sets the font that all subsequent text written to bodyStream() or footerStream() will be rendered wit...
Definition: psDoc.cpp:180
oPostscriptStream & osBody()
Returns stream for Postscript body.
Definition: LASi.h:160
std::ostringstream _osHeader
Definition: LASi.h:272
oPostscriptStream _osBody
Definition: LASi.h:273
static const unsigned int DRAWING_SCALE
Definition: LASi.h:266
GlyphMap _glyphMap
Definition: LASi.h:264
oPostscriptStream _osFooter
Definition: LASi.h:274
std::string glyphProcName() const
std::ostringstream & osHeader()
Returns stream for Postscript header.
Definition: LASi.h:156
std::map< GlyphId, FreetypeGlyphMgr > GlyphMap
Maps glyph routine name to FT_Glyph instance.
Definition: LASi.h:214
ContextMgr * _pContextMgr
Definition: LASi.h:270
Just like any ordinary ostringstream, but maintains a reference to the PostscriptDocument.
Definition: LASi.h:103
oPostscriptStream(PostscriptDocument &psDoc)
Definition: LASi.h:110
PostscriptDocument & doc()
Definition: LASi.h:113
PostscriptDocument & _psDoc
Definition: LASi.h:116
stream manipulator applied to oPostscriptStream.
Definition: LASi.h:316
void apply(oPostscriptStream &os) const
Definition: LASi.h:332
double _size
Definition: LASi.h:337
friend oPostscriptStream & operator<<(oPostscriptStream &os, const setFontSize &x)
Stream inserter for 'setFontSize' stream manipulator.
Definition: LASi.h:320
setFontSize(double size)
Usage: os << setFontSize(12) << ...
Definition: LASi.h:329
stream manipulator applied to oPostscriptStream.
Definition: LASi.h:279
setFont(const char *const family="sans", const LASi::FontStyle style=LASi::NORMAL_STYLE, const LASi::FontWeight weight=LASi::NORMAL_WEIGHT, const LASi::FontVariant variant=LASi::NORMAL_VARIANT, const LASi::FontStretch stretch=LASi::NORMAL_STRETCH)
Usage: os << setFont("Vera Sans",LASi::ITALIC,LASi::BOLD) << ...
Definition: LASi.h:291
const LASi::FontStretch _stretch
Definition: LASi.h:310
const char *const _family
Definition: LASi.h:306
const LASi::FontVariant _variant
Definition: LASi.h:309
const LASi::FontWeight _weight
Definition: LASi.h:308
void apply(oPostscriptStream &os) const
Definition: LASi.h:301
const LASi::FontStyle _style
Definition: LASi.h:307
friend oPostscriptStream & operator<<(oPostscriptStream &os, const setFont &x)
Stream inserter for 'setFont' stream manipulator.
Definition: LASi.h:283
stream applicator applied to oPostscriptStream.
Definition: LASi.h:342
show(std::string stl_str)
Definition: LASi.h:355
std::string _str
Definition: LASi.h:361
friend oPostscriptStream & operator<<(oPostscriptStream &os, const show &x)
stream inserter for 'show' stream applicator
Definition: LASi.h:346
show(const char *c_str)
Usage: os << show("some UTF-8 text") << ...
Definition: LASi.h:354
void apply(oPostscriptStream &os) const
Definition: psDoc.cpp:624
Definition: LASi.h:63
FontVariant
Definition: LASi.h:80
@ SMALLCAPS
Definition: LASi.h:82
@ NORMAL_VARIANT
Definition: LASi.h:81
FontStretch
Definition: LASi.h:85
@ EXTRACONDENSED
Definition: LASi.h:87
@ ULTRAEXPANDED
Definition: LASi.h:94
@ SEMIEXPANDED
Definition: LASi.h:91
@ ULTRACONDENSED
Definition: LASi.h:86
@ NORMAL_STRETCH
Definition: LASi.h:90
@ EXTRAEXPANDED
Definition: LASi.h:93
@ SEMICONDENSED
Definition: LASi.h:89
@ EXPANDED
Definition: LASi.h:92
@ CONDENSED
Definition: LASi.h:88
FontStyle
Definition: LASi.h:65
@ NORMAL_STYLE
Definition: LASi.h:66
@ OBLIQUE
Definition: LASi.h:67
@ ITALIC
Definition: LASi.h:68
FontWeight
Definition: LASi.h:71
@ HEAVY
Definition: LASi.h:77
@ BOLD
Definition: LASi.h:75
@ ULTRABOLD
Definition: LASi.h:76
@ LIGHT
Definition: LASi.h:73
@ ULTRALIGHT
Definition: LASi.h:72
@ NORMAL_WEIGHT
Definition: LASi.h:74
oPostscriptStream & operator<<(oPostscriptStream &os, T t)
Definition: LASi.h:120