diff options
| -rw-r--r-- | FL/fl_draw.H | 8 | ||||
| -rw-r--r-- | src/fl_draw.cxx | 45 |
2 files changed, 47 insertions, 6 deletions
diff --git a/FL/fl_draw.H b/FL/fl_draw.H index 6535d031a..576e553d2 100644 --- a/FL/fl_draw.H +++ b/FL/fl_draw.H @@ -1078,17 +1078,13 @@ FL_EXPORT void fl_draw_radio(int x, int y, int d, Fl_Color color); any visual of 8 bits or less, and all common TrueColor visuals up to 32 bits. */ -inline void fl_draw_image(const uchar *buf, int X, int Y, int W, int H, int D = 3, int L = 0) { - fl_graphics_driver->draw_image(buf, X, Y, W, H, D, L); -} +void fl_draw_image(const uchar *buf, int X, int Y, int W, int H, int D = 3, int L = 0); /** Draw a gray-scale (1 channel) image. \see fl_draw_image(const uchar* buf, int X,int Y,int W,int H, int D, int L) */ -inline void fl_draw_image_mono(const uchar *buf, int X, int Y, int W, int H, int D = 1, int L = 0) { - fl_graphics_driver->draw_image_mono(buf, X, Y, W, H, D, L); -} +void fl_draw_image_mono(const uchar *buf, int X, int Y, int W, int H, int D = 1, int L = 0); /** Draw an image using a callback function to generate image data. diff --git a/src/fl_draw.cxx b/src/fl_draw.cxx index 72823b078..2f579fc57 100644 --- a/src/fl_draw.cxx +++ b/src/fl_draw.cxx @@ -779,3 +779,48 @@ void fl_draw_radio(int x, int y, int d, Fl_Color color) { } fl_color(current); } + + +typedef struct { + const uchar *buf; + int D_in; + int D_out; + int L; +} image_data; + + +static void scan_cb(image_data *data, int x, int y, int w, uchar *buffer) { + const uchar *from = data->buf + y * data->L + data->D_in * x; + while (w-- > 0) { + memcpy(buffer, from, data->D_out); + buffer += data->D_out; + from += data->D_in; + } +} + + +void fl_draw_image(const uchar *buf, int X, int Y, int W, int H, int D, int L) { + if (abs(D) > 3) { + image_data data; + data.buf = buf; + data.D_in = D; + data.D_out = 3; + data.L = (L ? L : W * D); + fl_graphics_driver->draw_image((Fl_Draw_Image_Cb)scan_cb, &data, X, Y, W, H, 3); + } else + fl_graphics_driver->draw_image(buf, X, Y, W, H, D, L); +} + + +void fl_draw_image_mono(const uchar *buf, int X, int Y, int W, int H, int D, int L) { + if (abs(D) > 1) { + image_data data; + data.buf = buf; + data.D_in = D; + data.D_out = 1; + data.L = (L ? L : W * D); + fl_graphics_driver->draw_image_mono((Fl_Draw_Image_Cb)scan_cb, &data, X, Y, W, H, 1); + } else + fl_graphics_driver->draw_image_mono(buf, X, Y, W, H, D, L); +} + |
