mirror of
https://github.com/fltk/fltk.git
synced 2026-05-29 04:26:27 +08:00
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:
+3
-2
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 $".
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user