summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-11-19 15:26:47 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-11-19 15:26:47 +0100
commit619677b75c19173e26adf88f02870b5721f82736 (patch)
tree50198885b49b4e5dcba2fa856a26d3a7ff2f7e38 /src
parent180b4bad2e23279ad9790518fc8e09253eb29275 (diff)
Fix fl_draw_image sometimes crashes when window is scaled (#1134)
Diffstat (limited to 'src')
-rw-r--r--src/fl_draw.cxx45
1 files changed, 45 insertions, 0 deletions
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);
+}
+