packages feed

fltkhs-0.1.0.0: c-examples/curve.c

#include <Fl_C.h>
#include <Fl_Double_WindowC.h>
#include <Fl_DrawC.h>
#include <Fl_Value_SliderC.h>
#include <Fl_Toggle_ButtonC.h>
#include <Fl_WidgetC.h>
#include <stdio.h>
#include <Fl_SliderC.h>

double args[9] = {
  20,20, 50,200, 100,20, 200,200, 0};
const char* name[9] = {
  "X0", "Y0", "X1", "Y1", "X2", "Y2", "X3", "Y3", "rotate"};

int points;

void draw(fl_Widget w){
  flc_push_clip(Fl_Widget_x(w),Fl_Widget_y(w),Fl_Widget_w(w),Fl_Widget_h(w));
  flc_set_color(FL_DARK3);
  flc_rectf(Fl_Widget_x(w),Fl_Widget_y(w),Fl_Widget_w(w),Fl_Widget_h(w));
  flc_push_matrix();
  if (args[8]) {
    flc_translate(Fl_Widget_x(w)+Fl_Widget_w(w)/2.0, Fl_Widget_y(w)+Fl_Widget_h(w)/2.0);
    flc_rotate(args[8]);
    flc_translate(-(Fl_Widget_x(w)+Fl_Widget_w(w)/2.0), -(Fl_Widget_y(w)+Fl_Widget_h(w)/2.0));
  }
  flc_translate(Fl_Widget_x(w),Fl_Widget_y(w));
  if (!points) {
    flc_set_color(FL_WHITE);
    flc_begin_complex_polygon();
    flc_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
    flc_end_complex_polygon();
  }
  flc_set_color(FL_BLACK);
  flc_begin_line();
  flc_vertex(args[0],args[1]);
  flc_vertex(args[2],args[3]);
  flc_vertex(args[4],args[5]);
  flc_vertex(args[6],args[7]);
  flc_end_line();
  flc_set_color(points ? FL_WHITE : FL_RED);
  points ? flc_begin_points() : flc_begin_line();
  flc_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
  points ? flc_end_points() : flc_end_line();
  flc_pop_matrix();
  flc_pop_clip();
}

fl_Widget d;

void points_cb(fl_Widget o, void* user_data) {
  points = Fl_Toggle_Button_value((fl_Toggle_Button)o);
  Fl_Widget_redraw(d);
}

void slider_cb(fl_Widget o, void* v) {
  fl_Slider s = (fl_Slider)o;
  args[(fl_intptr_t)(v)] = Fl_Slider_value(s);
  Fl_Widget_redraw(d);
}

int main(int argc, char** argv) {
  fl_Widget_Virtual_Funcs* funcs = Fl_Widget_default_virtual_funcs();
  funcs->draw = &draw;
  fl_Double_Window window = (fl_Double_Window)Fl_Double_Window_New(300,555);
  fl_Widget drawing = (fl_Widget)Fl_OverriddenWidget_New(10,10,280,280,funcs);
  d = drawing;
  int y = 300;
  int n = 0;
  for (; n<9; n++) {
    fl_Hor_Value_Slider s = (fl_Hor_Value_Slider)Fl_Hor_Value_Slider_New_WithLabel(50,y,240,25,name[n]);
    y += 25;
    Fl_Value_Slider_set_minimum(s,0); Fl_Value_Slider_set_maximum(s,280);
    if (n == 8) Fl_Value_Slider_set_maximum(s,360);
    Fl_Value_Slider_set_step(s,1);
    Fl_Value_Slider_set_value(s,args[n]);
    Fl_Value_Slider_set_align(s,FL_ALIGN_LEFT);
#ifdef __LP64__
    Fl_Value_Slider_set_callback_with_user_data(s,slider_cb, (void*) (long long)n);
#else
    Fl_Value_Slider_set_callback_with_user_data(s,slider_cb, (void*)n);
#endif
  }
  fl_Toggle_Button but = (fl_Toggle_Button)Fl_Toggle_Button_New_WithLabel(50,y,50,25,"points");
  Fl_Toggle_Button_set_callback(but,points_cb);

  Fl_Double_Window_end(window);
  Fl_Double_Window_show_with_args(window,argc,argv);
  return Fl_run();
}