/[pearpc]/src/system/font.cc
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /src/system/font.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 10 months ago) by dpavlin
File size: 3594 byte(s)
import upstream CVS
1 dpavlin 1 /*
2     * PearPC
3     * font.cc
4     *
5     * Copyright (C) 1999-2003 Sebastian Biallas (sb@biallas.net)
6     *
7     * This program is free software; you can redistribute it and/or modify
8     * it under the terms of the GNU General Public License version 2 as
9     * published by the Free Software Foundation.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19     */
20    
21     #include <cstdlib>
22     #include <cstring>
23     #include "system/font.h"
24    
25     struct FFH {
26     byte magic[4];
27     byte height;
28     byte dist;
29     byte res0[11];
30     } PACKED;
31    
32     struct FChar {
33     byte width;
34     uint16 data[0];
35     };
36    
37     Font::Font()
38     {
39     mData = NULL;
40     }
41    
42     Font::~Font()
43     {
44     free(mData);
45     }
46    
47     bool Font::loadFromFile(File &file)
48     {
49     free(mData);
50     mData = NULL;
51     FFH hdr;
52     file.readx(&hdr, sizeof hdr);
53     unsigned int c = 256 * (2 * hdr.height + 1);
54     mData = (byte*)malloc(c);
55     memset(mData, 0, c);
56     mCharWidth = 1;
57     mCharHeight = hdr.height;
58     mBytes = 2;
59     file.readx(mData, c);
60     for (int i=0; i<256; i++) {
61     byte width = mData[(mCharHeight*2+1)*i];
62     if (width > mCharWidth) mCharWidth = width;
63     }
64     mPadX = 0;
65     mPadY = 0;
66     mRealWidth = mCharWidth;
67     mRealHeight = mCharHeight;
68     return true;
69     }
70    
71     void Font::setPadding(int px, int py)
72     {
73     mRealWidth = mRealWidth-mPadX+px;
74     mRealHeight = mRealHeight-mPadY+py;
75     }
76    
77     void Font::drawChar(int x, int y, byte c, uint fgcolor, uint bgcolor, byte *tobuf, int bufwidth, int bufheight, int bufcolorbytes)
78     {
79     byte width = mData[(mCharHeight*2+1)*c];
80     int jshift = (mCharWidth - width)/2;
81     int bufsize = bufwidth * bufheight * bufcolorbytes;
82     uint o = (x + y * bufwidth)*bufcolorbytes;
83     for (int i=0; i < mCharHeight; i++) {
84     byte *chr = mData + (mCharHeight*2+1)*c + i*2 + 1;
85     uint16 cdata = (chr[1] << 8) | chr[0];
86     int a = o + i * bufwidth * bufcolorbytes;
87     for (int j=0; j< mCharWidth; j++) {
88     if (a < bufsize) {
89     uint c;
90     if ((cdata << jshift) & (1 << j)) {
91     c = fgcolor;
92     } else {
93     c = bgcolor;
94     }
95     switch (bufcolorbytes) {
96     case 1:
97     tobuf[a] = c;
98     break;
99     case 2:
100     tobuf[a+0]=(((c>>8)>>1)&0x7c)|(((c>>16)>>6) & 3);
101     tobuf[a+1]=(((c>>16)<<2)&0xe0)|(((c>>24)>>3) & 0x1f);
102     break;
103     case 4:
104     tobuf[a+0]=0;
105     tobuf[a+1]=c>>8;
106     tobuf[a+2]=c>>16;
107     tobuf[a+3]=c>>24;
108     break;
109     }
110     }
111     a += bufcolorbytes;
112     }
113     }
114     }
115    
116     void Font::drawFixedChar(int x, int y, int dx, int dy, byte c, uint fgcolor, uint bgcolor, byte *tobuf, int bufwidth, int bufheight, int bufcolorbytes)
117     {
118     drawChar(dx+x*mRealWidth, dy+y*mRealHeight, c, fgcolor, bgcolor, tobuf, bufwidth, bufheight, bufcolorbytes);
119     }
120    
121     void Font::drawChar2(SystemDisplay *toDisplay, int x, int y, byte c, RGBA fgcolor, RGBA bgcolor)
122     {
123     byte width = mData[(mCharHeight*2+1)*c];
124     int jshift = (mCharWidth - width)/2;
125     for (int i=0; i < mCharHeight; i++) {
126     byte *chr = mData + (mCharHeight*2+1)*c + i*2 + 1;
127     uint16 cdata = (chr[1] << 8) | chr[0];
128     for (int j=0; j< mCharWidth; j++) {
129     RGBA c;
130     if ((cdata << jshift) & (1 << j)) {
131     c = fgcolor;
132     } else {
133     c = bgcolor;
134     }
135     toDisplay->putPixelRGBA(x+j, y+i, c);
136     }
137     }
138     }
139    
140     void Font::drawFixedChar2(SystemDisplay *toDisplay, int x, int y, int dx, int dy, byte c, RGBA fgcolor, RGBA bgcolor)
141     {
142     drawChar2(toDisplay, dx+x*mRealWidth, dy+y*mRealHeight, c, fgcolor, bgcolor);
143     }

  ViewVC Help
Powered by ViewVC 1.1.26