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

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).
//
@ -41,6 +41,7 @@ class FL_EXPORT Fl_Image {
void h(int H) {h_ = H;}
void d(int D) {d_ = D;}
void data(const char * const *p, int c) {data_ = p; count_ = c;}
void draw_empty(int X, int Y);
public:
@ -88,5 +89,5 @@ class FL_EXPORT Fl_RGB_Image : public Fl_Image {
#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 $".
//

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).
//
@ -161,6 +161,11 @@ void fl_delete_bitmask(Fl_Bitmask bm) {
#endif // WIN32
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):
int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H);
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 $".
//

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).
//
@ -37,6 +37,16 @@ Fl_Image::~Fl_Image() {
}
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) {
@ -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) {
if (!array) {
draw_empty(XP, YP);
return;
}
// account for current clip region (faster on Irix):
int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H);
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 $".
//

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.
//
@ -32,27 +32,9 @@
//
#include <FL/Fl_JPEG_Image.H>
#include "config.h"
#include <config.h>
#include <stdio.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"
{
@ -61,24 +43,22 @@ extern "C"
#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
//
// '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
{
FILE *fp; // File pointer
struct jpeg_decompress_struct cinfo; // Decompressor info
struct jpeg_error_mgr jerr; // Error handler info
JSAMPROW row; // Sample row pointer
if ((fp = fopen(jpeg, "rb")) == NULL) return;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
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);
img->w = cinfo.output_width;
img->h = cinfo.output_height;
img->d = cinfo.output_components;
img->data = (unsigned char *)malloc(img->w * img->h * img->d);
w(cinfo.output_width);
h(cinfo.output_height);
d(cinfo.output_components);
if (img->data == NULL)
{
jpeg_destroy_decompress(&cinfo);
return (0);
}
array = new uchar[w() * h() * d()];
jpeg_start_decompress(&cinfo);
while (cinfo.output_scanline < cinfo.output_height)
{
row = (JSAMPROW)(img->data +
row = (JSAMPROW)(array +
cinfo.output_scanline * cinfo.output_width *
cinfo.output_components);
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_destroy_decompress(&cinfo);
return (1);
}
fclose(fp);
#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 $".
//

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.
//
@ -32,15 +32,9 @@
//
#include <FL/Fl_PNG_Image.H>
#include "config.h"
#include <config.h>
#include <stdio.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"
{
@ -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_Help_View::load_png(Fl_Help_Image *img,// I - Image pointer
FILE *fp) // I - File to read from
{
Fl_PNG_Image::Fl_PNG_Image(const char *png) // I - File to read
: Fl_RGB_Image(0,0,0) {
#ifdef HAVE_LIBPNG
int i; // Looping var
FILE *fp; // File pointer
int channels; // Number of color channels
png_structp pp; // PNG read pointer
png_infop info; // PNG info 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...
pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
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);
if (info->color_type & PNG_COLOR_MASK_COLOR)
img->d = 3;
channels = 3;
else
img->d = 1;
channels = 1;
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)
{
@ -103,31 +102,20 @@ Fl_Help_View::load_png(Fl_Help_Image *img,// I - Image pointer
png_set_tRNS_to_alpha(pp);
#endif // HAVE_PNG_GET_VALID && HAVE_SET_TRNS_TO_ALPHA
img->w = (int)info->width;
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);
array = new uchar[w() * h() * d()];
// Allocate pointers...
rows = (png_bytep *)calloc(info->height, sizeof(png_bytep));
rows = new png_bytep[h()];
for (i = 0; i < (int)info->height; i ++)
rows[i] = img->data + i * img->w * img->d;
for (i = 0; i < h(); i ++)
rows[i] = (png_bytep)(array + i * w() * d());
// Read the image, handling interlacing as needed...
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(rows);
delete rows;
png_read_end(pp, info);
# 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);
# endif // HAVE_PNG_READ_DESTROY
return (1);
}
fclose(fp);
#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 $".
//

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).
//
@ -56,13 +56,19 @@ void Fl_Pixmap::measure() {
void Fl_Pixmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
// ignore empty or bad pixmap data:
if (!data()) return;
if (!data()) {
draw_empty(XP, YP);
return;
}
if (w()<0) measure();
if (WP==-1) {
WP = w();
HP = h();
}
if (!w()) return;
if (!w()) {
draw_empty(XP, YP);
return;
}
// account for current clip region (faster on Irix):
int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H);
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 $".
//