version 0.3.14
[fms.git] / src / freenet / captcha / freeimage / font.cpp
diff --git a/src/freenet/captcha/freeimage/font.cpp b/src/freenet/captcha/freeimage/font.cpp
new file mode 100644 (file)
index 0000000..0f9541c
--- /dev/null
@@ -0,0 +1,92 @@
+#include "../../../../include/freenet/captcha/freeimage/font.h"\r
+\r
+namespace FreeImage\r
+{\r
+\r
+Font::Font()\r
+{\r
+       m_fontwidth=0;\r
+       m_fontheight=0;\r
+}\r
+\r
+Font::Font(const Bitmap &bmp)\r
+{\r
+       m_fontwidth=0;\r
+       m_fontheight=0;\r
+       Load(bmp);\r
+}\r
+\r
+Font::~Font()\r
+{\r
+\r
+}\r
+\r
+const Bitmap &Font::Char(const int num)\r
+{\r
+       if(num>=0 && num<256 && m_chars.size()>num)\r
+       {\r
+               return m_chars[num];\r
+       }\r
+       else\r
+       {\r
+               return m_blank;\r
+       }\r
+}\r
+\r
+const bool Font::Load(const Bitmap &bmp)\r
+{\r
+       m_fontwidth=bmp.Width()/16;\r
+       m_fontheight=bmp.Height()/14;\r
+\r
+       m_chars.clear();\r
+       m_chars.resize(256);\r
+\r
+       int charnum=32;\r
+       for(int yy=0; yy<bmp.Height(); yy+=m_fontheight)\r
+       {\r
+               for(int xx=0; xx<bmp.Width(); xx+=m_fontwidth)\r
+               {\r
+                       bool found=false;\r
+                       int width=m_fontwidth;\r
+                       int idx=bmp.GetPixelIndex(xx+m_fontwidth-1,yy);\r
+                       for(int x=xx+m_fontwidth-1; x>xx && found==false; x--)\r
+                       {\r
+                               for(int y=yy; y<yy+m_fontheight && found==false; y++)\r
+                               {\r
+                                       if(bmp.GetPixelIndex(x,y)!=idx)\r
+                                       {\r
+                                               found=true;\r
+                                       }\r
+                               }\r
+                               if(found==false)\r
+                               {\r
+                                       width--;\r
+                               }\r
+                       }\r
+                       width==0 ? width=1 : width=width;\r
+                       width++;\r
+                       width>m_fontwidth ? width=m_fontwidth : false;\r
+                       m_chars[charnum].Create(width,m_fontheight,32);\r
+                       m_chars[charnum].Blit(bmp,0,0,xx,yy,width,m_fontheight,-1);\r
+                       m_chars[charnum].SetTransparent();\r
+                       RGBQUAD col=m_chars[charnum].GetPixel(m_chars[charnum].Width()-1,0);\r
+                       for(int y=0; y<m_chars[charnum].Height(); y++)\r
+                       {\r
+                               for(int x=0; x<m_chars[charnum].Width(); x++)\r
+                               {\r
+                                       RGBQUAD col2=m_chars[charnum].GetPixel(x,y);\r
+                                       if(col.rgbRed==col2.rgbRed && col.rgbGreen==col2.rgbGreen && col.rgbBlue==col2.rgbBlue)\r
+                                       {\r
+                                               col2.rgbReserved=0;\r
+                                               m_chars[charnum].PutPixel(x,y,col2);\r
+                                       }\r
+                               }\r
+                       }\r
+                       charnum++;\r
+               }\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+}      // namespace FreeImage\r