00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef GLTEXT_H
00031 #define GLTEXT_H
00032
00033 #ifndef __cplusplus
00034 # error GLText requires C++
00035 #endif
00036
00037 #include <sstream>
00038
00039
00040 #ifndef GLTEXT_CALL
00041 # ifdef WIN32
00042 # define GLTEXT_CALL __stdcall
00043 # else
00044 # define GLTEXT_CALL
00045 # endif
00046 #endif
00047
00048
00049 #ifndef GLTEXT_DECL
00050 # if defined(WIN32) || defined(_WIN32)
00051 # ifdef GLTEXT_EXPORTS
00052 # define GLTEXT_DECL __declspec(dllexport)
00053 # else
00054 # define GLTEXT_DECL __declspec(dllimport)
00055 # endif
00056 # else
00057 # define GLTEXT_DECL
00058 # endif
00059 #endif
00060
00061 #define GLTEXT_FUNC(ret) extern "C" GLTEXT_DECL ret GLTEXT_CALL
00062
00063 namespace gltext
00064 {
00065 typedef unsigned char u8;
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 class RefCounted
00076 {
00077 protected:
00078
00079
00080
00081
00082
00083
00084
00085 ~RefCounted() {}
00086
00087 public:
00088
00089
00090
00091
00092 virtual void GLTEXT_CALL ref() = 0;
00093
00094
00095
00096
00097
00098 virtual void GLTEXT_CALL unref() = 0;
00099 };
00100
00101
00102
00103
00104
00105
00106
00107
00108 template< typename T >
00109 class RefPtr
00110 {
00111 public:
00112 RefPtr(T* ptr = 0)
00113 {
00114 mPtr = 0;
00115 *this = ptr;
00116 }
00117
00118 RefPtr(const RefPtr<T>& ptr)
00119 {
00120 mPtr = 0;
00121 *this = ptr;
00122 }
00123
00124 ~RefPtr()
00125 {
00126 if (mPtr)
00127 {
00128 mPtr->unref();
00129 mPtr = 0;
00130 }
00131 }
00132
00133 RefPtr<T>& operator=(T* ptr)
00134 {
00135 if (ptr != mPtr)
00136 {
00137 if (mPtr)
00138 {
00139 mPtr->unref();
00140 }
00141 mPtr = ptr;
00142 if (mPtr)
00143 {
00144 mPtr->ref();
00145 }
00146 }
00147 return *this;
00148 }
00149
00150 RefPtr<T>& operator=(const RefPtr<T>& ptr)
00151 {
00152 *this = ptr.mPtr;
00153 return *this;
00154 }
00155
00156 T* operator->() const
00157 {
00158 return mPtr;
00159 }
00160
00161 T& operator*() const
00162 {
00163 return *mPtr;
00164 }
00165
00166 operator bool() const
00167 {
00168 return (mPtr != 0);
00169 }
00170
00171 T* get() const
00172 {
00173 return mPtr;
00174 }
00175
00176 private:
00177 T* mPtr;
00178 };
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 template< class Interface >
00189 class RefImpl : public Interface
00190 {
00191 protected:
00192 RefImpl()
00193 : mRefCount(0)
00194 {}
00195
00196
00197
00198
00199
00200 virtual ~RefImpl() {}
00201
00202 public:
00203 void GLTEXT_CALL ref()
00204 {
00205 ++mRefCount;
00206 }
00207
00208 void GLTEXT_CALL unref()
00209 {
00210 if (--mRefCount == 0)
00211 {
00212 delete this;
00213 }
00214 }
00215
00216 private:
00217 int mRefCount;
00218 };
00219
00220
00221
00222 enum FontRendererType
00223 {
00224 BITMAP,
00225 PIXMAP,
00226 TEXTURE,
00227 MIPMAP,
00228 };
00229
00230
00231
00232
00233 class Glyph : public RefCounted
00234 {
00235 protected:
00236 ~Glyph() {}
00237
00238 public:
00239
00240 virtual int GLTEXT_CALL getWidth() = 0;
00241
00242
00243 virtual int GLTEXT_CALL getHeight() = 0;
00244
00245
00246 virtual int GLTEXT_CALL getXOffset() = 0;
00247
00248
00249 virtual int GLTEXT_CALL getYOffset() = 0;
00250
00251
00252
00253 virtual int GLTEXT_CALL getAdvance() = 0;
00254
00255
00256
00257
00258 virtual void GLTEXT_CALL render(u8* pixels) = 0;
00259
00260
00261
00262
00263 virtual void GLTEXT_CALL renderBitmap(u8* pixels) = 0;
00264 };
00265
00266
00267
00268
00269
00270 class Font : public RefCounted
00271 {
00272 protected:
00273 ~Font() {}
00274
00275 public:
00276
00277 virtual const char* GLTEXT_CALL getName() = 0;
00278
00279
00280
00281
00282
00283 virtual Glyph* GLTEXT_CALL getGlyph(unsigned char c) = 0;
00284
00285
00286 virtual int GLTEXT_CALL getSize() = 0;
00287
00288
00289
00290
00291
00292 virtual int GLTEXT_CALL getDPI() = 0;
00293
00294
00295
00296
00297
00298 virtual int GLTEXT_CALL getAscent() = 0;
00299
00300
00301
00302
00303
00304
00305 virtual int GLTEXT_CALL getDescent() = 0;
00306
00307
00308
00309
00310
00311
00312 virtual int GLTEXT_CALL getLineGap() = 0;
00313
00314
00315
00316
00317
00318
00319 virtual int GLTEXT_CALL getKerning(unsigned char l, unsigned char r) = 0;
00320 };
00321 typedef RefPtr<Font> FontPtr;
00322
00323
00324
00325
00326
00327 class FontRenderer : public RefCounted
00328 {
00329 protected:
00330 ~FontRenderer() {}
00331
00332 public:
00333
00334
00335
00336
00337 virtual void GLTEXT_CALL render(const char* text) = 0;
00338
00339
00340
00341
00342
00343 virtual int GLTEXT_CALL getWidth(const char* text) = 0;
00344
00345
00346
00347
00348
00349 virtual int GLTEXT_CALL getHeight(const char* text) = 0;
00350
00351
00352
00353
00354 virtual Font* GLTEXT_CALL getFont() = 0;
00355 };
00356 typedef RefPtr<FontRenderer> FontRendererPtr;
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366 class Stream : public std::ostringstream
00367 {
00368 public:
00369 Stream(FontRenderer* r)
00370 : mRenderer(r)
00371 {
00372 }
00373
00374 Stream(const FontRendererPtr& p)
00375 : mRenderer(p.get())
00376 {
00377 }
00378
00379 ~Stream()
00380 {
00381 flush();
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397 Stream& get()
00398 {
00399 return *this;
00400 }
00401
00402 FontRenderer* getRenderer()
00403 {
00404 return mRenderer.get();
00405 }
00406
00407
00408
00409
00410
00411
00412
00413 void flush()
00414 {
00415 mRenderer->render(str().c_str());
00416 str("");
00417 }
00418
00419 private:
00420 FontRendererPtr mRenderer;
00421 };
00422
00423
00424
00425
00426
00427
00428
00429
00430 template<typename T>
00431 Stream& operator<<(Stream& fs, T t)
00432 {
00433 static_cast<std::ostream&>(fs) << t;
00434 return fs;
00435 }
00436
00437
00438
00439
00440 inline Stream& operator<<(Stream& fs, Stream& (*manip)(Stream&))
00441 {
00442 fs.flush();
00443 return manip(fs);
00444 }
00445
00446
00447
00448
00449
00450
00451
00452
00453 #define GLTEXT_STREAM(renderer) gltext::Stream(renderer).get()
00454
00455
00456
00457
00458
00459
00460
00461 namespace internal
00462 {
00463
00464 GLTEXT_FUNC(const char*) GLTextGetVersion();
00465
00466
00467 GLTEXT_FUNC(Font*) GLTextOpenFont(const char* name, int size, int dpi);
00468
00469
00470 GLTEXT_FUNC(FontRenderer*) GLTextCreateRenderer(
00471 FontRendererType type,
00472 Font* font);
00473 }
00474
00475
00476
00477
00478
00479
00480 inline const char* GetVersion()
00481 {
00482 return internal::GLTextGetVersion();
00483 }
00484
00485
00486
00487
00488
00489
00490
00491
00492 inline Font* OpenFont(const char* name, int size, int dpi = 72)
00493 {
00494 return internal::GLTextOpenFont(name, size, dpi);
00495 }
00496
00497
00498
00499
00500
00501
00502
00503 inline FontRenderer* CreateRenderer(FontRendererType type,
00504 const FontPtr& font)
00505 {
00506 return internal::GLTextCreateRenderer(type, font.get());
00507 }
00508 }
00509
00510
00511 #endif