#include <fastgl/fastgl.h>
enum SHAPE {
_RECT, _FILLRECT, _CIRCLE, _FILLCIRCLE, _ELLIPSE, _FILLELLIPSE, _LINE, _SPLINE, _POINT, _POLY, _FILLPOLY, _ARC,
_RECTW, _FILLRECTW, _CIRCLEW, _FILLCIRCLEW, _ELLIPSEW, _FILLELLIPSEW, _LINEW, _SPLINEW, _POINTW, _POLYW, _FILLPOLYW, _ARCW
};
struct PARAM
{
int ppop;
fgl::FGPixel ink, paper;
FGPoint points[8];
fgl::FGWindow *w;
fgl::FGRect rect;
int vertex[7][2];
};
void shape(SHAPE sh, PARAM& param)
{
switch(sh)
{
case _RECT:
fgl::draw_box(param.rect.x, param.rect.y, param.rect.w, param.rect.h, param.ink, param.ppop);
break;
case _FILLRECT:
fgl::fill_box(param.rect.x, param.rect.y, param.rect.w, param.rect.h, param.ink, param.ppop);
break;
case _CIRCLE:
fgl::draw_circle(param.rect.x, param.rect.y, param.rect.w/2, param.ink, param.ppop);
break;
case _FILLCIRCLE:
fgl::fill_circle(param.rect.x, param.rect.y, param.rect.w/2, param.ink, param.ppop);
break;
case _ELLIPSE:
fgl::draw_ellipse(param.rect.x, param.rect.y, param.rect.w/2, param.rect.h/4, param.ink, param.ppop);
break;
case _FILLELLIPSE:
fgl::fill_ellipse(param.rect.x, param.rect.y, param.rect.w/2, param.rect.h/4, param.ink, param.ppop);
break;
case _LINE:
fgl::draw_line(param.rect.x, param.rect.y, param.rect.x+100, param.rect.y+100, param.ink, param.ppop);
break;
case _SPLINE:
fgl::draw_spline(param.points, param.ink, param.ppop);
break;
case _POINT:
fgl::draw_point(param.rect.x, param.rect.y, param.ink, param.ppop);
break;
case _POLY:
fgl::draw_convex(7, param.vertex, param.ink, param.ppop);
break;
case _FILLPOLY:
fgl::fill_convex(7, param.vertex, param.ink, param.ppop);
break;
case _ARC:
fgl::draw_arc(param.rect.x, param.rect.y, 0, 1, 50, param.ink, param.ppop);
break;
case _RECTW:
param.w->WindowRect(param.rect.x, param.rect.y, param.rect.w, param.rect.h, param.ink);
break;
case _FILLRECTW:
param.w->WindowBox(param.rect.x, param.rect.y, param.rect.w, param.rect.h, param.ink);
break;
case _CIRCLEW:
param.w->WindowDrawCircle(param.rect.x, param.rect.y, param.rect.w/2, param.ink);
break;
case _FILLCIRCLEW:
param.w->WindowFillCircle(param.rect.x, param.rect.y, param.rect.w/2, param.ink);
break;
case _LINEW:
param.w->WindowLine(param.rect.x, param.rect.y, param.rect.x+30, param.rect.y+30, param.ink);
break;
}
}
void primitiv(PARAM p)
{
shape(_FILLRECT, p);
p.ink = fgl::CRED;
shape(_RECT, p);
p.rect.x += 170;
p.rect.y += 50;
p.ink = fgl::CWHITE;
shape(_FILLCIRCLE, p);
p.ink = fgl::CRED;
shape(_CIRCLE, p);
p.rect.x += 120;
p.ink = fgl::CWHITE;
shape(_FILLELLIPSE, p);
p.ink = fgl::CRED;
shape(_ELLIPSE, p);
p.rect.x += 100;
p.rect.y -= 50;
p.ink = fgl::CWHITE;
shape(_LINE, p);
p.rect.x += 100;
p.ink = fgl::CWHITE;
p.points[0] = FGPoint(p.rect.x, p.rect.y);
p.points[1] = FGPoint(p.rect.x+65, p.rect.y+20);
p.points[2] = FGPoint(p.rect.x+25, p.rect.y+40);
p.points[3] = FGPoint(p.rect.x+87, p.rect.y+100);
shape(_SPLINE, p);
p.rect.x += 100;
p.ink = fgl::CWHITE;
shape(_POINT, p);
int mz[7][2] = {{62,186},{135,150},{221,197},{377,125},{231,25},{150,85},{10,18}};
memcpy(p.vertex, mz, 7*2*4);
p.ink = fgl::CWHITE;
shape(_FILLPOLY, p);
p.ink = fgl::CRED;
shape(_POLY, p);
p.ink = fgl::CWHITE;
shape(_ARC, p);
}
void window_test(PARAM p)
{
p.w->set_ppop(fgl::_GXOR);
shape(_FILLRECTW, p);
p.ink = fgl::CRED;
shape(_RECTW, p);
p.rect.x += 40;
p.ink = fgl::CWHITE;
shape(_FILLCIRCLEW, p);
p.ink = fgl::CRED;
shape(_CIRCLEW, p);
p.rect.x += 30;
p.rect.y -= 20;
p.ink = fgl::CWHITE;
shape(_LINEW, p);
}
int main(int argc, char **argv)
{
fgl::FGApp MyApp(fgl::G800x600, argc, argv, fgl::CGRAYED);
fgl::FGWindow *w;
PARAM p;
p.ppop = fgl::_GSET;
p.ink = fgl::CWHITE;
p.rect.x = 100;
p.rect.y = 300;
p.rect.w = 100;
p.rect.h = 100;
primitiv(p);
p.ppop = fgl::_GXOR;
p.ink = fgl::CWHITE;
p.rect.x = 100;
p.rect.y = 300;
p.rect.w = 100;
p.rect.h = 100;
primitiv(p);
new fgl::FGWindow(&w, 200,200,400,300, "Test Window");
p.ppop = fgl::_GSET;
p.ink = fgl::CWHITE;
p.rect.x = 10;
p.rect.y = 30;
p.rect.w = 20;
p.rect.h = 20;
p.w = w;
window_test(p);
MyApp.Run();
return 0;
}