Browse Source

Cleanup cairo image handling.. Convert JPEG from RGB to ARGB.

tags/v1.3.1000
Jonathan Moore Liles 13 years ago
parent
commit
9235d2a908
4 changed files with 39 additions and 19 deletions
  1. +10
    -6
      src/Fl_Cairo_Graphics_Driver.cxx
  2. +22
    -8
      src/Fl_JPEG_Image.cxx
  3. +2
    -4
      src/Fl_x.cxx
  4. +5
    -1
      src/fl_boxtype.cxx

+ 10
- 6
src/Fl_Cairo_Graphics_Driver.cxx View File

@@ -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,
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);

cx += X-XP; cy += Y-YP;
// clip the box down to the size of image, quit if empty:
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+H > h) H = h-cy;
if (H <= 0) return 1;

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:
fmt = CAIRO_FORMAT_RGB24;
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() ); */

@@ -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_set_source_surface( cr, image, X - cx, Y - cy );

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_restore( cr );
/* cairo_restore( cr ); */
}




+ 22
- 8
src/Fl_JPEG_Image.cxx View File

@@ -41,7 +41,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <stdint.h>

// Some releases of the Cygwin JPEG libraries don't have a correctly
// 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
jpeg_decompress_struct dinfo; // Decompressor 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
// 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);
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;
jpeg_start_decompress(&dinfo);
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_destroy_decompress(&dinfo);


+ 2
- 4
src/Fl_x.cxx View File

@@ -2010,12 +2010,10 @@ void Fl_Window::show() {
if (Fl::scheme_bg_) {
// labeltype(FL_NORMAL_LABEL);
align(FL_ALIGN_IMAGE_BACKDROP);
} else {
labeltype(FL_NO_LABEL);
}

labeltype(FL_NO_LABEL);
Fl_Tooltip::exit(this);
if (!shown()) {
fl_open_display();


+ 5
- 1
src/fl_boxtype.cxx View File

@@ -428,7 +428,11 @@ void Fl_Widget::draw_backdrop() const {
img = deimage();
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);
}
}
}


Loading…
Cancel
Save