| @@ -862,8 +862,8 @@ void Fl_Cairo_Graphics_Driver::yxline ( int x, int y, int y1, int x2, int y3 ) | |||||
| static int start(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int w, int h, int &cx, int &cy, | static int start(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int w, int h, int &cx, int &cy, | ||||
| int &X, int &Y, int &W, int &H) | int &X, int &Y, int &W, int &H) | ||||
| { | { | ||||
| // account for current clip region (faster on Irix): | |||||
| fl_clip_box(XP,YP,WP,HP,X,Y,W,H); | fl_clip_box(XP,YP,WP,HP,X,Y,W,H); | ||||
| cx += X-XP; cy += Y-YP; | cx += X-XP; cy += Y-YP; | ||||
| // clip the box down to the size of image, quit if empty: | // clip the box down to the size of image, quit if empty: | ||||
| if (cx < 0) {W += cx; X -= cx; cx = 0;} | if (cx < 0) {W += cx; X -= cx; cx = 0;} | ||||
| @@ -872,6 +872,7 @@ static int start(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int w, int h | |||||
| if (cy < 0) {H += cy; Y -= cy; cy = 0;} | if (cy < 0) {H += cy; Y -= cy; cy = 0;} | ||||
| if (cy+H > h) H = h-cy; | if (cy+H > h) H = h-cy; | ||||
| if (H <= 0) return 1; | if (H <= 0) return 1; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -911,13 +912,17 @@ Fl_Cairo_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP | |||||
| case 3: | case 3: | ||||
| fmt = CAIRO_FORMAT_RGB24; | fmt = CAIRO_FORMAT_RGB24; | ||||
| break; | break; | ||||
| case 1: | |||||
| fmt = CAIRO_FORMAT_A8; | |||||
| break; | |||||
| } | } | ||||
| cairo_save( cr ); | |||||
| /* cairo_save( cr ); */ | |||||
| cairo_reset_clip( cr ); | |||||
| /* cairo_reset_clip( cr ); */ | |||||
| cairo_surface_t *image = cairo_image_surface_create_for_data( (unsigned char *)img->array, fmt, img->w(), img->h( ), cairo_format_stride_for_width( fmt, img->w() ) ); | |||||
| cairo_surface_t *image = cairo_image_surface_create_for_data( (unsigned char *)img->array, fmt, img->w(), img->h( ), | |||||
| cairo_format_stride_for_width( fmt, img->w() ) ); | |||||
| /* cairo_surface_t *image = cairo_image_surface_create_for_data( (unsigned char *)img->array, fmt, img->w(), img->h(), img->ld() ); */ | /* cairo_surface_t *image = cairo_image_surface_create_for_data( (unsigned char *)img->array, fmt, img->w(), img->h(), img->ld() ); */ | ||||
| @@ -928,7 +933,6 @@ Fl_Cairo_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP | |||||
| /* cairo_matrix_scale( &matr, */ | /* cairo_matrix_scale( &matr, */ | ||||
| cairo_set_source_surface( cr, image, X - cx, Y - cy ); | cairo_set_source_surface( cr, image, X - cx, Y - cy ); | ||||
| cairo_rectangle( cr, X, Y, W, H ); | cairo_rectangle( cr, X, Y, W, H ); | ||||
| @@ -937,7 +941,7 @@ Fl_Cairo_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP | |||||
| cairo_surface_destroy( image ); | cairo_surface_destroy( image ); | ||||
| cairo_restore( cr ); | |||||
| /* cairo_restore( cr ); */ | |||||
| } | } | ||||
| @@ -41,7 +41,7 @@ | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <setjmp.h> | #include <setjmp.h> | ||||
| #include <stdint.h> | |||||
| // Some releases of the Cygwin JPEG libraries don't have a correctly | // Some releases of the Cygwin JPEG libraries don't have a correctly | ||||
| // updated header file for the INT32 data type; the following define | // updated header file for the INT32 data type; the following define | ||||
| @@ -107,7 +107,8 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *filename) // I - File to load | |||||
| FILE *fp; // File pointer | FILE *fp; // File pointer | ||||
| jpeg_decompress_struct dinfo; // Decompressor info | jpeg_decompress_struct dinfo; // Decompressor info | ||||
| fl_jpeg_error_mgr jerr; // Error handler info | fl_jpeg_error_mgr jerr; // Error handler info | ||||
| JSAMPROW row; // Sample row pointer | |||||
| // JSAMPROW row; // Sample row pointer | |||||
| uint32_t *row; | |||||
| // the following variables are pointers allocating some private space that | // the following variables are pointers allocating some private space that | ||||
| // is not reset by 'setjmp()' | // is not reset by 'setjmp()' | ||||
| @@ -175,18 +176,31 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *filename) // I - File to load | |||||
| h(dinfo.output_height); | h(dinfo.output_height); | ||||
| d(dinfo.output_components); | d(dinfo.output_components); | ||||
| array = new uchar[w() * h() * d()]; | |||||
| uchar *line = new uchar[ w() * d() ]; | |||||
| array = new uchar[w() * h() * ( d() + 1 )]; | |||||
| alloc_array = 1; | alloc_array = 1; | ||||
| jpeg_start_decompress(&dinfo); | jpeg_start_decompress(&dinfo); | ||||
| while (dinfo.output_scanline < dinfo.output_height) { | while (dinfo.output_scanline < dinfo.output_height) { | ||||
| row = (JSAMPROW)(array + | |||||
| dinfo.output_scanline * dinfo.output_width * | |||||
| dinfo.output_components); | |||||
| jpeg_read_scanlines(&dinfo, &row, (JDIMENSION)1); | |||||
| row = (uint32_t*) | |||||
| (array + dinfo.output_scanline * dinfo.output_width * ( dinfo.output_components + 1 )); | |||||
| jpeg_read_scanlines(&dinfo, &line, (JDIMENSION)1); | |||||
| for ( int i = 0, j = 0; i < w() * d(); i += 3, j++ ) | |||||
| { | |||||
| row[ j ] = ( line[ i ] << 16 ) | | |||||
| ( line[ i + 1 ] << 8 ) | | |||||
| ( line[ i + 2 ] ); | |||||
| } | |||||
| } | } | ||||
| d(4); | |||||
| delete[] line; | |||||
| jpeg_finish_decompress(&dinfo); | jpeg_finish_decompress(&dinfo); | ||||
| jpeg_destroy_decompress(&dinfo); | jpeg_destroy_decompress(&dinfo); | ||||
| @@ -2010,12 +2010,10 @@ void Fl_Window::show() { | |||||
| if (Fl::scheme_bg_) { | if (Fl::scheme_bg_) { | ||||
| // labeltype(FL_NORMAL_LABEL); | // labeltype(FL_NORMAL_LABEL); | ||||
| align(FL_ALIGN_IMAGE_BACKDROP); | align(FL_ALIGN_IMAGE_BACKDROP); | ||||
| } else { | |||||
| labeltype(FL_NO_LABEL); | |||||
| } | } | ||||
| labeltype(FL_NO_LABEL); | |||||
| Fl_Tooltip::exit(this); | Fl_Tooltip::exit(this); | ||||
| if (!shown()) { | if (!shown()) { | ||||
| fl_open_display(); | fl_open_display(); | ||||
| @@ -428,7 +428,11 @@ void Fl_Widget::draw_backdrop() const { | |||||
| img = deimage(); | img = deimage(); | ||||
| if (img) | if (img) | ||||
| { | { | ||||
| ((Fl_Image*)img)->draw(x_+(w_-img->w())/2, y_+(h_-img->h())/2); | |||||
| // ((Fl_Image*)img)->draw(x_+(w_-img->w())/2, y_+(h_-img->h())/2); | |||||
| if ( type() < FL_WINDOW ) | |||||
| ((Fl_Image*)img)->draw(x_+(w_-img->w())/2, y_+(h_-img->h())/2); | |||||
| else | |||||
| ((Fl_Image*)img)->draw(0+(w_-img->w())/2, 0+(h_-img->h())/2); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||