version 0.3.14
[fms.git] / src / freenet / captcha / freeimage / font.cpp
1 #include "../../../../include/freenet/captcha/freeimage/font.h"\r
2 \r
3 namespace FreeImage\r
4 {\r
5 \r
6 Font::Font()\r
7 {\r
8         m_fontwidth=0;\r
9         m_fontheight=0;\r
10 }\r
11 \r
12 Font::Font(const Bitmap &bmp)\r
13 {\r
14         m_fontwidth=0;\r
15         m_fontheight=0;\r
16         Load(bmp);\r
17 }\r
18 \r
19 Font::~Font()\r
20 {\r
21 \r
22 }\r
23 \r
24 const Bitmap &Font::Char(const int num)\r
25 {\r
26         if(num>=0 && num<256 && m_chars.size()>num)\r
27         {\r
28                 return m_chars[num];\r
29         }\r
30         else\r
31         {\r
32                 return m_blank;\r
33         }\r
34 }\r
35 \r
36 const bool Font::Load(const Bitmap &bmp)\r
37 {\r
38         m_fontwidth=bmp.Width()/16;\r
39         m_fontheight=bmp.Height()/14;\r
40 \r
41         m_chars.clear();\r
42         m_chars.resize(256);\r
43 \r
44         int charnum=32;\r
45         for(int yy=0; yy<bmp.Height(); yy+=m_fontheight)\r
46         {\r
47                 for(int xx=0; xx<bmp.Width(); xx+=m_fontwidth)\r
48                 {\r
49                         bool found=false;\r
50                         int width=m_fontwidth;\r
51                         int idx=bmp.GetPixelIndex(xx+m_fontwidth-1,yy);\r
52                         for(int x=xx+m_fontwidth-1; x>xx && found==false; x--)\r
53                         {\r
54                                 for(int y=yy; y<yy+m_fontheight && found==false; y++)\r
55                                 {\r
56                                         if(bmp.GetPixelIndex(x,y)!=idx)\r
57                                         {\r
58                                                 found=true;\r
59                                         }\r
60                                 }\r
61                                 if(found==false)\r
62                                 {\r
63                                         width--;\r
64                                 }\r
65                         }\r
66                         width==0 ? width=1 : width=width;\r
67                         width++;\r
68                         width>m_fontwidth ? width=m_fontwidth : false;\r
69                         m_chars[charnum].Create(width,m_fontheight,32);\r
70                         m_chars[charnum].Blit(bmp,0,0,xx,yy,width,m_fontheight,-1);\r
71                         m_chars[charnum].SetTransparent();\r
72                         RGBQUAD col=m_chars[charnum].GetPixel(m_chars[charnum].Width()-1,0);\r
73                         for(int y=0; y<m_chars[charnum].Height(); y++)\r
74                         {\r
75                                 for(int x=0; x<m_chars[charnum].Width(); x++)\r
76                                 {\r
77                                         RGBQUAD col2=m_chars[charnum].GetPixel(x,y);\r
78                                         if(col.rgbRed==col2.rgbRed && col.rgbGreen==col2.rgbGreen && col.rgbBlue==col2.rgbBlue)\r
79                                         {\r
80                                                 col2.rgbReserved=0;\r
81                                                 m_chars[charnum].PutPixel(x,y,col2);\r
82                                         }\r
83                                 }\r
84                         }\r
85                         charnum++;\r
86                 }\r
87         }\r
88 \r
89         return true;\r
90 }\r
91 \r
92 }       // namespace FreeImage\r