Fixed Fl_Paged_Device::print_window() that did not work under Windows seven.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8595 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2011-04-17 08:48:40 +00:00
parent 8212e4bfe7
commit ddc4b21b55
2 changed files with 17 additions and 19 deletions

View File

@ -1976,12 +1976,15 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
win->show();
Fl::check();
win->make_current();
HDC save_gc = fl_gc;
fl_gc = GetDC(NULL); // get the screen device context
// capture the 4 window sides from screen
// use negative 4th argument to allow negative 2nd or 3rd arguments
uchar *top_image = fl_read_image(NULL, -bx, - bt - by, -ww, bt + by);
uchar *left_image = fl_read_image(NULL, -bx, - bt - by, -bx, wh);
uchar *right_image = fl_read_image(NULL, win->w(), - bt - by, -bx, wh);
uchar *bottom_image = fl_read_image(NULL, -bx, win->h(), -ww, by);
RECT r; GetWindowRect(fl_window, &r);
uchar *top_image = fl_read_image(NULL, r.left, r.top, ww, bt + by);
uchar *left_image = fl_read_image(NULL, r.left, r.top, bx, wh);
uchar *right_image = fl_read_image(NULL, r.right - bx, r.top, bx, wh);
uchar *bottom_image = fl_read_image(NULL, r.left, r.bottom-by, ww, by);
ReleaseDC(NULL, fl_gc); fl_gc = save_gc;
this->set_current();
// print the 4 window sides
fl_draw_image(top_image, x_offset, y_offset, ww, bt + by, 3);

View File

@ -34,13 +34,10 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
int X, // I - Left position
int Y, // I - Top position
int w, // I - Width of area to read
// negative w means negative X or Y are allowed
int h, // I - Height of area to read
int alpha) { // I - Alpha value for image (0 for none)
int d; // Depth of image
int allow_outside = w < 0; // negative w allows negative X or Y, that is, window border
if (w < 0) w = - w;
// Allocate the image data array as needed...
d = alpha ? 4 : 3;
@ -61,17 +58,15 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
int shift_x = 0; // X target shift if X modified
int shift_y = 0; // Y target shift if X modified
if (!allow_outside) {
if (X < 0) {
shift_x = -X;
w += X;
X = 0;
}
if (Y < 0) {
shift_y = -Y;
h += Y;
Y = 0;
}
if (X < 0) {
shift_x = -X;
w += X;
X = 0;
}
if (Y < 0) {
shift_y = -Y;
h += Y;
Y = 0;
}
if (h < 1 || w < 1) return p; // nothing to copy