summaryrefslogtreecommitdiff
path: root/tools/playground/font.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/playground/font.cpp')
-rw-r--r--tools/playground/font.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/tools/playground/font.cpp b/tools/playground/font.cpp
new file mode 100644
index 0000000..b001250
--- /dev/null
+++ b/tools/playground/font.cpp
@@ -0,0 +1,181 @@
+#include <rw.h>
+#include <skeleton.h>
+
+using namespace rw;
+
+struct Font
+{
+ Texture *tex;
+ int32 glyphwidth, glyphheight;
+ int32 numglyphs;
+};
+Font vga = { nil, 8, 16, 256 };
+Font bios = { nil, 8, 8, 256 };
+Font *curfont = &bios;
+
+#define NUMCHARS 100
+uint16 indices[NUMCHARS*6];
+RWDEVICE::Im2DVertex vertices[NUMCHARS*4];
+int32 curVert;
+int32 curIndex;
+
+void
+printScreen(const char *s, float32 x, float32 y)
+{
+ char c;
+ Camera *cam;
+ RWDEVICE::Im2DVertex *vert;
+ uint16 *ix;
+ curVert = 0;
+ curIndex = 0;
+ float32 u, v, du, dv;
+ float recipZ;
+
+ cam = (Camera*)engine->currentCamera;
+ vert = &vertices[curVert];
+ ix = &indices[curIndex];
+ du = curfont->glyphwidth/(float32)curfont->tex->raster->width;
+ dv = curfont->glyphheight/(float32)curfont->tex->raster->height;
+ recipZ = 1.0f/cam->nearPlane;
+ while(c = *s){
+ if(c >= curfont->numglyphs)
+ c = 0;
+ u = (c % 16)*curfont->glyphwidth / (float32)curfont->tex->raster->width;
+ v = (c / 16)*curfont->glyphheight / (float32)curfont->tex->raster->height;
+
+ vert->setScreenX(x);
+ vert->setScreenY(y);
+ vert->setScreenZ(rw::im2d::GetNearZ());
+ vert->setCameraZ(cam->nearPlane);
+ vert->setRecipCameraZ(recipZ);
+ vert->setColor(255, 255, 255, 255);
+ vert->setU(u, recipZ);
+ vert->setV(v, recipZ);
+ vert++;
+
+ vert->setScreenX(x+curfont->glyphwidth);
+ vert->setScreenY(y);
+ vert->setScreenZ(rw::im2d::GetNearZ());
+ vert->setCameraZ(cam->nearPlane);
+ vert->setRecipCameraZ(recipZ);
+ vert->setColor(255, 255, 255, 255);
+ vert->setU(u+du, recipZ);
+ vert->setV(v, recipZ);
+ vert++;
+
+ vert->setScreenX(x);
+ vert->setScreenY(y+curfont->glyphheight);
+ vert->setScreenZ(rw::im2d::GetNearZ());
+ vert->setCameraZ(cam->nearPlane);
+ vert->setRecipCameraZ(recipZ);
+ vert->setColor(255, 255, 255, 255);
+ vert->setU(u, recipZ);
+ vert->setV(v+dv, recipZ);
+ vert++;
+
+ vert->setScreenX(x+curfont->glyphwidth);
+ vert->setScreenY(y+curfont->glyphheight);
+ vert->setScreenZ(rw::im2d::GetNearZ());
+ vert->setCameraZ(cam->nearPlane);
+ vert->setRecipCameraZ(recipZ);
+ vert->setColor(255, 255, 255, 255);
+ vert->setU(u+du, recipZ);
+ vert->setV(v+dv, recipZ);
+ vert++;
+
+ *ix++ = curVert;
+ *ix++ = curVert+1;
+ *ix++ = curVert+2;
+ *ix++ = curVert+2;
+ *ix++ = curVert+1;
+ *ix++ = curVert+3;
+
+ curVert += 4;
+ curIndex += 6;
+ x += curfont->glyphwidth+1;
+
+ s++;
+ }
+
+ rw::SetRenderStatePtr(rw::TEXTURERASTER, curfont->tex->raster);
+ rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP);
+ rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST);
+
+ im2d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST,
+ vertices, curVert, indices, curIndex);
+
+}
+
+void
+initFont(void)
+{
+ vga.tex = Texture::read("files/Bm437_IBM_VGA8", "");
+ bios.tex = Texture::read("files/Bm437_IBM_BIOS", "");
+
+/*
+ FILE *foo = fopen("font.c", "w");
+ assert(foo);
+ int x, y;
+ rw::Image *img = rw::readTGA("vga_font.tga");
+ assert(img);
+ for(y = 0; y < img->height; y++){
+ for(x = 0; x < img->width; x++)
+ fprintf(foo, "%d, ", !!img->pixels[y*img->width + x]);
+ fprintf(foo, "\n");
+ }
+*/
+}
+
+/*
+#define NUMGLYPHS 256
+#define GLYPHWIDTH 8
+#define GLYPHHEIGHT 16
+
+
+void
+convertFont(void)
+{
+ FILE *f;
+ Image *img;
+ uint8 data[NUMGLYPHS*GLYPHHEIGHT];
+ int32 i, x, y;
+ uint8 *px, *line, *glyph;
+// f = fopen("font0.bin", "rb");
+ f = fopen("files/Bm437_IBM_VGA8.FON", "rb");
+// f = fopen("files/Bm437_IBM_BIOS.FON", "rb");
+ if(f == nil)
+ return;
+fseek(f, 0x65A, 0);
+ fread(data, 1, NUMGLYPHS*GLYPHHEIGHT, f);
+ fclose(f);
+
+ img = Image::create(16*GLYPHWIDTH, NUMGLYPHS/16*GLYPHHEIGHT, 32);
+ img->allocate();
+ for(i = 0; i < NUMGLYPHS; i++){
+ glyph = &data[i*GLYPHHEIGHT];
+ x = (i % 16)*GLYPHWIDTH;
+ y = (i / 16)*GLYPHHEIGHT;
+ line = &img->pixels[x*4 + y*img->stride];
+ for(y = 0; y < GLYPHHEIGHT; y++){
+ px = line;
+ for(x = 0; x < 8; x++){
+ if(*glyph & 1<<(8-x)){
+ *px++ = 255;
+ *px++ = 255;
+ *px++ = 255;
+ *px++ = 255;
+ }else{
+ *px++ = 0;
+ *px++ = 0;
+ *px++ = 0;
+ *px++ = 0;
+ }
+ }
+ glyph++;
+ line += img->stride;
+ }
+ }
+// writeTGA(img, "files/Bm437_IBM_BIOS.tga");
+ writeTGA(img, "files/Bm437_IBM_VGA8.tga");
+}
+*/ \ No newline at end of file