Add code for PNG and JPEG images.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1713 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Michael R Sweet
2001-11-23 12:06:36 +00:00
parent f525840495
commit 4087b8cd9a
6 changed files with 83 additions and 95 deletions
+3 -2
View File
@@ -1,5 +1,5 @@
// //
// "$Id: Fl_Image.H,v 1.5.2.3.2.4 2001/11/22 15:35:01 easysw Exp $" // "$Id: Fl_Image.H,v 1.5.2.3.2.5 2001/11/23 12:06:35 easysw Exp $"
// //
// Image header file for the Fast Light Tool Kit (FLTK). // Image header file for the Fast Light Tool Kit (FLTK).
// //
@@ -41,6 +41,7 @@ class FL_EXPORT Fl_Image {
void h(int H) {h_ = H;} void h(int H) {h_ = H;}
void d(int D) {d_ = D;} void d(int D) {d_ = D;}
void data(const char * const *p, int c) {data_ = p; count_ = c;} void data(const char * const *p, int c) {data_ = p; count_ = c;}
void draw_empty(int X, int Y);
public: public:
@@ -88,5 +89,5 @@ class FL_EXPORT Fl_RGB_Image : public Fl_Image {
#endif #endif
// //
// End of "$Id: Fl_Image.H,v 1.5.2.3.2.4 2001/11/22 15:35:01 easysw Exp $". // End of "$Id: Fl_Image.H,v 1.5.2.3.2.5 2001/11/23 12:06:35 easysw Exp $".
// //
+7 -2
View File
@@ -1,5 +1,5 @@
// //
// "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.4 2001/11/19 20:59:59 easysw Exp $" // "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.5 2001/11/23 12:06:36 easysw Exp $"
// //
// Bitmap drawing routines for the Fast Light Tool Kit (FLTK). // Bitmap drawing routines for the Fast Light Tool Kit (FLTK).
// //
@@ -161,6 +161,11 @@ void fl_delete_bitmask(Fl_Bitmask bm) {
#endif // WIN32 #endif // WIN32
void Fl_Bitmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) { void Fl_Bitmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
if (!array) {
draw_empty(XP, YP);
return;
}
// account for current clip region (faster on Irix): // account for current clip region (faster on Irix):
int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H); int 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;
@@ -273,5 +278,5 @@ Fl_Image *Fl_Bitmap::copy(int W, int H) {
} }
// //
// End of "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.4 2001/11/19 20:59:59 easysw Exp $". // End of "$Id: Fl_Bitmap.cxx,v 1.5.2.4.2.5 2001/11/23 12:06:36 easysw Exp $".
// //
+17 -2
View File
@@ -1,5 +1,5 @@
// //
// "$Id: Fl_Image.cxx,v 1.5.2.3.2.6 2001/11/22 15:35:01 easysw Exp $" // "$Id: Fl_Image.cxx,v 1.5.2.3.2.7 2001/11/23 12:06:36 easysw Exp $"
// //
// Image drawing code for the Fast Light Tool Kit (FLTK). // Image drawing code for the Fast Light Tool Kit (FLTK).
// //
@@ -37,6 +37,16 @@ Fl_Image::~Fl_Image() {
} }
void Fl_Image::draw(int XP, int YP, int WP, int HP, int cx, int cy) { void Fl_Image::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
draw_empty(XP, YP);
}
void Fl_Image::draw_empty(int X, int Y) {
if (w() > 0 && h() > 0) {
fl_color(FL_BLACK);
fl_rect(X, Y, w(), h());
fl_line(X, Y, X + w() - 1, Y + h() - 1);
fl_line(X, Y + h() - 1, X + w() - 1, Y);
}
} }
Fl_Image *Fl_Image::copy(int W, int H) { Fl_Image *Fl_Image::copy(int W, int H) {
@@ -222,6 +232,11 @@ void Fl_RGB_Image::desaturate() {
} }
void Fl_RGB_Image::draw(int XP, int YP, int WP, int HP, int cx, int cy) { void Fl_RGB_Image::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
if (!array) {
draw_empty(XP, YP);
return;
}
// account for current clip region (faster on Irix): // account for current clip region (faster on Irix):
int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H); int 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;
@@ -341,5 +356,5 @@ void Fl_RGB_Image::label(Fl_Menu_Item* m) {
// //
// End of "$Id: Fl_Image.cxx,v 1.5.2.3.2.6 2001/11/22 15:35:01 easysw Exp $". // End of "$Id: Fl_Image.cxx,v 1.5.2.3.2.7 2001/11/23 12:06:36 easysw Exp $".
// //
+18 -45
View File
@@ -1,5 +1,5 @@
// //
// "$Id: Fl_JPEG_Image.cxx,v 1.1.2.1 2001/11/19 01:06:45 easysw Exp $" // "$Id: Fl_JPEG_Image.cxx,v 1.1.2.2 2001/11/23 12:06:36 easysw Exp $"
// //
// Fl_JPEG_Image routines. // Fl_JPEG_Image routines.
// //
@@ -32,27 +32,9 @@
// //
#include <FL/Fl_JPEG_Image.H> #include <FL/Fl_JPEG_Image.H>
#include "config.h" #include <config.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h>
#include <string.h>
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif /* HAVE_STRINGS_H */
#include <errno.h>
#if defined(WIN32) && ! defined(__CYGWIN__)
# include <io.h>
# include <direct.h>
# define strcasecmp(s,t) stricmp((s), (t))
# define strncasecmp(s,t,n) strnicmp((s), (t), (n))
#elif defined(__EMX__)
# define strcasecmp(s,t) stricmp((s), (t))
# define strncasecmp(s,t,n) strnicmp((s), (t), (n))
#else
# include <unistd.h>
#endif // WIN32
extern "C" extern "C"
{ {
@@ -61,24 +43,22 @@ extern "C"
#endif // HAVE_LIBJPEG #endif // HAVE_LIBJPEG
} }
#define MAX_COLUMNS 200
//
// 'Fl_JPEG_Image::Fl_JPEG_Image()' - Load a JPEG image file.
//
#if 0 Fl_JPEG_Image::Fl_JPEG_Image(const char *jpeg) // I - File to load
: Fl_RGB_Image(0,0,0) {
#ifdef HAVE_LIBJPEG #ifdef HAVE_LIBJPEG
// FILE *fp; // File pointer
// 'Fl_Help_View::load_jpeg()' - Load a JPEG image file.
//
int // O - 0 = success, -1 = fail
Fl_Help_View::load_jpeg(Fl_Help_Image *img, // I - Image pointer
FILE *fp) // I - File to load from
{
struct jpeg_decompress_struct cinfo; // Decompressor info struct jpeg_decompress_struct cinfo; // Decompressor info
struct jpeg_error_mgr jerr; // Error handler info struct jpeg_error_mgr jerr; // Error handler info
JSAMPROW row; // Sample row pointer JSAMPROW row; // Sample row pointer
if ((fp = fopen(jpeg, "rb")) == NULL) return;
cinfo.err = jpeg_std_error(&jerr); cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo); jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, fp); jpeg_stdio_src(&cinfo, fp);
@@ -91,22 +71,17 @@ Fl_Help_View::load_jpeg(Fl_Help_Image *img, // I - Image pointer
jpeg_calc_output_dimensions(&cinfo); jpeg_calc_output_dimensions(&cinfo);
img->w = cinfo.output_width; w(cinfo.output_width);
img->h = cinfo.output_height; h(cinfo.output_height);
img->d = cinfo.output_components; d(cinfo.output_components);
img->data = (unsigned char *)malloc(img->w * img->h * img->d);
if (img->data == NULL) array = new uchar[w() * h() * d()];
{
jpeg_destroy_decompress(&cinfo);
return (0);
}
jpeg_start_decompress(&cinfo); jpeg_start_decompress(&cinfo);
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
row = (JSAMPROW)(img->data + row = (JSAMPROW)(array +
cinfo.output_scanline * cinfo.output_width * cinfo.output_scanline * cinfo.output_width *
cinfo.output_components); cinfo.output_components);
jpeg_read_scanlines(&cinfo, &row, (JDIMENSION)1); jpeg_read_scanlines(&cinfo, &row, (JDIMENSION)1);
@@ -115,12 +90,10 @@ Fl_Help_View::load_jpeg(Fl_Help_Image *img, // I - Image pointer
jpeg_finish_decompress(&cinfo); jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo); jpeg_destroy_decompress(&cinfo);
return (1); fclose(fp);
}
#endif // HAVE_LIBJPEG #endif // HAVE_LIBJPEG
}
#endif // 0
// //
// End of "$Id: Fl_JPEG_Image.cxx,v 1.1.2.1 2001/11/19 01:06:45 easysw Exp $". // End of "$Id: Fl_JPEG_Image.cxx,v 1.1.2.2 2001/11/23 12:06:36 easysw Exp $".
// //
+28 -40
View File
@@ -1,5 +1,5 @@
// //
// "$Id: Fl_PNG_Image.cxx,v 1.1.2.1 2001/11/19 01:06:45 easysw Exp $" // "$Id: Fl_PNG_Image.cxx,v 1.1.2.2 2001/11/23 12:06:36 easysw Exp $"
// //
// Fl_PNG_Image routines. // Fl_PNG_Image routines.
// //
@@ -32,15 +32,9 @@
// //
#include <FL/Fl_PNG_Image.H> #include <FL/Fl_PNG_Image.H>
#include "config.h" #include <config.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h>
#include <string.h>
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif /* HAVE_STRINGS_H */
#include <errno.h>
extern "C" extern "C"
{ {
@@ -51,23 +45,24 @@ extern "C"
} }
#if 0
#ifdef HAVE_LIBPNG
// //
// 'Fl_Help_View::load_png()' - Load a PNG image file. // 'Fl_PNG_Image::Fl_PNG_Image()' - Load a PNG image file.
// //
int // O - 0 = success, -1 = fail Fl_PNG_Image::Fl_PNG_Image(const char *png) // I - File to read
Fl_Help_View::load_png(Fl_Help_Image *img,// I - Image pointer : Fl_RGB_Image(0,0,0) {
FILE *fp) // I - File to read from #ifdef HAVE_LIBPNG
{
int i; // Looping var int i; // Looping var
FILE *fp; // File pointer
int channels; // Number of color channels
png_structp pp; // PNG read pointer png_structp pp; // PNG read pointer
png_infop info; // PNG info pointers png_infop info; // PNG info pointers
png_bytep *rows; // PNG row pointers png_bytep *rows; // PNG row pointers
png_color_16 bg; // Background color
// Open the PNG file...
if ((fp = fopen(png, "rb")) == NULL) return;
// Setup the PNG data structures... // Setup the PNG data structures...
pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info = png_create_info_struct(pp); info = png_create_info_struct(pp);
@@ -82,12 +77,16 @@ Fl_Help_View::load_png(Fl_Help_Image *img,// I - Image pointer
png_set_expand(pp); png_set_expand(pp);
if (info->color_type & PNG_COLOR_MASK_COLOR) if (info->color_type & PNG_COLOR_MASK_COLOR)
img->d = 3; channels = 3;
else else
img->d = 1; channels = 1;
if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans) if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans)
img->d ++; channels ++;
w(info->width);
h(info->height);
d(channels);
if (info->bit_depth < 8) if (info->bit_depth < 8)
{ {
@@ -103,31 +102,20 @@ Fl_Help_View::load_png(Fl_Help_Image *img,// I - Image pointer
png_set_tRNS_to_alpha(pp); png_set_tRNS_to_alpha(pp);
#endif // HAVE_PNG_GET_VALID && HAVE_SET_TRNS_TO_ALPHA #endif // HAVE_PNG_GET_VALID && HAVE_SET_TRNS_TO_ALPHA
img->w = (int)info->width; array = new uchar[w() * h() * d()];
img->h = (int)info->height;
img->data = (unsigned char *)malloc(img->w * img->h * img->d);
// Background color...
unsigned rgba = fltk_colors[bgcolor_];
bg.red = 65535 * (rgba >> 24) / 255;
bg.green = 65535 * ((rgba >> 16) & 255) / 255;
bg.blue = 65535 * ((rgba >> 8) & 255) / 255;
png_set_background(pp, &bg, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
// Allocate pointers... // Allocate pointers...
rows = (png_bytep *)calloc(info->height, sizeof(png_bytep)); rows = new png_bytep[h()];
for (i = 0; i < (int)info->height; i ++) for (i = 0; i < h(); i ++)
rows[i] = img->data + i * img->w * img->d; rows[i] = (png_bytep)(array + i * w() * d());
// Read the image, handling interlacing as needed... // Read the image, handling interlacing as needed...
for (i = png_set_interlace_handling(pp); i > 0; i --) for (i = png_set_interlace_handling(pp); i > 0; i --)
png_read_rows(pp, rows, NULL, img->h); png_read_rows(pp, rows, NULL, h());
// Free memory and return... // Free memory and return...
free(rows); delete rows;
png_read_end(pp, info); png_read_end(pp, info);
# ifdef HAVE_PNG_READ_DESTROY # ifdef HAVE_PNG_READ_DESTROY
@@ -136,11 +124,11 @@ Fl_Help_View::load_png(Fl_Help_Image *img,// I - Image pointer
png_destroy_read_struct(&pp, &info, NULL); png_destroy_read_struct(&pp, &info, NULL);
# endif // HAVE_PNG_READ_DESTROY # endif // HAVE_PNG_READ_DESTROY
return (1); fclose(fp);
}
#endif // HAVE_LIBPNG #endif // HAVE_LIBPNG
#endif // 0 }
// //
// End of "$Id: Fl_PNG_Image.cxx,v 1.1.2.1 2001/11/19 01:06:45 easysw Exp $". // End of "$Id: Fl_PNG_Image.cxx,v 1.1.2.2 2001/11/23 12:06:36 easysw Exp $".
// //
+10 -4
View File
@@ -1,5 +1,5 @@
// //
// "$Id: Fl_Pixmap.cxx,v 1.9.2.4.2.7 2001/11/22 15:35:01 easysw Exp $" // "$Id: Fl_Pixmap.cxx,v 1.9.2.4.2.8 2001/11/23 12:06:36 easysw Exp $"
// //
// Pixmap drawing code for the Fast Light Tool Kit (FLTK). // Pixmap drawing code for the Fast Light Tool Kit (FLTK).
// //
@@ -56,13 +56,19 @@ void Fl_Pixmap::measure() {
void Fl_Pixmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) { void Fl_Pixmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
// ignore empty or bad pixmap data: // ignore empty or bad pixmap data:
if (!data()) return; if (!data()) {
draw_empty(XP, YP);
return;
}
if (w()<0) measure(); if (w()<0) measure();
if (WP==-1) { if (WP==-1) {
WP = w(); WP = w();
HP = h(); HP = h();
} }
if (!w()) return; if (!w()) {
draw_empty(XP, YP);
return;
}
// account for current clip region (faster on Irix): // account for current clip region (faster on Irix):
int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H); int 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;
@@ -461,5 +467,5 @@ void Fl_Pixmap::desaturate() {
} }
// //
// End of "$Id: Fl_Pixmap.cxx,v 1.9.2.4.2.7 2001/11/22 15:35:01 easysw Exp $". // End of "$Id: Fl_Pixmap.cxx,v 1.9.2.4.2.8 2001/11/23 12:06:36 easysw Exp $".
// //