summaryrefslogtreecommitdiff
path: root/test/unittest_images.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'test/unittest_images.cxx')
-rw-r--r--test/unittest_images.cxx238
1 files changed, 168 insertions, 70 deletions
diff --git a/test/unittest_images.cxx b/test/unittest_images.cxx
index 43e21b6f1..80ded9c47 100644
--- a/test/unittest_images.cxx
+++ b/test/unittest_images.cxx
@@ -16,7 +16,10 @@
// http://www.fltk.org/str.php
//
-#include <FL/Fl_Box.H>
+#include <FL/Fl_Group.H>
+#include <FL/Fl_Button.H>
+#include <FL/Fl_Radio_Button.H>
+#include <FL/Fl_Check_Button.H>
#include <FL/fl_draw.H>
// Note: currently (March 2010) fl_draw_image() supports transparency with
@@ -30,22 +33,22 @@
// Parameters for fine tuning for developers.
// Default values: CB=1, DX=0, IMG=1, LX=0, FLIPH=0
-#define CB (1) // 1 to show the checker board background for alpha images,
- // 0 otherwise
-#define DX (0) // additional (undefined (0)) pixels per line, must be >= 0
- // ignored (irrelevant), if LX == 0 (see below)
-#define IMG (1) // 1 to use Fl_RGB_Image for drawing images with transparency,
- // 0 to use fl_draw_image() instead.
- // Note: as of Feb 2016, only 1 (Fl_RGB_Image) works with
- // alpha channel, 0 (fl_draw_image()) ignores the alpha
- // channel (FLTK 1.3.x).
- // There are plans to support transparency (alpha channel)
- // in fl_draw_image() in FLTK 1.4.0 and/or later.
-#define LX (0) // 0 for default: ld() = 0, i.e. ld() defaults (internally) to w()*d()
- // +1: ld() = (w() + DX) * d()
- // -1 to flip image vertically: ld() = - ((w() + DX) * d())
-#define FLIPH (0) // 1 = Flip image horizontally (only if IMG == 0)
- // 0 = Draw image normal, w/o horizontal flipping
+static int CB = 1; // 1 to show the checker board background for alpha images,
+ // 0 otherwise
+static int DX = 0; // additional (undefined (0)) pixels per line, must be >= 0
+ // ignored (irrelevant), if LX == 0 (see below)
+static int IMG = 1; // 1 to use Fl_RGB_Image for drawing images with transparency,
+ // 0 to use fl_draw_image() instead.
+ // Note: as of Feb 2016, only 1 (Fl_RGB_Image) works with
+ // alpha channel, 0 (fl_draw_image()) ignores the alpha
+ // channel (FLTK 1.3.x).
+ // There are plans to support transparency (alpha channel)
+ // in fl_draw_image() in FLTK 1.4.0 and/or later.
+static int LX = 0; // 0 for default: ld() = 0, i.e. ld() defaults (internally) to w()*d()
+ // +1: ld() = (w() + DX) * d()
+ // -1 to flip image vertically: ld() = - ((w() + DX) * d())
+static int FLIPH = 0; // 1 = Flip image horizontally (only if IMG == 0)
+ // 0 = Draw image normal, w/o horizontal flipping
// ----------------------------------------------------------------------
// Test scenario for fl_draw_image() with pos. and neg. d and ld args:
@@ -57,16 +60,14 @@
// (5) set FLIPH = 0, IMG = 1: back to default (with transparency)
// ----------------------------------------------------------------------
-
-class ImageTest : public Fl_Box {
-public:
- static Fl_Widget *create() {
+class ImageTest : public Fl_Group {
+ static void build_imgs() {
int x, y;
uchar *dg, *dga, *drgb, *drgba;
- dg = img_gray = (uchar*)malloc((128+DX)*128*1);
- dga = img_gray_a = (uchar*)malloc((128+DX)*128*2);
- drgb = img_rgb = (uchar*)malloc((128+DX)*128*3);
- drgba = img_rgba = (uchar*)malloc((128+DX)*128*4);
+ dg = img_gray = img_gray_base = (uchar*)malloc((128+DX)*128*1);
+ dga = img_gray_a = img_gray_a_base = (uchar*)malloc((128+DX)*128*2);
+ drgb = img_rgb = img_rgb_base = (uchar*)malloc((128+DX)*128*3);
+ drgba = img_rgba = img_rgba_base = (uchar*)malloc((128+DX)*128*4);
for (y=0; y<128; y++) {
for (x=0; x<128; x++) {
*drgba++ = *drgb++ = *dga++ = *dg++ = y<<1;
@@ -97,8 +98,45 @@ public:
i_ga = new Fl_RGB_Image (img_gray_a,128,128,2,LX*(128+DX)*2);
i_rgb = new Fl_RGB_Image (img_rgb, 128,128,3,LX*(128+DX)*3);
i_rgba = new Fl_RGB_Image (img_rgba, 128,128,4,LX*(128+DX)*4);
- return new ImageTest(TESTAREA_X, TESTAREA_Y, TESTAREA_W, TESTAREA_H);
+ } // build_imgs method ends
+
+ void free_images() {
+ if (i_rgba) { delete i_rgba; i_rgba = 0; }
+ if (i_rgb) { delete i_rgb; i_rgb = 0; }
+ if (i_ga) { delete i_ga; i_ga = 0; }
+ if (i_g) { delete i_g; i_g = 0; }
+ if (img_rgba_base) { free (img_rgba_base); img_rgba_base = 0; }
+ if (img_rgb_base) { free (img_rgb_base); img_rgb_base = 0; }
+ if (img_gray_a_base) { free (img_gray_a_base); img_gray_a_base = 0; }
+ if (img_gray_base) { free (img_gray_base); img_gray_base = 0; }
+ } // end of free_images method
+
+ static void refresh_imgs_CB(Fl_Widget*,void *data) {
+ ImageTest *it = (ImageTest*)data;
+ it->free_images(); // release the previous images
+ // determine the state for the next images
+ CB = it->ck_CB->value();
+ IMG = it->ck_IMG->value();
+ FLIPH = it->ck_FLIPH->value();
+ // read the LX state radio buttons
+ if (it->rb_LXp1->value()) { LX = 1; }
+ else if (it->rb_LXm1->value()) { LX = (-1); }
+ else { LX = 0; }
+ // construct the next images
+ build_imgs();
+ it->redraw();
}
+
+public:
+ static Fl_Widget *create() {
+ build_imgs();
+ return new ImageTest(TESTAREA_X, TESTAREA_Y, TESTAREA_W, TESTAREA_H);
+ } // create method ends
+
+ static uchar *img_gray_base;
+ static uchar *img_gray_a_base;
+ static uchar *img_rgb_base;
+ static uchar *img_rgba_base;
static uchar *img_gray;
static uchar *img_gray_a;
static uchar *img_rgb;
@@ -107,29 +145,76 @@ public:
static Fl_RGB_Image *i_ga;
static Fl_RGB_Image *i_rgb;
static Fl_RGB_Image *i_rgba;
- ImageTest(int x, int y, int w, int h) : Fl_Box(x, y, w, h) {
+
+ // control widgets
+ Fl_Group *ctr_grp;
+ Fl_Check_Button *ck_CB;
+ Fl_Check_Button *ck_IMG;
+ Fl_Check_Button *ck_FLIPH;
+ Fl_Radio_Button *rb_LXm1;
+ Fl_Radio_Button *rb_LX0;
+ Fl_Radio_Button *rb_LXp1;
+ Fl_Button *refresh;
+
+ ImageTest(int x, int y, int w, int h) : Fl_Group(x, y, w, h) {
label("Testing Image Drawing\n\n"
"This test renders four images, two of them with a checker board\n"
"visible through the graphics. Color and gray gradients should be\n"
"visible. This does not test any image formats such as JPEG.");
align(FL_ALIGN_INSIDE|FL_ALIGN_BOTTOM|FL_ALIGN_LEFT|FL_ALIGN_WRAP);
box(FL_BORDER_BOX);
- }
+ int cw = 90;
+ int ch = 270;
+ int cx = x + w - cw - 5;
+ int cy = y + 10;
+ ctr_grp = new Fl_Group(cx, cy, cw, ch);
+
+ ck_CB = new Fl_Check_Button(cx+10, cy+10, cw-20, 30, "CB");
+ ck_CB->value(CB);
+
+ ck_IMG = new Fl_Check_Button(cx+10, cy+40, cw-20, 30, "IMG");
+ ck_IMG->value(IMG);
+
+ ck_FLIPH = new Fl_Check_Button(cx+10, cy+70, cw-20, 30, "FLIPH");
+ ck_FLIPH->value(FLIPH);
+
+ Fl_Group *rd_grp = new Fl_Group(cx+10, cy+100, cw-20, 90, "LX");
+
+ rb_LXp1 = new Fl_Radio_Button(cx+15, cy+105, cw-30, 20, "+1");
+ rb_LX0 = new Fl_Radio_Button(cx+15, cy+125, cw-30, 20, "0");
+ rb_LXm1 = new Fl_Radio_Button(cx+15, cy+145, cw-30, 20, "-1");
+ rb_LX0->value(1);
+
+ rd_grp->box(FL_BORDER_BOX);
+ rd_grp->align(FL_ALIGN_INSIDE|FL_ALIGN_BOTTOM|FL_ALIGN_CENTER);
+ rd_grp->end();
+
+ refresh = new Fl_Button(cx+10, cy+ch-40, cw-20, 30, "Refresh");
+ refresh->callback(refresh_imgs_CB, (void*)this);
+
+ ctr_grp->box(FL_BORDER_BOX);
+ ctr_grp->end();
+ end(); // make sure this ImageTest group is closed
+ } // constructor ends
+
void draw() {
- Fl_Box::draw();
+ Fl_Group::draw();
// top left: RGB
int xx = x()+10, yy = y()+10;
fl_color(FL_BLACK); fl_rect(xx, yy, 130, 130);
-#if IMG
- i_rgb->draw(xx+1,yy+1);
-#else
- if (!FLIPH)
- fl_draw_image(img_rgb, xx+1, yy+1, 128, 128, 3, LX*((128+DX)*3));
- else
- fl_draw_image(img_rgb, xx+1, yy+1, 128, 128,-3, LX*((128+DX)*3));
-#endif
+ if (IMG) {
+ i_rgb->draw(xx+1,yy+1);
+ }
+ else {
+ if (!FLIPH) {
+ fl_draw_image(img_rgb, xx+1, yy+1, 128, 128, 3, LX*((128+DX)*3));
+ }
+ else {
+ fl_draw_image(img_rgb, xx+1, yy+1, 128, 128,-3, LX*((128+DX)*3));
+ }
+ }
fl_draw("RGB", xx+134, yy+64);
// bottom left: RGBA
@@ -137,32 +222,38 @@ public:
xx = x()+10; yy = y()+10+134;
fl_color(FL_BLACK); fl_rect(xx, yy, 130, 130); // black frame
fl_color(FL_WHITE); fl_rectf(xx+1, yy+1, 128, 128); // white background
-#if CB // checker board
- fl_color(FL_BLACK); fl_rectf(xx+65, yy+1, 64, 64);
- fl_color(FL_BLACK); fl_rectf(xx+1, yy+65, 64, 64);
-#endif
-#if IMG
- i_rgba->draw(xx+1,yy+1);
-#else
- if (!FLIPH)
- fl_draw_image(img_rgba, xx+1, yy+1, 128, 128, 4, LX*((128+DX)*4));
- else
- fl_draw_image(img_rgba, xx+1, yy+1, 128, 128,-4, LX*((128+DX)*4));
-#endif
+ if (CB) { // checker board
+ fl_color(FL_BLACK); fl_rectf(xx+65, yy+1, 64, 64);
+ fl_color(FL_BLACK); fl_rectf(xx+1, yy+65, 64, 64);
+ }
+ if (IMG) {
+ i_rgba->draw(xx+1,yy+1);
+ }
+ else {
+ if (!FLIPH) {
+ fl_draw_image(img_rgba, xx+1, yy+1, 128, 128, 4, LX*((128+DX)*4));
+ }
+ else {
+ fl_draw_image(img_rgba, xx+1, yy+1, 128, 128,-4, LX*((128+DX)*4));
+ }
+ }
fl_color(FL_BLACK); fl_draw("RGBA", xx+134, yy+64);
// top right: Gray
xx = x()+10+200; yy = y()+10;
fl_color(FL_BLACK); fl_rect(xx, yy, 130, 130);
-#if IMG
- i_g->draw(xx+1,yy+1);
-#else
- if (!FLIPH)
- fl_draw_image(img_gray, xx+1, yy+1, 128, 128, 1, LX*((128+DX)*1));
- else
- fl_draw_image(img_gray, xx+1, yy+1, 128, 128,-1, LX*((128+DX)*1));
-#endif
+ if (IMG) {
+ i_g->draw(xx+1,yy+1);
+ }
+ else {
+ if (!FLIPH) {
+ fl_draw_image(img_gray, xx+1, yy+1, 128, 128, 1, LX*((128+DX)*1));
+ }
+ else {
+ fl_draw_image(img_gray, xx+1, yy+1, 128, 128,-1, LX*((128+DX)*1));
+ }
+ }
fl_draw("Gray", xx+134, yy+64);
// bottom right: Gray+Alpha
@@ -170,22 +261,29 @@ public:
xx = x()+10+200; yy = y()+10+134;
fl_color(FL_BLACK); fl_rect(xx, yy, 130, 130); // black frame
fl_color(FL_WHITE); fl_rectf(xx+1, yy+1, 128, 128); // white background
-#if CB // checker board
- fl_color(FL_BLACK); fl_rectf(xx+65, yy+1, 64, 64);
- fl_color(FL_BLACK); fl_rectf(xx+1, yy+65, 64, 64);
-#endif
-#if IMG
- i_ga->draw(xx+1,yy+1);
-#else
- if (!FLIPH)
- fl_draw_image(img_gray_a, xx+1, yy+1, 128, 128, 2, LX*((128+DX)*2));
- else
- fl_draw_image(img_gray_a, xx+1, yy+1, 128, 128,-2, LX*((128+DX)*2));
-#endif
+ if (CB) { // checker board
+ fl_color(FL_BLACK); fl_rectf(xx+65, yy+1, 64, 64);
+ fl_color(FL_BLACK); fl_rectf(xx+1, yy+65, 64, 64);
+ }
+ if (IMG) {
+ i_ga->draw(xx+1,yy+1);
+ }
+ else {
+ if (!FLIPH) {
+ fl_draw_image(img_gray_a, xx+1, yy+1, 128, 128, 2, LX*((128+DX)*2));
+ }
+ else {
+ fl_draw_image(img_gray_a, xx+1, yy+1, 128, 128,-2, LX*((128+DX)*2));
+ }
+ }
fl_color(FL_BLACK); fl_draw("Gray+Alpha", xx+134, yy+64);
- }
+ } // draw method end
};
+uchar *ImageTest::img_gray_base = 0;
+uchar *ImageTest::img_gray_a_base = 0;
+uchar *ImageTest::img_rgb_base = 0;
+uchar *ImageTest::img_rgba_base = 0;
uchar *ImageTest::img_gray = 0;
uchar *ImageTest::img_gray_a = 0;
uchar *ImageTest::img_rgb = 0;