FLTK logo

[master] bf825f8 - Add a unit test for drawing complex shapes (#565)

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] bf825f8 - Add a unit test for drawing complex shapes (#565) "Matthias Melcher" Nov 30, 2022  
 
commit bf825f8ebd18615fdbecb449c14300105d469a24
Author:     Matthias Melcher <github@matthiasm.com>
AuthorDate: Wed Nov 30 22:40:52 2022 +0100
Commit:     GitHub <noreply@github.com>
CommitDate: Wed Nov 30 22:40:52 2022 +0100

    Add a unit test for drawing complex shapes (#565)

 FL/Fl_Graphics_Driver.H                            |   2 +
 FL/fl_draw.H                                       |  13 +
 documentation/src/drawing.dox                      |   6 +
 src/Fl_Graphics_Driver.cxx                         |   1 +
 .../OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx    |   5 +
 src/fl_curve.cxx                                   |  13 +-
 src/fl_vertex.cxx                                  |  15 +
 test/unittest_complex_shapes.cxx                   | 485 +++++++++++++++++----
 test/unittest_fast_shapes.cxx                      |   4 +-
 test/unittests.cxx                                 |   1 +
 test/unittests.h                                   |   2 +-
 11 files changed, 457 insertions(+), 90 deletions(-)

diff --git FL/Fl_Graphics_Driver.H FL/Fl_Graphics_Driver.H
index 817fcd9..006721f 100644
--- FL/Fl_Graphics_Driver.H
+++ FL/Fl_Graphics_Driver.H
@@ -234,6 +234,8 @@ public:
   // support of "complex shapes"
   void push_matrix();
   void pop_matrix();
+  void load_identity();
+  void load_matrix(double a, double b, double c, double d, double x, double y);
   void mult_matrix(double a, double b, double c, double d, double x, double y);
   void rotate(double d);
   void translate(double x,double y);
diff --git FL/fl_draw.H FL/fl_draw.H
index fc3e401..33c1f71 100644
--- FL/fl_draw.H
+++ FL/fl_draw.H
@@ -551,6 +551,19 @@ inline void fl_rotate(double d) {
   fl_graphics_driver->rotate(d);
 }
 /**
+  Set the transformation matrix to identity.
+ */
+inline void fl_load_identity() {
+  fl_graphics_driver->load_identity();
+}
+/**
+ Set the current transformation matrix.
+ \param[in] a,b,c,d,x,y transformation matrix elements
+ */
+inline void fl_load_matrix(double a, double b, double c, double d, double x, double y) {
+  fl_graphics_driver->load_matrix(a, b, c, d, x, y);
+}
+/**
   Concatenate another transformation onto the current one.
 
   \param[in] a,b,c,d,x,y transformation matrix elements such that
diff --git documentation/src/drawing.dox documentation/src/drawing.dox
index f69796d..8b0f37d 100644
--- documentation/src/drawing.dox
+++ documentation/src/drawing.dox
@@ -557,6 +557,12 @@ severely limits the accuracy of these functions for complex
 graphics, so use OpenGL when greater accuracy and/or performance
 is required.
 
+void fl_load_matrix(double a,double b,double c,double d,double x,double y)
+void fl_load_identity()
+
+\par
+Set the current transformation.
+
 void fl_push_matrix() <br>
 void fl_pop_matrix()
 
diff --git src/Fl_Graphics_Driver.cxx src/Fl_Graphics_Driver.cxx
index 967b015..35697c2 100644
--- src/Fl_Graphics_Driver.cxx
+++ src/Fl_Graphics_Driver.cxx
@@ -55,6 +55,7 @@ Fl_Graphics_Driver::Fl_Graphics_Driver()
   p_size = 0;
   xpoint = NULL;
   what = NONE;
+  n = 0;
 };
 
 /** Destructor */
diff --git src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx
index 7cd144c..b5ec90b 100644
--- src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx
+++ src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx
@@ -41,6 +41,7 @@
 // double Fl_OpenGL_Graphics_Driver::transform_dy(double x, double y)
 
 void Fl_OpenGL_Graphics_Driver::begin_points() {
+  Fl_Graphics_Driver::begin_points();
   glBegin(GL_POINTS);
 }
 
@@ -49,6 +50,7 @@ void Fl_OpenGL_Graphics_Driver::end_points() {
 }
 
 void Fl_OpenGL_Graphics_Driver::begin_line() {
+  Fl_Graphics_Driver::begin_line();
   glBegin(GL_LINE_STRIP);
 }
 
@@ -57,6 +59,7 @@ void Fl_OpenGL_Graphics_Driver::end_line() {
 }
 
 void Fl_OpenGL_Graphics_Driver::begin_loop() {
+  Fl_Graphics_Driver::begin_loop();
   glBegin(GL_LINE_LOOP);
 }
 
@@ -65,6 +68,7 @@ void Fl_OpenGL_Graphics_Driver::end_loop() {
 }
 
 void Fl_OpenGL_Graphics_Driver::begin_polygon() {
+  Fl_Graphics_Driver::begin_polygon();
   glBegin(GL_POLYGON);
 }
 
@@ -73,6 +77,7 @@ void Fl_OpenGL_Graphics_Driver::end_polygon() {
 }
 
 void Fl_OpenGL_Graphics_Driver::begin_complex_polygon() {
+  Fl_Graphics_Driver::begin_complex_polygon();
   glBegin(GL_POLYGON);
 }
 
diff --git src/fl_curve.cxx src/fl_curve.cxx
index 58cb276..c3324f9 100644
--- src/fl_curve.cxx
+++ src/fl_curve.cxx
@@ -46,21 +46,22 @@ void Fl_Graphics_Driver::curve(double X0, double Y0,
   fl_transformed_vertex(x,y);
 
   double x1 = fl_transform_x(X1,Y1);
-  double yy1 = fl_transform_y(X1,Y1);
+  double y1 = fl_transform_y(X1,Y1);
   double x2 = fl_transform_x(X2,Y2);
   double y2 = fl_transform_y(X2,Y2);
   double x3 = fl_transform_x(X3,Y3);
   double y3 = fl_transform_y(X3,Y3);
 
   // find the area:
-  double a = fabs((x-x2)*(y3-yy1)-(y-y2)*(x3-x1));
-  double b = fabs((x-x3)*(y2-yy1)-(y-y3)*(x2-x1));
+  double a = fabs((x-x2)*(y3-y1)-(y-y2)*(x3-x1));
+  double b = fabs((x-x3)*(y2-y1)-(y-y3)*(x2-x1));
   if (b > a) a = b;
 
   // use that to guess at the number of segments:
   int nSeg = int(sqrt(a)/4);
   if (nSeg > 1) {
     if (nSeg > 100) nSeg = 100; // make huge curves not hang forever
+    if (nSeg < 9) nSeg = 9; // make tiny curevs look bearable
 
     double e = 1.0/nSeg;
 
@@ -74,9 +75,9 @@ void Fl_Graphics_Driver::curve(double X0, double Y0,
     double dx2 = dx3 + 2*xb*e*e;
 
     // calculate the coefficients of 3rd order equation:
-    double ya = (y3-3*y2+3*yy1-y);
-    double yb = 3*(y2-2*yy1+y);
-    double yc = 3*(yy1-y);
+    double ya = (y3-3*y2+3*y1-y);
+    double yb = 3*(y2-2*y1+y);
+    double yc = 3*(y1-y);
     // calculate the forward differences:
     double dy1 = ((ya*e+yb)*e+yc)*e;
     double dy3 = 6*ya*e*e*e;
diff --git src/fl_vertex.cxx src/fl_vertex.cxx
index c17a89e..c02e24f 100644
--- src/fl_vertex.cxx
+++ src/fl_vertex.cxx
@@ -57,6 +57,21 @@ void Fl_Graphics_Driver::pop_matrix() {
     m = stack[--sptr];
 }
 
+/** see fl_load_identity() */
+void Fl_Graphics_Driver::load_identity() {
+  m = m0;
+}
+
+/** see fl_load_matrix() */
+void Fl_Graphics_Driver::load_matrix(double a, double b, double c, double d, double x, double y) {
+  m.a = a;
+  m.b = b;
+  m.c = c;
+  m.d = d;
+  m.x = x;
+  m.y = y;
+}
+
 /** see fl_mult_matrix() */
 void Fl_Graphics_Driver::mult_matrix(double a, double b, double c, double d, double x, double y) {
   matrix o;
diff --git test/unittest_complex_shapes.cxx test/unittest_complex_shapes.cxx
index ce8f30c..c2fdfeb 100644
--- test/unittest_complex_shapes.cxx
+++ test/unittest_complex_shapes.cxx
@@ -16,106 +16,429 @@
 
 #include "unittests.h"
 
+#include <config.h>
 #include <FL/Fl_Box.H>
+#include <FL/Fl_Hor_Value_Slider.H>
+#include <FL/Fl_Dial.H>
+#include <FL/Fl_Positioner.H>
 #include <FL/fl_draw.H>
 
-#if 0
-
-// TODO:
-void fl_push_matrix()
-void fl_pop_matrix()
-
-void fl_scale(double x,double y)
-void fl_scale(double x)
-void fl_translate(double x,double y)
-void fl_rotate(double d)
-void fl_mult_matrix(double a,double b,double c,double d,double x,double y)
-
-double fl_transform_x(double x, double y)
-double fl_transform_y(double x, double y)
-double fl_transform_dx(double x, double y)
-double fl_transform_dy(double x, double y)
-void fl_transformed_vertex(double xf, double yf)
-
-void fl_begin_points()
-void fl_end_points()
-
-void fl_begin_line()
-void fl_end_line()
-
-void fl_begin_loop()
-void fl_end_loop()
-
-void fl_begin_polygon()
-void fl_end_polygon()
+#if HAVE_GL
+#include <FL/Fl_Gl_Window.H>
+#endif
 
-void fl_begin_complex_polygon()
-void fl_gap()
-void fl_end_complex_polygon()
+//
+// --- test drawing circles and arcs ------
+//
 
-void fl_vertex(double x,double y)
+class ComplexShapesTest;
 
-void fl_curve(double X0, double Y0, double X1, double Y1, double X2, double Y2, double X3, double Y3)
+void draw_complex(ComplexShapesTest *p);
 
-void fl_arc(double x, double y, double r, double start, double end)
-void fl_circle(double x, double y, double r)
+#if HAVE_GL
 
+class GLComplexShapesTest : public Fl_Gl_Window {
+public:
+  GLComplexShapesTest(int x, int y, int w, int h)
+  : Fl_Gl_Window(x, y, w, h) {
+    box(FL_FLAT_BOX);
+    end();
+  }
+  void draw() {
+    draw_begin();
+    Fl_Window::draw();
+    draw_complex((ComplexShapesTest*)parent());
+    draw_end();
+  }
+};
 
 #endif
 
+class NativeComplexShapesTest : public Fl_Window {
+public:
+  NativeComplexShapesTest(int x, int y, int w, int h)
+  : Fl_Window(x, y, w, h) {
+    box(FL_FLAT_BOX);
+    end();
+  }
+  void draw() {
+    Fl_Window::draw();
+    draw_complex((ComplexShapesTest*)parent());
+  }
+};
+
 //
-//------- test Complex Shape drawing capabilities of this implementation ----------
+//------- test the compelx shape drawing capabilities of this implementation ----------
 //
-class ComplexShapesTest : public Fl_Box {
+class ComplexShapesTest : public Fl_Group {
+  NativeComplexShapesTest *native_test_window;
+#if HAVE_GL
+  GLComplexShapesTest *gl_test_window;
+#endif
+  static void update_cb(Fl_Widget *, void *v) {
+    ComplexShapesTest *This = (ComplexShapesTest*)v;
+    This->native_test_window->redraw();
+#if HAVE_GL
+    This->gl_test_window->redraw();
+#endif
+  }
 public:
+  Fl_Hor_Value_Slider *scale;
+  Fl_Dial *rotate;
+  Fl_Positioner *position;
+  void set_transformation() {
+    fl_translate(position->xvalue(), position->yvalue());
+    fl_rotate(-rotate->value());
+    fl_scale(scale->value(), scale->value());
+  }
   static Fl_Widget *create() {
     return new ComplexShapesTest(TESTAREA_X, TESTAREA_Y, TESTAREA_W, TESTAREA_H);
   }
-  ComplexShapesTest(int x, int y, int w, int h) : Fl_Box(x, y, w, h) {
-    label("Testing complex shape drawing.\n\n"
-          "Complex Shapes in FLTK are rendered using floating point coordinates "
-          "which can be transformed through a matrix.");
+  ComplexShapesTest(int x, int y, int w, int h) : Fl_Group(x, y, w, h) {
+    label("Testing complex shape drawing.");
     align(FL_ALIGN_INSIDE|FL_ALIGN_BOTTOM|FL_ALIGN_LEFT|FL_ALIGN_WRAP);
     box(FL_BORDER_BOX);
-  }
-  void draw() {
-    Fl_Box::draw();
-
-    int i, a = x()+10, b = y()+10; fl_color(FL_BLACK); fl_rect(a, b, 100, 100);
-    // testing fl_xyline(x, y, x1)
-    fl_color(FL_RED); fl_point(a+10, b+10); fl_point(a+20, b+10);
-    fl_color(FL_BLACK); fl_xyline(a+10, b+10, a+20);
-    // testing fl_xyline(x, y, x1, y2);
-    fl_color(FL_RED); fl_point(a+10, b+20); fl_point(a+20, b+20);
-    fl_point(a+20, b+30);
-    fl_color(FL_BLACK); fl_xyline(a+10, b+20, a+20, b+30);
-    // testing fl_xyline(x, y, x1, y2, x3);
-    fl_color(FL_RED); fl_point(a+10, b+40); fl_point(a+20, b+40);
-    fl_point(a+20, b+50); fl_point(a+30, b+50);
-    fl_color(FL_BLACK); fl_xyline(a+10, b+40, a+20, b+50, a+30);
-    //+++ add testing for the fl_yxline commands!
-    // testing fl_loop(x,y, x,y, x,y, x, y)
-    fl_color(FL_RED); fl_point(a+60, b+60); fl_point(a+90, b+60);
-    fl_point(a+60, b+90); fl_point(a+90, b+90);
-    fl_color(FL_BLACK);
-    fl_loop(a+60, b+60, a+90, b+60, a+90, b+90, a+60, b+90);
-
-    a = x()+120, b = y()+10; fl_color(FL_BLACK); fl_rect(a, b, 203, 203);
-    a += 101; b += 101;
-    fl_color(0xff888800);
-    for (i=-80; i<=80; i+=20) fl_line(a, b, a+i, b-100);
-    fl_color(0xff444400);
-    for (i=-80; i<=80; i+=20) fl_line(a, b, a+i, b+100);
-    fl_color(0x88ff8800);
-    for (i=-80; i<=80; i+=20) fl_line(a, b, a-100, b+i);
-    fl_color(0x44ff4400);
-    for (i=-80; i<=80; i+=20) fl_line(a, b, a+100, b+i);
-    fl_color(0x8888ff00);
-    fl_line(a, b, a-100, b-100);
-    fl_line(a, b, a+100, b-100);
-    fl_line(a, b, a+100, b+100);
-    fl_line(a, b, a-100, b+100);
+
+    int a = x+16, b = y+34;
+    Fl_Box *t = new Fl_Box(a, b-24, 80, 18, "native");
+    t->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
+
+    native_test_window = new NativeComplexShapesTest(a+23, b-1, 200, 200);
+
+    t = new Fl_Box(a, b, 18, 18, "1");
+    t->box(FL_ROUNDED_BOX); t->color(FL_YELLOW);
+    t->tooltip(// Title:
+               "Testing complex drawing with transformations.\n\n"
+               // Description:
+               "Draw a point pattern, an open line, a closed line, and a covenx polygon.\n\n"
+               // Things to look out for:
+               "Use the controls at the bottom right to scale, rotate, and move the patterns."
+               );
+    b+=44;
+    t = new Fl_Box(a, b, 18, 18, "2");
+    t->box(FL_ROUNDED_BOX); t->color(FL_YELLOW);
+    t->tooltip(// Title:
+               "Testing complex polygons.\n\n"
+               // Description:
+               "Draw polygons at different leves of complexity. "
+               "All polygons should be within the blue boundaries\n\n"
+               // Things to look out for:
+               "1: a convex polygon\n"
+               "2: a non-convex polygon\n"
+               "3: two polygons in a single operation\n"
+               "4: a polygon with a square hole in it"
+               );
+    b+=44;
+    t = new Fl_Box(a, b, 18, 18, "3");
+    t->box(FL_ROUNDED_BOX); t->color(FL_YELLOW);
+    t->tooltip(// Title:
+               "Testing complex polygons with arcs.\n\n"
+               // Description:
+               "Draw polygons with an arc section. "
+               "All polygons should be within the blue boundaries\n\n"
+               // Things to look out for:
+               "1: a polygon with a camel hump\n"
+               "2: a polygon with a camel dip"
+               );
+#if HAVE_GL
+
+    a = x+16+250, b = y+34;
+    t = new Fl_Box(a, b-24, 80, 18, "OpenGL");
+    t->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
+
+    gl_test_window = new GLComplexShapesTest(a+31, b-1, 200, 200);
+
+    t = new Fl_Box(a, b, 26, 18, "1a");
+    t->box(FL_ROUNDED_BOX); t->color(FL_YELLOW);
+    t->tooltip(// Title:
+               "Testing complex drawing with transformations.\n\n"
+               // Description:
+               "Draw a point pattern, an open line, a closed line, and a convex polygon.\n\n"
+               // Things to look out for:
+               "Use the controls at the bottom right to scale, rotate, and move the patterns."
+               );
+    b+=44;
+    t = new Fl_Box(a, b, 28, 18, "2a");
+    t->box(FL_ROUNDED_BOX); t->color(FL_YELLOW);
+    t->tooltip(// Title:
+               "Testing complex polygons.\n\n"
+               // Description:
+               "Draw polygons at different leves of complexity. "
+               "All polygons should be within the blue boundaries\n\n"
+               // Things to look out for:
+               "1: a convex polygon\n"
+               "2: a non-convex polygon\n"
+               "3: two polygons in a single operation\n"
+               "4: a polygon with a square hole in it"
+               );
+    b+=44;
+    t = new Fl_Box(a, b, 28, 18, "3a");
+    t->box(FL_ROUNDED_BOX); t->color(FL_YELLOW);
+    t->tooltip(// Title:
+               "Testing complex polygons with arcs.\n\n"
+               // Description:
+               "Draw polygons with an arc section. "
+               "All polygons should be within the blue boundaries\n\n"
+               // Things to look out for:
+               "1: a polygon with a camel hump\n"
+               "2: a polygon with a camel dip"
+               );
+#endif
+
+    a = TESTAREA_X+TESTAREA_W-250;
+    b = TESTAREA_Y+TESTAREA_H-50;
+
+    scale = new Fl_Hor_Value_Slider(a, b+10, 120, 20, "Scale:");
+    scale->align(FL_ALIGN_TOP_LEFT);
+    scale->range(0.8, 1.2);
+    scale->value(1.0);
+    scale->callback(update_cb, this);
+
+    rotate = new Fl_Dial(a+140, b, 40, 40, "Rotate:");
+    rotate->align(FL_ALIGN_TOP_LEFT);
+    rotate->angles(0, 360);
+    rotate->range(-180.0, 180.0);
+    rotate->value(0.0);
+    rotate->callback(update_cb, this);
+
+    position = new Fl_Positioner(a+200, b, 40, 40, "Offset:");
+    position->align(FL_ALIGN_TOP_LEFT);
+    position->xbounds(-10, 10);
+    position->ybounds(-10, 10);
+    position->value(0.0, 0.0);
+    position->callback(update_cb, this);
+
+    t = new Fl_Box(a-1, b-1, 1, 1);
+    resizable(t);
   }
 };
 
-//UnitTest lines(kTestComplexShapes, "Complex Shapes", ComplexShapesTest::create);
+void convex_shape(int w, int h) {
+  fl_vertex(-w/2, -h);
+  fl_vertex(w/2, -h);
+  fl_vertex(w, 0);
+  fl_vertex(w, h);
+  fl_vertex(0, h);
+  fl_vertex(-w, h/2);
+  fl_vertex(-w, -h/2);
+}
+
+void complex_shape(int w, int h) {
+  fl_vertex(-w/2, -h);
+  fl_vertex(0, -h/2);
+  fl_vertex(w/2, -h);
+  fl_vertex(w, 0);
+  fl_vertex(w, h);
+  fl_vertex(0, h);
+  fl_vertex(-w, h/2);
+  fl_vertex(-w/2, 0);
+  fl_vertex(-w, -h/2);
+}
+
+void two_complex_shapes(int w, int h) {
+  fl_vertex(-w/2, -h);
+  fl_vertex(w/2, -h);
+  fl_vertex(w, 0);
+  fl_vertex(w, h-3);
+  fl_gap();
+  fl_vertex(w-3, h);
+  fl_vertex(0, h);
+  fl_vertex(-w, h/2);
+  fl_vertex(-w, -h/2);
+}
+
+void complex_shape_with_hole(int w, int h) {
+  int w2 = w/3, h2 = h/3;
+  // clockwise
+  fl_vertex(-w/2, -h);
+  fl_vertex(w/2, -h);
+  fl_vertex(w, 0);
+  fl_vertex(w, h);
+  fl_vertex(0, h);
+  fl_vertex(-w, h/2);
+  fl_vertex(-w, -h/2);
+  fl_gap();
+  // counterclockwise
+  fl_vertex(-w2, -h2);
+  fl_vertex(-w2,  h2);
+  fl_vertex( w2,  h2);
+  fl_vertex( w2, -h2);
+}
+
+void draw_complex(ComplexShapesTest *p) {
+  int a = 0, b = 0, dx = 20, dy = 20, w = 10, h = 10;
+  int w2 = w/3, h2 = h/3;
+  // ---- 1: draw a random shape
+  fl_color(FL_BLACK);
+  // -- points
+  fl_push_matrix();
+  fl_translate(a+dx, b+dy);
+  p->set_transformation();
+  fl_begin_points();
+  convex_shape(w, h);
+  fl_end_points();
+  fl_pop_matrix();
+  // -- lines
+  fl_push_matrix();
+  fl_translate(a+dx+50, b+dy);
+  p->set_transformation();
+  fl_begin_line();
+  convex_shape(w, h);
+  fl_end_line();
+  fl_pop_matrix();
+  // -- line loop
+  fl_push_matrix();
+  fl_translate(a+dx+100, b+dy);
+  p->set_transformation();
+  fl_begin_loop();
+  convex_shape(w, h);
+  fl_end_loop();
+  fl_pop_matrix();
+  // -- polygon
+  fl_push_matrix();
+  fl_translate(a+dx+150, b+dy);
+  p->set_transformation();
+  fl_begin_polygon();
+  convex_shape(w, h);
+  fl_end_polygon();
+  fl_pop_matrix();
+
+  // ---- 2: draw a complex shape
+  b += 44;
+  // -- covex polygon drawn in complex mode
+  fl_push_matrix();
+  fl_translate(a+dx, b+dy);
+  p->set_transformation();
+  fl_color(FL_DARK2);
+  fl_begin_complex_polygon();
+  convex_shape(w, h);
+  fl_end_complex_polygon();
+  fl_color(FL_BLUE);
+  fl_begin_loop();
+  convex_shape(w, h);
+  fl_end_loop();
+  fl_pop_matrix();
+  // -- non-convex polygon drawn in complex mode
+  fl_push_matrix();
+  fl_translate(a+dx+50, b+dy);
+  p->set_transformation();
+  fl_color(FL_DARK2);
+  fl_begin_complex_polygon();
+  complex_shape(w, h);
+  fl_end_complex_polygon();
+  fl_color(FL_BLUE);
+  fl_begin_loop();
+  complex_shape(w, h);
+  fl_end_loop();
+  fl_pop_matrix();
+  // -- two part polygon with gap
+  fl_push_matrix();
+  fl_translate(a+dx+100, b+dy);
+  p->set_transformation();
+  fl_color(FL_DARK2);
+  fl_begin_complex_polygon();
+  two_complex_shapes(w, h);
+  fl_end_complex_polygon();
+  fl_color(FL_BLUE);
+  fl_begin_loop();
+  fl_vertex(-w/2, -h);
+  fl_vertex(w/2, -h);
+  fl_vertex(w, 0);
+  fl_vertex(w, h-3);
+  fl_end_loop();
+  fl_begin_loop();
+  fl_vertex(w-3, h);
+  fl_vertex(0, h);
+  fl_vertex(-w, h/2);
+  fl_vertex(-w, -h/2);
+  fl_end_loop();
+  fl_pop_matrix();
+  // -- polygon with a hole
+  fl_push_matrix();
+  fl_translate(a+dx+150, b+dy);
+  p->set_transformation();
+  fl_color(FL_DARK2);
+  fl_begin_complex_polygon();
+  complex_shape_with_hole(w, h);
+  fl_end_complex_polygon();
+  fl_color(FL_BLUE);
+  fl_begin_loop();
+  fl_vertex(-w/2, -h);
+  fl_vertex(w/2, -h);
+  fl_vertex(w, 0);
+  fl_vertex(w, h);
+  fl_vertex(0, h);
+  fl_vertex(-w, h/2);
+  fl_vertex(-w, -h/2);
+  fl_end_loop();
+  fl_begin_loop();
+  fl_vertex(-w2, -h2);
+  fl_vertex(-w2,  h2);
+  fl_vertex( w2,  h2);
+  fl_vertex( w2, -h2);
+  fl_end_loop();
+  fl_pop_matrix();
+
+  // ---- 3: draw polygons with arcs
+  b += 44;
+  // -- a rectangle with a camel hump
+  fl_push_matrix();
+  fl_translate(a+dx, b+dy);
+  p->set_transformation();
+  fl_color(FL_DARK2);
+  fl_begin_complex_polygon();
+  fl_vertex(-w, 0); fl_arc(0, 0, w-3, 180.0, 0.0); fl_vertex(w, 0);
+  fl_vertex(w, h); fl_vertex(-w, h);
+  fl_end_complex_polygon();
+  fl_color(FL_BLUE);
+  fl_begin_loop();
+  fl_vertex(-w, 0); fl_arc(0, 0, w-3, 180.0, 0.0); fl_vertex(w, 0);
+  fl_vertex(w, h); fl_vertex(-w, h);
+  fl_end_loop();
+  fl_pop_matrix();
+  // -- a rectangle with a camel dip
+  fl_push_matrix();
+  fl_translate(a+dx+50, b+dy);
+  p->set_transformation();
+  fl_color(FL_DARK2);
+  fl_begin_complex_polygon();
+  fl_vertex(-w, 0); fl_arc(0, 0, w-3, 180.0, 360.0); fl_vertex(w, 0);
+  fl_vertex(w, h); fl_vertex(-w, h);
+  fl_end_complex_polygon();
+  fl_color(FL_BLUE);
+  fl_begin_loop();
+  fl_vertex(-w, 0); fl_arc(0, 0, w-3, 180.0, 360.0); fl_vertex(w, 0);
+  fl_vertex(w, h); fl_vertex(-w, h);
+  fl_end_loop();
+  fl_pop_matrix();
+  // -- a rectangle with a bezier curve top
+  fl_push_matrix();
+  fl_translate(a+dx+100, b+dy);
+  p->set_transformation();
+  fl_color(FL_DARK2);
+  fl_begin_complex_polygon();
+  fl_vertex(-w, 0);
+  fl_curve(-w+3, 0, -w+3, -h, w-3, h, w-3, 0);
+  fl_vertex(w, 0);
+  fl_vertex(w, h); fl_vertex(-w, h);
+  fl_end_complex_polygon();
+  fl_color(FL_BLUE);
+  fl_begin_loop();
+  fl_vertex(-w, 0);
+  fl_curve(-w+3, 0, 0, -h, 0, h, w-3, 0);
+  fl_vertex(w, 0);
+  fl_vertex(w, h); fl_vertex(-w, h);
+  fl_end_loop();
+  fl_pop_matrix();
+
+
+  // Test fl_begin_points(), fl_end_points()
+  // Test fl_begin_line() fl_end_line()
+  // Test fl_begin_loop() fl_end_loop()
+  // Test fl_begin_polygon() fl_end_polygon()
+  // Test fl_begin_complex_polygon() fl_gap() fl_arc() void fl_end_complex_polygon()
+  // Test fl_curve()
+  // Test translate, rotate, scale, push, pop
+}
+
+UnitTest complex_shapes(kTestComplexShapes, "Complex Shapes", ComplexShapesTest::create);
diff --git test/unittest_fast_shapes.cxx test/unittest_fast_shapes.cxx
index b49deb2..7dcb05a 100644
--- test/unittest_fast_shapes.cxx
+++ test/unittest_fast_shapes.cxx
@@ -297,7 +297,7 @@ public:
                "This draws 2 lines at differnet widths, and one connected line.\n\n"
                // Things to look out for:
                "Green and red pixels mark the beginning and end of single lines."
-               "The line caps should be flat, the joints shoould be of type \"miter\"."
+               "The line caps should be flat, the joints should be of type \"miter\"."
                );
 
 #if HAVE_GL
@@ -371,7 +371,7 @@ public:
                "This draws 2 lines at differnet widths, and one connected line.\n\n"
                // Things to look out for:
                "Green and red pixels mark the beginning and end of single lines."
-               "The line caps should be flat, the joints shoould be of type \"miter\"."
+               "The line caps should be flat, the joints should be of type \"miter\"."
                );
 #endif
 
diff --git test/unittests.cxx test/unittests.cxx
index a4e231f..c7f36fc 100644
--- test/unittests.cxx
+++ test/unittests.cxx
@@ -140,6 +140,7 @@ int main(int argc, char **argv) {
   Fl::visual(FL_RGB);
   Fl::use_high_res_GL(1);
   mainwin = new MainWindow(MAINWIN_W, MAINWIN_H, "FLTK Unit Tests");
+  mainwin->size_range(MAINWIN_W, MAINWIN_H);
   browser = new Fl_Hold_Browser(BROWSER_X, BROWSER_Y, BROWSER_W, BROWSER_H, "Unit Tests");
   browser->align(FL_ALIGN_TOP|FL_ALIGN_LEFT);
   browser->when(FL_WHEN_CHANGED);
diff --git test/unittests.h test/unittests.h
index 3b9cddd..78b095c 100644
--- test/unittests.h
+++ test/unittests.h
@@ -42,7 +42,7 @@ enum {
   kTestPoints,
   kTestFastShapes,
   kTestCircles,
-//  kTestComplexShapes,
+  kTestComplexShapes,
   kTestText,
   kTestSymbol,
   kTestImages,
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.