mirror of
https://github.com/fltk/fltk.git
synced 2026-06-01 23:06:54 +08:00
Fix fl_draw_image sometimes crashes when window is scaled (#1134)
This commit is contained in:
+2
-6
@@ -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
|
any visual of 8 bits or less, and all common TrueColor visuals up
|
||||||
to 32 bits.
|
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) {
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Draw a gray-scale (1 channel) image.
|
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)
|
\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) {
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Draw an image using a callback function to generate image data.
|
Draw an image using a callback function to generate image data.
|
||||||
|
|||||||
@@ -779,3 +779,48 @@ void fl_draw_radio(int x, int y, int d, Fl_Color color) {
|
|||||||
}
|
}
|
||||||
fl_color(current);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user