1 #include "../../../include/freenet/captcha/alternatecaptcha1.h"
\r
6 #ifdef ALTERNATE_CAPTCHA
\r
8 AlternateCaptcha1::AlternateCaptcha1()
\r
10 AlternateCaptchaFonts fonts;
\r
11 m_fonts=fonts.Fonts();
\r
14 void AlternateCaptcha1::Generate()
\r
16 if(m_fonts.size()==0)
\r
21 std::string puzzlestring=GenerateRandomString(5);
\r
22 FreeImage::Bitmap tempchar(50,50,32);
\r
23 tempchar.SetTransparent();
\r
24 FreeImage::Bitmap bmp(110,50,32);
\r
25 bmp.SetTransparent();
\r
31 if(m_fonts.size()>0)
\r
33 for(int i=0; i<puzzlestring.size(); i++)
\r
39 int xoffset=(i*20)-(5+(rand()%5));
\r
40 int yoffset=(rand()%20)-10;
\r
41 int fontnum=rand()%m_fonts.size();
\r
42 FreeImage::Bitmap charbmp=m_fonts[fontnum].Char(puzzlestring[i]);
\r
44 tempchar.SetTransparent();
\r
45 tempchar.ClearTransparent();
\r
46 tempchar.BlitTrans(charbmp,25-(charbmp.Width()/2),25-(charbmp.Height()/2),0,0,charbmp.Width(),charbmp.Height());
\r
47 tempchar.Rotate((rand()%60)-30,0,0,25,25);
\r
49 bmp.BlitTrans(tempchar,xoffset,yoffset,0,0,50,50);
\r
53 //place some random lines
\r
58 white.rgbReserved=255;
\r
59 int numlines=(rand()%5)+5;
\r
60 for(int i=0; i<numlines; i++)
\r
62 // draw 4 short lines very close to each other
\r
68 x1[0]=rand()%bmp.Width();
\r
69 y1[0]=rand()%bmp.Height();
\r
70 x2[0]=x1[0]+(rand()%40)-20;
\r
71 y2[0]=y1[0]+(rand()%40)-20;
\r
73 for(int i=1; i<4; i++)
\r
75 x1[i]=x1[i-1]+rand()%3-1;
\r
76 y1[i]=y1[i-1]+rand()%3-1;
\r
77 x2[i]=x2[i-1]+rand()%3-1;
\r
78 y2[i]=y2[i-1]+rand()%3-1;
\r
81 for(int i=0; i<4; i++)
\r
83 bmp.Line(x1[i],y1[i],x2[i],y2[i],white);
\r
87 // make output a little wavy
\r
88 int offset=rand()%10000;
\r
89 for(int y=0; y<bmp.Height(); y++)
\r
91 double shift=sin((double)(y+offset)/3.0);
\r
92 bmp.HorizontalOffset(y,shift);
\r
96 m_solution.insert(m_solution.end(),puzzlestring.begin(),puzzlestring.end());
\r
98 bmp.SaveToMemory("bmp",m_puzzle);
\r
102 const std::string AlternateCaptcha1::GenerateRandomString(const int len)
\r
104 // no l,1 O,0 because they look too much alike
\r
105 static std::string chars="abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789@#";
\r
106 std::string temp="";
\r
107 for(int i=0; i<len; i++)
\r
109 temp+=chars[rand()%chars.size()];
\r
114 const bool AlternateCaptcha1::GetPuzzle(std::vector<unsigned char> &puzzle)
\r
120 const bool AlternateCaptcha1::GetSolution(std::vector<unsigned char> &solution)
\r
122 solution=m_solution;
\r
126 #endif // ALTERNATE_CAPTCHA
\r