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 
17 class FreetypeGlyphMgr;
18 class 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 
63 namespace LASi {
64 
65  enum FontStyle{
69  };
70 
71  enum FontWeight{
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 
201  GlyphId() {}
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:
264  GlyphMap _glyphMap;
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:
283  friend inline oPostscriptStream& operator<<(oPostscriptStream& os, const setFont& x) {
284  x.apply(os);
285  return os;
286  }
287 
292  const char* const family = "sans",
293  const LASi::FontStyle style = LASi::NORMAL_STYLE,
294  const LASi::FontWeight weight = LASi::NORMAL_WEIGHT,
295  const LASi::FontVariant variant = LASi::NORMAL_VARIANT,
296  const LASi::FontStretch stretch = LASi::NORMAL_STRETCH )
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 
std::string _str
Definition: LASi.h:209
Definition: LASi.h:94
friend oPostscriptStream & operator<<(oPostscriptStream &os, const setFontSize &x)
Stream inserter for &#39;setFontSize&#39; stream manipulator.
Definition: LASi.h:320
friend oPostscriptStream & operator<<(oPostscriptStream &os, const show &x)
stream inserter for &#39;show&#39; stream applicator
Definition: LASi.h:346
FontWeight
Definition: LASi.h:71
Definition: LASi.h:67
Definition: LASi.h:87
Definition: LASi.h:75
stream applicator applied to oPostscriptStream.
Definition: LASi.h:342
ContextMgr * _pContextMgr
Definition: LASi.h:270
friend bool operator==(const GlyphId id1, const GlyphId id2)
Definition: LASi.h:193
double getFontSize()
Definition: LASi.h:248
stream manipulator applied to oPostscriptStream.
Definition: LASi.h:279
static const unsigned int DRAWING_SCALE
Definition: LASi.h:266
PangoContext * pangoCtx
Definition: LASi.h:255
Definition: LASi.h:77
std::string str() const
Definition: LASi.h:205
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
std::string _str
Definition: LASi.h:361
double _fontSize
Definition: LASi.h:271
oPostscriptStream _osFooter
Definition: LASi.h:274
oPostscriptStream _osBody
Definition: LASi.h:273
void apply(oPostscriptStream &os) const
Definition: psDoc.cpp:624
Definition: LASi.h:91
const LASi::FontStyle _style
Definition: LASi.h:307
friend bool operator<(const GlyphId id1, const GlyphId id2)
Definition: LASi.h:197
stream manipulator applied to oPostscriptStream.
Definition: LASi.h:316
Definition: LASi.h:73
Just like any ordinary ostringstream, but maintains a reference to the PostscriptDocument.
Definition: LASi.h:103
Definition: LASi.h:66
void apply(oPostscriptStream &os) const
Definition: LASi.h:301
GlyphMap _glyphMap
Definition: LASi.h:264
Manage FT_Glyph by insuring that FT_Glyph is handled correctly.
Definition: glyphMgr.h:22
Definition: LASi.h:63
Definition: LASi.h:88
oPostscriptStream(PostscriptDocument &psDoc)
Definition: LASi.h:110
FontStretch
Definition: LASi.h:85
PostscriptDocument & _psDoc
Definition: LASi.h:116
For internal use only.
Definition: LASi.h:252
show(const char *c_str)
Usage: os << show("some UTF-8 text") << ...
Definition: LASi.h:354
GlyphId()
Definition: LASi.h:201
Definition: LASi.h:68
Definition: LASi.h:92
std::ostringstream _osHeader
Definition: LASi.h:272
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
void apply(oPostscriptStream &os) const
Definition: LASi.h:332
Definition: LASi.h:86
#define LASIDLLIMPEXP
Definition: LASi.h:59
oPostscriptStream & osBody()
Returns stream for Postscript body.
Definition: LASi.h:160
Manage PangoContext*.
Definition: contextMgr.h:17
Definition: LASi.h:89
PostscriptDocument & doc()
Definition: LASi.h:113
FontStyle
Definition: LASi.h:65
Definition: LASi.h:90
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
const LASi::FontVariant _variant
Definition: LASi.h:309
Composes Postscript document as three separate and independant streams for header, body and footer.
Definition: LASi.h:130
For internal use only.
Definition: LASi.h:191
const char *const _family
Definition: LASi.h:306
const LASi::FontStretch _stretch
Definition: LASi.h:310
FontVariant
Definition: LASi.h:80
oPostscriptStream & operator<<(oPostscriptStream &os, T t)
Definition: LASi.h:120
Definition: LASi.h:81
double _size
Definition: LASi.h:337
std::ostringstream & osHeader()
Returns stream for Postscript header.
Definition: LASi.h:156
const LASi::FontWeight _weight
Definition: LASi.h:308
friend oPostscriptStream & operator<<(oPostscriptStream &os, const setFont &x)
Stream inserter for &#39;setFont&#39; stream manipulator.
Definition: LASi.h:283
show(std::string stl_str)
Definition: LASi.h:355
std::map< GlyphId, FreetypeGlyphMgr > GlyphMap
Maps glyph routine name to FT_Glyph instance.
Definition: LASi.h:214
Definition: LASi.h:72
setFontSize(double size)
Usage: os << setFontSize(12) << ...
Definition: LASi.h:329
oPostscriptStream & osFooter()
Returns stream for Postscript footer.
Definition: LASi.h:164
Definition: LASi.h:93
write_glyph_routine_to_stream(std::ostream &os, PangoContext *pangoCtx)
Definition: LASi.h:258
Definition: LASi.h:82
Definition: LASi.h:76
Definition: LASi.h:74