#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flogo.h" #include "engine.h" using namespace std; Fl_Window *window; Fl_Scroll *drawscroll; Fl_Box *drawimagebox,*turtleimagebox; Fl_RGB_Image *drawimage,*turtleimage; Fl_Select_Browser *histbrowser; Fl_Input *cmdinput; Fl_Button *evaluatebutton; uchar *imagebuf,*turtlebuf; Turtle turtle; void bresenham(int x1,int y1,int x2,int y2,uchar *buf,int bufintsz,int bufcellsz,uint32_t v){ int steep,deltax,deltay,error,ystep,x,y; steep=abs(y2-y1)>abs(x2-x1); if(steep){ swap(x1,y1); swap(x2,y2); } if(x1>x2){ swap(x1,x2); swap(y1,y2); } deltax=x2-x1; deltay=abs(y2-y1); error=deltax/2; if(y1uncache(); window->redraw(); } void drawturtle(void){ memset(turtlebuf,0,WIDTH*HEIGHT*2*sizeof(uchar)); const double raddir=turtle.dir*M_PI/180; const int x1=turtle.x-15*cos(raddir), //left-bottom y1=turtle.y-15*sin(raddir), x2=turtle.x+15*cos(raddir), //right-bottom y2=turtle.y+15*sin(raddir), x3=turtle.x+15*sin(raddir), //top y3=turtle.y-15*cos(raddir); bresenham(x1,y1,x2,y2,turtlebuf+1,1,2,255); bresenham(x2,y2,x3,y3,turtlebuf+1,1,2,255); bresenham(x3,y3,x1,y1,turtlebuf+1,1,2,255); turtleimage->uncache(); window->redraw(); } void maincallback(Fl_Widget*,void*){ if(Fl::event()==FL_SHORTCUT&&Fl::event_key()==FL_Escape)return; exit(0); } void evaluatebuttoncallback(Fl_Widget*){ if(cmdinput->value()[0]=='\0')return; histbrowser->insert(histbrowser->size(),cmdinput->value()); histbrowser->bottomline(histbrowser->size()); logocommand(cmdinput->value()); cmdinput->value(NULL); } void histcallback(Fl_Widget *wid){ Fl_Select_Browser *br=(Fl_Select_Browser*)wid; cmdinput->value(br->text(br->value())); } int main(int argc,char **argv){ window=new Fl_Window(1016,700,"FLogo"); imagebuf=new uchar[WIDTH*HEIGHT*4]; //RGB(A) memset(imagebuf,255,WIDTH*HEIGHT*4*sizeof(uchar)); turtlebuf=new uchar[WIDTH*HEIGHT*2]; //GA memset(turtlebuf,0,WIDTH*HEIGHT*2*sizeof(uchar)); drawscroll=new Fl_Scroll(0,0,window->w(),window->h()-150); drawimagebox=new Fl_Box(0,0,WIDTH,HEIGHT); drawimage=new Fl_RGB_Image(imagebuf,WIDTH,HEIGHT,4); drawimagebox->image(drawimage); turtleimagebox=new Fl_Box(0,0,WIDTH,HEIGHT); turtleimage=new Fl_RGB_Image(turtlebuf,WIDTH,HEIGHT,2); turtleimagebox->image(turtleimage); drawscroll->end(); drawscroll->scroll_to(max(0,WIDTH-drawscroll->w())/2,max(0,HEIGHT-drawscroll->h())/2); drawturtle(); cmdinput=new Fl_Input(0,window->h()-25,window->w()-150,25); cmdinput->when(FL_WHEN_ENTER_KEY|FL_WHEN_NOT_CHANGED); cmdinput->callback(evaluatebuttoncallback); evaluatebutton=new Fl_Button(cmdinput->x()+cmdinput->w(),cmdinput->y(),80,cmdinput->h(),"Evaluate"); evaluatebutton->callback(evaluatebuttoncallback); window->add(evaluatebutton); histbrowser=new Fl_Select_Browser(0,drawscroll->y()+drawscroll->h(),cmdinput->w(),cmdinput->y()-(drawscroll->y()+drawscroll->h())); histbrowser->callback(histcallback); histbrowser->add(""); //add blank line window->resizable(drawscroll); window->end(); Fl::visual(FL_RGB); //window->callback(maincallback); //disable esc window closing window->show(argc,argv); return Fl::run(); }