diff options
author | pixel <pixel> | 2002-11-16 00:33:07 +0000 |
---|---|---|
committer | pixel <pixel> | 2002-11-16 00:33:07 +0000 |
commit | d67b7a1fdb23fdd349af4514db3fd94dbae7ef9c (patch) | |
tree | e39f39a175b5c0f44f57aa795b711636e63d198c /mogltk | |
parent | 9c52570dae47bb479c5e4a5e8e6dd1a605dd8b58 (diff) |
Grmbl
Diffstat (limited to 'mogltk')
-rw-r--r-- | mogltk/glfont.cpp | 110 |
1 files changed, 109 insertions, 1 deletions
diff --git a/mogltk/glfont.cpp b/mogltk/glfont.cpp index e98a64d..82058c8 100644 --- a/mogltk/glfont.cpp +++ b/mogltk/glfont.cpp @@ -1,2 +1,110 @@ -#include <GL/gl.h> +#include "glbase.h" #include "glfont.h" +#include "Input.h" + +Uint8 prescale2[4] = { 0, 85, 170, 255 }, prescale3[8] = { 0, 36, 72, 109, 145, 182, 218, 255 }; + +mogltk::font::font(const String & file) { + Input ffont(file); + int i; + +#ifdef HAVE_ZLIB + ffont.SetZ(); +#endif + + ffont.read(&nbentries, 2); + ffont.read(&flags, 1); + ffont.read(&maxX, 1); + ffont.read(&maxY, 1); + + nbcU = 256 / maxX; + nbcV = 256 / maxY; + + nbcT = nbcU * nbcV; + + nbT = nbentries / nbcT; + + if (nbentries % nbcT) { + nbT++; + } + + fonttex = (texture **) malloc(nbT * sizeof(texture *)); + + for (i = 0; i < nbT; i++) { + fonttex[i] = new texture(256, 256, true); + } + + sizes = (Uint8 *) malloc(nbentries * sizeof(Uint8)); + + Uint8 * curtex = (Uint8 *) fonttex[0]->GetSurface()->pixels; + Uint8 curU = 0, curV = 0, curT = 0; + for (int i = 0; i < nbentries; i++) { + ffont.read(&sizes[i], 1); + for (int v = 0; v < maxY; v++) { + for (int u = 0; u < maxX; u++) { + Uint8 f; + ffont.read(&f, 1); + if (flags) { + Uint8 r, g, b, a; + r = f & 3; + g = (f >> 2) & 7; + b = (f >> 5) & 3; + a = (f >> 7) & 1; + curtex[(curU + u + (curV + v) * 256) * 4 + 0] = prescale2[r]; + curtex[(curU + u + (curV + v) * 256) * 4 + 1] = prescale3[g]; + curtex[(curU + u + (curV + v) * 256) * 4 + 2] = prescale2[b]; + curtex[(curU + u + (curV + v) * 256) * 4 + 3] = a ? 255 : 0; + } else { + curtex[(curU + u + (curV + v) * 256) * 4 + 0] = 255; + curtex[(curU + u + (curV + v) * 256) * 4 + 1] = 255; + curtex[(curU + u + (curV + v) * 256) * 4 + 2] = 255; + curtex[(curU + u + (curV + v) * 256) * 4 + 3] = f; + } + } + } + curU += maxX; + if (curU >= 256) { + curU = 0; + curV += maxY; + if (curV >= 256) { + curV = 0; + curT++; + curtex = (Uint8 *) fonttex[curT]->GetSurface()->pixels; + } + } + } + + for (int i = 0; i < nbT; i++) { + fonttex[i]->Generate(); + } + + corresp = (Uint16 *) malloc(nbentries * 2 * sizeof(Uint16)); + + ffont.read(corresp, 2 * sizeof(Uint16) * nbentries); +} + +mogltk::font::~font() { + int i; + for (i = 0; i < nbT; i++) { + delete fonttex[i]; + } + + free((void *) fonttex); + free(sizes); +} + +void mogltk::font::drawentry(Uint16 entry, Color c, int x, int y) { + bool was2D; + + was2D = mogltk::glbase::is2D(); + + if (!was2D) { + mogltk::glbase::Enter2DMode(); + } + + + + if (!was2D) { + mogltk::glbase::Leave2DMode(); + } +} |