1 #include "../../../include/freenet/captcha/alternatecaptcha1.h"
\r
3 #include <Poco/Path.h>
\r
4 #include <Poco/DirectoryIterator.h>
\r
8 #ifdef ALTERNATE_CAPTCHA
\r
10 bool AlternateCaptcha1::m_fontsloaded(false);
\r
11 std::vector<FreeImage::Font> AlternateCaptcha1::m_fonts;
\r
13 AlternateCaptcha1::AlternateCaptcha1()
\r
15 if(m_fontsloaded==false)
\r
17 FreeImage_Initialise(true);
\r
23 void AlternateCaptcha1::Generate()
\r
25 std::string puzzlestring=GenerateRandomString(5);
\r
26 FreeImage::Bitmap tempchar(50,50,32);
\r
27 tempchar.SetTransparent();
\r
28 FreeImage::Bitmap bmp(110,50,32);
\r
29 bmp.SetTransparent();
\r
35 if(m_fonts.size()>0)
\r
37 for(int i=0; i<puzzlestring.size(); i++)
\r
43 int xoffset=(i*20)-(5+(rand()%5));
\r
44 int yoffset=(rand()%20)-10;
\r
45 int fontnum=rand()%m_fonts.size();
\r
46 FreeImage::Bitmap charbmp=m_fonts[fontnum].Char(puzzlestring[i]);
\r
48 tempchar.SetTransparent();
\r
49 tempchar.ClearTransparent();
\r
50 tempchar.BlitTrans(charbmp,25-(charbmp.Width()/2),25-(charbmp.Height()/2),0,0,charbmp.Width(),charbmp.Height());
\r
51 tempchar.Rotate((rand()%60)-30,0,0,25,25);
\r
53 bmp.BlitTrans(tempchar,xoffset,yoffset,0,0,50,50);
\r
57 //place some random lines
\r
62 white.rgbReserved=255;
\r
63 int numlines=(rand()%5)+10;
\r
64 for(int i=0; i<numlines; i++)
\r
66 // draw 4 short lines very close to each other
\r
72 x1[0]=rand()%bmp.Width();
\r
73 y1[0]=rand()%bmp.Height();
\r
74 x2[0]=x1[0]+(rand()%40)-20;
\r
75 y2[0]=y1[0]+(rand()%40)-20;
\r
77 for(int i=1; i<4; i++)
\r
79 x1[i]=x1[i-1]+rand()%3-1;
\r
80 y1[i]=y1[i-1]+rand()%3-1;
\r
81 x2[i]=x2[i-1]+rand()%3-1;
\r
82 y2[i]=y2[i-1]+rand()%3-1;
\r
85 for(int i=0; i<4; i++)
\r
87 bmp.Line(x1[i],y1[i],x2[i],y2[i],white);
\r
91 // make output a little wavy
\r
92 int offset=rand()%10000;
\r
93 for(int y=0; y<bmp.Height(); y++)
\r
95 double shift=sin((double)(y+offset)/3.0);
\r
96 bmp.HorizontalOffset(y,shift);
\r
100 m_solution.insert(m_solution.end(),puzzlestring.begin(),puzzlestring.end());
\r
102 bmp.SaveToMemory("bmp",m_puzzle);
\r
106 const std::string AlternateCaptcha1::GenerateRandomString(const int len)
\r
108 // no l,1 O,0 because they look too much alike
\r
109 static std::string chars="abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789@#";
\r
110 std::string temp="";
\r
111 for(int i=0; i<len; i++)
\r
113 temp+=chars[rand()%chars.size()];
\r
118 const bool AlternateCaptcha1::GetPuzzle(std::vector<unsigned char> &puzzle)
\r
124 const bool AlternateCaptcha1::GetSolution(std::vector<unsigned char> &solution)
\r
126 solution=m_solution;
\r
130 void AlternateCaptcha1::LoadFonts()
\r
133 FreeImage::Bitmap bmp;
\r
134 Poco::Path path("fonts");
\r
135 Poco::DirectoryIterator di(path);
\r
136 Poco::DirectoryIterator end;
\r
140 if(di.name().find("bmp")!=std::string::npos)
\r
142 bmp.Load("bmp",di.path().toString());
\r
143 m_fonts.push_back(FreeImage::Font(bmp));
\r
150 #endif // ALTERNATE_CAPTCHA
\r