lvfntgen.cpp 3.45 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
/*******************************************************
              LV Bitmap font implementation
*******************************************************/

#include "StdAfx.h"
#include "lvfntgen.h"


 glyph_range_buf::glyph_range_buf()
     : pos(0)
 {
     memset( &range, 0, sizeof(range) );
     memset( buf, 0, sizeof(buf) );
 }

 lvfont_glyph_t * glyph_range_buf::addGlyph( unsigned short code )
 {
     range.glyphsOffset[code & 0x3F] = pos + sizeof(range);
     return (lvfont_glyph_t *) (buf+pos);
 }

 void glyph_range_buf::commitGlyph()
 {
     lvfont_glyph_t * glyph = (lvfont_glyph_t *)( buf+pos );
     pos += glyph->glyphSize + 8;
 }


 lvfont_glyph_t *  font_gen_buf::addGlyph( unsigned short code )
 {
     int nrange = (code >> 6) & 0x3FF;
     if (!ranges[nrange]) ranges[nrange] = new glyph_range_buf;
     lastRange = ranges[nrange];
     if ( hdr.maxCode < code )
         hdr.maxCode = code;
     return ranges[nrange]->addGlyph( code );
 }

 void font_gen_buf::commitGlyph()
 {
     if (lastRange)
     {
         lastRange->commitGlyph();
         lastRange = NULL;
     }
 }

 bool font_gen_buf::saveToFile( const char * fname )
 {
     FILE * f = fopen( fname, "wb" );
     if (!f)
         return false;
     int sz = 0;
     int rangecount = hdr.maxCode/64 + 1;
     int hdrsz = sizeof(lvfont_header_t) - (1024 - rangecount) * sizeof(unsigned long);
     for (int i=0; i<rangecount; i++)
     {
         if (ranges[i])
         {
             hdr.rangesOffset[i] = hdrsz + decodeTableSize + sz;
             sz += ranges[i]->getSize();
         }
     }
     hdr.fileSize = hdrsz + sz + decodeTableSize;
     hdr.decodeTableOffset = hdrsz;
     fwrite( &hdr, hdrsz, 1, f);
     fwrite( decodeTable, decodeTableSize, 1, f);
     int pos = hdrsz + decodeTableSize;
     for (i=0; i<1024; i++)
     {
         if (ranges[i])
         {
             //ranges[i]->relocate(pos);
             pos += ranges[i]->getSize();
             fwrite( &ranges[i]->range, ranges[i]->getSize(), 1, f );
         }
     }
     fclose(f);
     return true;
 }

 void font_gen_buf::init( int fntSize, int fntBaseline, int bitsPerPixel, const char * fontName, const char * fontCopyright )
 {
     memset( &hdr, 0, sizeof(hdr) );
     hdr.magic[0] = 'L';
     hdr.magic[1] = 'F';
     hdr.magic[2] = 'N';
     hdr.magic[3] = 'T';
     hdr.version[0] = '1';
     hdr.version[1] = '.';
     hdr.version[2] = '0';
     hdr.version[3] = '0';
     hdr.fontHeight = fntSize;
     hdr.fontBaseline = fntBaseline;
     hdr.fontBitsPerPixel = bitsPerPixel;
     hdr.fontMaxWidth = 0;
     hdr.minCode = 0;
     hdr.maxCode = 0;
     strncpy( hdr.fontName, fontName, FONT_NAME_LENGTH-1);
     hdr.fontName[FONT_NAME_LENGTH-1] = 0;
     strncpy( hdr.fontCopyright, fontCopyright, FONT_NAME_LENGTH-1);
     hdr.fontCopyright[FONT_NAME_LENGTH-1];
 }

 void font_gen_buf::setDecodeTable( hrle_decode_info_t * table )
 {
     if (decodeTable)
         free(decodeTable);
     decodeTableSize = sizeof(hrle_decode_info_t)+sizeof(hrle_decode_table_t)*(table->itemcount-1);
     decodeTable = (hrle_decode_info_t*)malloc(decodeTableSize);
     memcpy(decodeTable, table, decodeTableSize);
 }

 font_gen_buf::font_gen_buf()
 : lastRange(NULL), decodeTable(NULL), decodeTableSize(0)
 {
     memset( &hdr, 0, sizeof(hdr) );
     memset( &ranges, 0, sizeof(ranges) );
 }

 font_gen_buf::~font_gen_buf()
 {
     if (decodeTable)
         free(decodeTable);
     for (int i=0; i<1024; i++)
     {
         if (ranges[i]) delete ranges[i];
     }
 }