summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FL/Fl_BMP_Image.H6
-rw-r--r--FL/Fl_GIF_Image.H8
-rw-r--r--FL/Fl_Image.H162
-rw-r--r--FL/Fl_JPEG_Image.H10
-rw-r--r--src/Fl_BMP_Image.cxx26
-rw-r--r--src/Fl_GIF_Image.cxx18
-rw-r--r--src/Fl_Image.cxx71
-rw-r--r--src/Fl_JPEG_Image.cxx11
-rw-r--r--src/Fl_PNG_Image.cxx24
-rw-r--r--src/Fl_PNM_Image.cxx22
10 files changed, 235 insertions, 123 deletions
diff --git a/FL/Fl_BMP_Image.H b/FL/Fl_BMP_Image.H
index 09ce85717..5f0c30118 100644
--- a/FL/Fl_BMP_Image.H
+++ b/FL/Fl_BMP_Image.H
@@ -24,9 +24,9 @@
# include "Fl_Image.H"
/**
- The Fl_BMP_Image class supports loading, caching,
- and drawing of Windows Bitmap (BMP) image files.
-*/
+ The Fl_BMP_Image class supports loading, caching,
+ and drawing of Windows Bitmap (BMP) image files.
+ */
class FL_EXPORT Fl_BMP_Image : public Fl_RGB_Image {
public:
diff --git a/FL/Fl_GIF_Image.H b/FL/Fl_GIF_Image.H
index 3548880e7..a24079a8e 100644
--- a/FL/Fl_GIF_Image.H
+++ b/FL/Fl_GIF_Image.H
@@ -24,10 +24,10 @@
# include "Fl_Pixmap.H"
/**
- The Fl_GIF_Image class supports loading, caching,
- and drawing of Compuserve GIF<SUP>SM</SUP> images. The class
- loads the first image and supports transparency.
-*/
+ The Fl_GIF_Image class supports loading, caching,
+ and drawing of Compuserve GIF<SUP>SM</SUP> images. The class
+ loads the first image and supports transparency.
+ */
class FL_EXPORT Fl_GIF_Image : public Fl_Pixmap {
public:
diff --git a/FL/Fl_Image.H b/FL/Fl_Image.H
index e099741c1..a4d6d737d 100644
--- a/FL/Fl_Image.H
+++ b/FL/Fl_Image.H
@@ -30,26 +30,36 @@ class Fl_Pixmap;
struct Fl_Menu_Item;
struct Fl_Label;
+
/** \enum Fl_RGB_Scaling
- The scaling algorithm to use for RGB images.
+ The scaling algorithm to use for RGB images.
*/
enum Fl_RGB_Scaling {
- FL_RGB_SCALING_NEAREST = 0, ///< default RGB image scaling algorithm
- FL_RGB_SCALING_BILINEAR ///< more accurate, but slower RGB image scaling algorithm
+ FL_RGB_SCALING_NEAREST = 0, ///< default RGB image scaling algorithm
+ FL_RGB_SCALING_BILINEAR ///< more accurate, but slower RGB image scaling algorithm
};
+
/**
- Fl_Image is the base class used for caching and
- drawing all kinds of images in FLTK. This class keeps track of
- common image data such as the pixels, colormap, width, height,
- and depth. Virtual methods are used to provide type-specific
- image handling.
+ \brief Base class for image caching and drawing.
+
+ Fl_Image is the base class used for caching and drawing all kinds of images
+ in FLTK. This class keeps track of common image data such as the pixels,
+ colormap, width, height, and depth. Virtual methods are used to provide
+ type-specific image handling.
- Since the Fl_Image class does not support image
- drawing by itself, calling the draw() method results in
- a box with an X in it being drawn instead.
+ Since the Fl_Image class does not support image
+ drawing by itself, calling the draw() method results in
+ a box with an X in it being drawn instead.
*/
class FL_EXPORT Fl_Image {
+
+public:
+ const int ERR_NO_IMAGE = -1;
+ const int ERR_FILE_ACCESS = -2;
+ const int ERR_FORMAT = -3;
+
+private:
int w_, h_, d_, ld_, count_;
const char * const *data_;
static Fl_RGB_Scaling RGB_scaling_;
@@ -58,19 +68,19 @@ class FL_EXPORT Fl_Image {
Fl_Image & operator=(const Fl_Image &);
Fl_Image(const Fl_Image &);
- protected:
+protected:
/**
- Sets the current image width in pixels.
- */
+ Sets the current image width in pixels.
+ */
void w(int W) {w_ = W;}
/**
- Sets the current image height in pixels.
- */
+ Sets the current image height in pixels.
+ */
void h(int H) {h_ = H;}
/**
- Sets the current image depth.
- */
+ Sets the current image depth.
+ */
void d(int D) {d_ = D;}
/**
Sets the current line data size in bytes.
@@ -85,85 +95,88 @@ class FL_EXPORT Fl_Image {
static void labeltype(const Fl_Label *lo, int lx, int ly, int lw, int lh, Fl_Align la);
static void measure(const Fl_Label *lo, int &lw, int &lh);
- public:
+public:
/**
Returns the current image width in pixels.
- */
+ */
int w() const {return w_;}
- /** Returns the current image height in pixels.
+ /**
+ Returns the current image height in pixels.
*/
int h() const {return h_;}
/**
- Returns the current image depth.
+ Returns the current image depth.
The return value will be 0 for bitmaps, 1 for
- pixmaps, and 1 to 4 for color images.</P>
- */
+ pixmaps, and 1 to 4 for color images.</P>
+ */
int d() const {return d_;}
/**
- Returns the current line data size in bytes.
- Line data is extra data that is included
- after each line of color image data and is normally not present.
- */
+ Returns the current line data size in bytes.
+ Line data is extra data that is included
+ after each line of color image data and is normally not present.
+ */
int ld() const {return ld_;}
/**
- The count() method returns the number of data values
- associated with the image. The value will be 0 for images with
- no associated data, 1 for bitmap and color images, and greater
- than 2 for pixmap images.
- */
+ The count() method returns the number of data values
+ associated with the image. The value will be 0 for images with
+ no associated data, 1 for bitmap and color images, and greater
+ than 2 for pixmap images.
+ */
int count() const {return count_;}
/**
- Returns a pointer to the current image data array.
- Use the count() method to find the size of the data array.
- */
+ Returns a pointer to the current image data array.
+ Use the count() method to find the size of the data array.
+ */
const char * const *data() const {return data_;}
-
/**
- The constructor creates an empty image with the specified
- width, height, and depth. The width and height are in pixels.
- The depth is 0 for bitmaps, 1 for pixmap (colormap) images, and
- 1 to 4 for color images.
- */
- Fl_Image(int W, int H, int D) {w_ = W; h_ = H; d_ = D; ld_ = 0; count_ = 0; data_ = 0;}
+ Returns a value that is not 0 if there is currently no image
+ available.
+ \return ERR_NO_IMAGE if no image was found
+ \return ERR_FILE_ACCESS if there was a file access related error (errno should be set)
+ \return ERR_FORMAT if image decoding failed.
+ */
+ int fail();
+ Fl_Image(int W, int H, int D);
virtual ~Fl_Image();
virtual Fl_Image *copy(int W, int H);
/**
- The copy() method creates a copy of the specified
- image. If the width and height are provided, the image is
- resized to the specified size. The image should be deleted (or in
- the case of Fl_Shared_Image, released) when you are done
- with it.
- */
+ The copy() method creates a copy of the specified
+ image. If the width and height are provided, the image is
+ resized to the specified size. The image should be deleted (or in
+ the case of Fl_Shared_Image, released) when you are done
+ with it.
+ */
Fl_Image *copy() { return copy(w(), h()); }
virtual void color_average(Fl_Color c, float i);
/**
- The inactive() method calls
- color_average(FL_BACKGROUND_COLOR, 0.33f) to produce
- an image that appears grayed out.
+ The inactive() method calls
+ color_average(FL_BACKGROUND_COLOR, 0.33f) to produce
+ an image that appears grayed out.
- An internal copy is made of the original image before
- changes are applied, to avoid modifying the original image.
- */
+ An internal copy is made of the original image before
+ changes are applied, to avoid modifying the original image.
+ */
void inactive() { color_average(FL_GRAY, .33f); }
virtual void desaturate();
virtual void label(Fl_Widget*w);
virtual void label(Fl_Menu_Item*m);
/**
- Draws the image with a bounding box.
- Arguments <tt>X,Y,W,H</tt> specify
- a bounding box for the image, with the origin
- (upper-left corner) of the image offset by the \c cx
- and \c cy arguments.\n
+ Draws the image with a bounding box.
+ Arguments <tt>X,Y,W,H</tt> specify
+ a bounding box for the image, with the origin
+ (upper-left corner) of the image offset by the \c cx
+ and \c cy arguments.
+
In other words: <tt>fl_push_clip(X,Y,W,H)</tt> is applied,
the image is drawn with its upper-left corner at <tt>X-cx,Y-cy</tt> and its own width and height,
<tt>fl_pop_clip</tt><tt>()</tt> is applied.
- */
+ */
virtual void draw(int X, int Y, int W, int H, int cx=0, int cy=0); // platform dependent
/**
- Draws the image.
- This form specifies the upper-lefthand corner of the image.
- */
+ Draws the image.
+ This form specifies the upper-lefthand corner of the image.
+ */
void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);} // platform dependent
virtual void uncache();
@@ -174,6 +187,7 @@ class FL_EXPORT Fl_Image {
static Fl_RGB_Scaling RGB_scaling();
};
+
/**
The Fl_RGB_Image class supports caching and drawing
of full-color images with 1 to 4 channels of color information.
@@ -206,25 +220,9 @@ public:
unsigned mask_; // for internal use (mask bitmap)
#endif // __APPLE__ || WIN32
- public:
+public:
-/**
- The constructor creates a new image from the specified data.
- \param[in] bits The image data array.
- \param[in] W The width of the image in pixels
- \param[in] H The height of the image in pixels
- \param[in] D The image depth, or 'number of channels'. Default=3<br>
- If D=1, each uchar in bits[] is a grayscale pixel value.<br>
- If D=2, each uchar pair in bits[] is a grayscale + alpha pixel value.<br>
- If D=3, each uchar triplet in bits[] is an R/G/B pixel value<br>
- If D=4, each uchar quad in bits[] is an R/G/B/A pixel value.
- \param[in] LD Line data size (default=0).<br>
- Line data is extra data that is included after each line
- of color image data and is normally not present.
- \see Fl_Image::data(), Fl_Image::w(), Fl_Image::h(), Fl_Image::d(), Fl_Image::ld()
- */
- Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) :
- Fl_Image(W,H,D), array(bits), alloc_array(0), id_(0), mask_(0) {data((const char **)&array, 1); ld(LD);}
+ Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0);
Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg=FL_GRAY);
virtual ~Fl_RGB_Image();
virtual Fl_Image *copy(int W, int H);
diff --git a/FL/Fl_JPEG_Image.H b/FL/Fl_JPEG_Image.H
index f79452380..d9b162c13 100644
--- a/FL/Fl_JPEG_Image.H
+++ b/FL/Fl_JPEG_Image.H
@@ -24,11 +24,11 @@
# include "Fl_Image.H"
/**
- The Fl_JPEG_Image class supports loading, caching,
- and drawing of Joint Photographic Experts Group (JPEG) File
- Interchange Format (JFIF) images. The class supports grayscale
- and color (RGB) JPEG image files.
-*/
+ The Fl_JPEG_Image class supports loading, caching,
+ and drawing of Joint Photographic Experts Group (JPEG) File
+ Interchange Format (JFIF) images. The class supports grayscale
+ and color (RGB) JPEG image files.
+ */
class FL_EXPORT Fl_JPEG_Image : public Fl_RGB_Image {
public:
diff --git a/src/Fl_BMP_Image.cxx b/src/Fl_BMP_Image.cxx
index 8542763be..be291b616 100644
--- a/src/Fl_BMP_Image.cxx
+++ b/src/Fl_BMP_Image.cxx
@@ -52,13 +52,19 @@
static int read_long(FILE *fp);
static unsigned short read_word(FILE *fp);
static unsigned int read_dword(FILE *fp);
+
+
/**
- The constructor loads the named BMP image from the given bmp filename.
- <P>The inherited destructor free all memory and server resources that are used by
- the image.
- <P>The destructor free all memory and server resources that are used by
- the image
-*/
+ The constructor loads the named BMP image from the given bmp filename.
+
+ The inherited destructor frees all memory and server resources that are
+ used by the image.
+
+ Use Fl_Image::fail() to check if Fl_BMP_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not bo opened or read, ERR_FORMAT if the
+ BMP format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+ */
Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
: Fl_RGB_Image(0,0,0) {
FILE *fp; // File pointer
@@ -86,13 +92,17 @@ Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
// Open the file...
- if ((fp = fl_fopen(bmp, "rb")) == NULL) return;
+ if ((fp = fl_fopen(bmp, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
// Get the header...
byte = (uchar)getc(fp); // Check "BM" sync chars
bit = (uchar)getc(fp);
if (byte != 'B' || bit != 'M') {
fclose(fp);
+ ld(ERR_FORMAT);
return;
}
@@ -161,6 +171,7 @@ Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
// Check header data...
if (!w() || !h() || !depth) {
fclose(fp);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
@@ -191,6 +202,7 @@ Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
if (((size_t)w()) * h() * d() > max_size() ) {
Fl::warning("BMP file \"%s\" is too large!\n", bmp);
fclose(fp);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
array = new uchar[w() * h() * d()];
diff --git a/src/Fl_GIF_Image.cxx b/src/Fl_GIF_Image.cxx
index 601da9f12..b541979b4 100644
--- a/src/Fl_GIF_Image.cxx
+++ b/src/Fl_GIF_Image.cxx
@@ -71,27 +71,36 @@ typedef unsigned char uchar;
#define GETSHORT(var) var = NEXTBYTE; var += NEXTBYTE << 8
/**
- The constructor loads the named GIF image.
- <P>The inherited destructor free all memory and server resources that are used by
- the image.
-*/
+ The constructor loads the named GIF image.
+
+ The inherited destructor free all memory and server resources that are used
+ by the image.
+
+ Use Fl_Image::fail() to check if Fl_BMP_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not bo opened or read, ERR_FORMAT if the
+ GIF format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+ */
Fl_GIF_Image::Fl_GIF_Image(const char *infname) : Fl_Pixmap((char *const*)0) {
FILE *GifFile; // File to read
char **new_data; // Data array
if ((GifFile = fl_fopen(infname, "rb")) == NULL) {
Fl::error("Fl_GIF_Image: Unable to open %s!", infname);
+ ld(ERR_FILE_ACCESS);
return;
}
{char b[6];
if (fread(b,1,6,GifFile)<6) {
fclose(GifFile);
+ ld(ERR_FILE_ACCESS);
return; /* quit on eof */
}
if (b[0]!='G' || b[1]!='I' || b[2] != 'F') {
fclose(GifFile);
Fl::error("Fl_GIF_Image: %s is not a GIF file.\n", infname);
+ ld(ERR_FORMAT);
return;
}
if (b[3]!='8' || b[4]>'9' || b[5]!= 'a')
@@ -135,6 +144,7 @@ Fl_GIF_Image::Fl_GIF_Image(const char *infname) : Fl_Pixmap((char *const*)0) {
if (i<0) {
fclose(GifFile);
Fl::error("Fl_GIF_Image: %s - unexpected EOF",infname);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
int blocklen;
diff --git a/src/Fl_Image.cxx b/src/Fl_Image.cxx
index d12de0ecc..8afd232dc 100644
--- a/src/Fl_Image.cxx
+++ b/src/Fl_Image.cxx
@@ -37,6 +37,17 @@ void fl_restore_clip(); // from fl_rect.cxx
Fl_RGB_Scaling Fl_Image::RGB_scaling_ = FL_RGB_SCALING_NEAREST;
+
+/**
+ The constructor creates an empty image with the specified
+ width, height, and depth. The width and height are in pixels.
+ The depth is 0 for bitmaps, 1 for pixmap (colormap) images, and
+ 1 to 4 for color images.
+ */
+Fl_Image::Fl_Image(int W, int H, int D) :
+ w_(W), h_(H), d_(D), ld_(0), count_(0), data_(0L)
+{}
+
/**
The destructor is a virtual method that frees all memory used
by the image.
@@ -129,6 +140,18 @@ void Fl_Image::label(Fl_Menu_Item* m) {
m->label(_FL_IMAGE_LABEL, (const char*)this);
}
+int Fl_Image::fail()
+{
+ // if no image exists, ld_ may contain a simple error code
+ if ( (w_<=0) || (h_<=0) || (d_<=0) ) {
+ if (ld_==0)
+ return ERR_NO_IMAGE;
+ else
+ return ld_;
+ }
+ return 0;
+}
+
void
Fl_Image::labeltype(const Fl_Label *lo, // I - Label
int lx, // I - X position
@@ -186,12 +209,44 @@ size_t Fl_RGB_Image::max_size_ = ~((size_t)0);
int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg);
-/** The constructor creates a new RGBA image from the specified Fl_Pixmap.
+
+/**
+ The constructor creates a new image from the specified data.
+ \param[in] bits The image data array.
+ \param[in] W The width of the image in pixels
+ \param[in] H The height of the image in pixels
+ \param[in] D The image depth, or 'number of channels'. Default=3<br>
+ If D=1, each uchar in bits[] is a grayscale pixel value.<br>
+ If D=2, each uchar pair in bits[] is a grayscale + alpha pixel value.<br>
+ If D=3, each uchar triplet in bits[] is an R/G/B pixel value<br>
+ If D=4, each uchar quad in bits[] is an R/G/B/A pixel value.
+ \param[in] LD Line data size (default=0).<br>
+ Line data is extra data that is included after each line
+ of color image data and is normally not present.
+ \see Fl_Image::data(), Fl_Image::w(), Fl_Image::h(), Fl_Image::d(), Fl_Image::ld()
+ */
+Fl_RGB_Image::Fl_RGB_Image(const uchar *bits, int W, int H, int D, int LD) :
+ Fl_Image(W,H,D),
+ array(bits),
+ alloc_array(0),
+ id_(0),
+ mask_(0)
+{
+ data((const char **)&array, 1);
+ ld(LD);
+}
+
+
+/**
+ The constructor creates a new RGBA image from the specified Fl_Pixmap.
The RGBA image is built fully opaque except for the transparent area
- of the pixmap that is assigned the \par bg color with full transparency */
+ of the pixmap that is assigned the \par bg color with full transparency
+ */
Fl_RGB_Image::Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg):
- Fl_Image(pxm->w(), pxm->h(), 4), id_(0), mask_(0)
+ Fl_Image(pxm->w(), pxm->h(), 4),
+ id_(0),
+ mask_(0)
{
array = new uchar[w() * h() * d()];
alloc_array = 1;
@@ -199,7 +254,11 @@ Fl_RGB_Image::Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg):
data((const char **)&array, 1);
}
-/** The destructor frees all memory and server resources that are used by the image. */
+
+/**
+ The destructor frees all memory and server resources that are used by
+ the image.
+ */
Fl_RGB_Image::~Fl_RGB_Image() {
#ifdef __APPLE__
if (id_) CGImageRelease((CGImageRef)id_);
@@ -258,7 +317,9 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
new_image->alloc_array = 1;
return new_image;
- } else return new Fl_RGB_Image(array, w(), h(), d(), ld());
+ } else {
+ return new Fl_RGB_Image(array, w(), h(), d(), ld());
+ }
}
if (W <= 0 || H <= 0) return 0;
diff --git a/src/Fl_JPEG_Image.cxx b/src/Fl_JPEG_Image.cxx
index 6cebe88e9..cd3e4a462 100644
--- a/src/Fl_JPEG_Image.cxx
+++ b/src/Fl_JPEG_Image.cxx
@@ -111,7 +111,10 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *filename) // I - File to load
array = (uchar *)0;
// Open the image file...
- if ((fp = fl_fopen(filename, "rb")) == NULL) return;
+ if ((fp = fl_fopen(filename, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
// Setup the decompressor info and read the header...
dinfo.err = jpeg_std_error((jpeg_error_mgr *)&jerr);
@@ -150,6 +153,7 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *filename) // I - File to load
free(max_destroy_decompress_err);
free(max_finish_decompress_err);
+ ld(ERR_FORMAT);
return;
}
@@ -275,7 +279,10 @@ static void jpeg_mem_src(j_decompress_ptr cinfo, const unsigned char *data)
The inherited destructor frees all memory and server resources that are used
by the image.
- There is no error function in this class. If the image has loaded correctly,
+ Use Fl_Image::fail() to check if Fl_BMP_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not bo opened or read, ERR_FORMAT if the
+ JPEG format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason. If the image has loaded correctly,
w(), h(), and d() should return values greater zero.
\param name A unique name or NULL
diff --git a/src/Fl_PNG_Image.cxx b/src/Fl_PNG_Image.cxx
index 3f5164fee..74d32da7d 100644
--- a/src/Fl_PNG_Image.cxx
+++ b/src/Fl_PNG_Image.cxx
@@ -71,18 +71,24 @@ extern "C" {
/**
- The constructor loads the named PNG image from the given png filename.
+ The constructor loads the named PNG image from the given png filename.
- The destructor frees all memory and server resources that are used by
- the image.
+ The destructor frees all memory and server resources that are used by
+ the image.
- \param[in] filename Name of PNG file to read
-*/
+ Use Fl_Image::fail() to check if Fl_BMP_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not bo opened or read, ERR_FORMAT if the
+ PNG format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+
+ \param[in] filename Name of PNG file to read
+ */
Fl_PNG_Image::Fl_PNG_Image (const char *filename): Fl_RGB_Image(0,0,0)
{
load_png_(filename, NULL, 0);
}
+
/**
\brief Constructor that reads a PNG image from memory.
@@ -101,6 +107,7 @@ Fl_PNG_Image::Fl_PNG_Image (
load_png_(name_png, buffer, maxsize);
}
+
void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_png, int maxsize)
{
#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ)
@@ -114,7 +121,10 @@ void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_p
int from_memory = (buffer_png != NULL); // true if reading image from memory
if (!from_memory) {
- if ((fp = fl_fopen(name_png, "rb")) == NULL) return;
+ if ((fp = fl_fopen(name_png, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
}
const char *display_name = (name_png ? name_png : "In-memory PNG data");
@@ -125,6 +135,7 @@ void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_p
if (pp) png_destroy_read_struct(&pp, NULL, NULL);
if (!from_memory) fclose(fp);
Fl::warning("Cannot allocate memory to read PNG file or data \"%s\".\n", display_name);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
@@ -133,6 +144,7 @@ void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_p
png_destroy_read_struct(&pp, &info, NULL);
if (!from_memory) fclose(fp);
Fl::warning("PNG file or data \"%s\" is too large or contains errors!\n", display_name);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
diff --git a/src/Fl_PNM_Image.cxx b/src/Fl_PNM_Image.cxx
index c4a65076f..40073b26a 100644
--- a/src/Fl_PNM_Image.cxx
+++ b/src/Fl_PNM_Image.cxx
@@ -37,11 +37,18 @@
// 'Fl_PNM_Image::Fl_PNM_Image()' - Load a PNM image...
//
-/**
- The constructor loads the named PNM image.
- <P>The inherited destructor free all memory and server resources that are used by the image.
-*/
+/**
+ The constructor loads the named PNM image.
+
+ The inherited destructor free all memory and server resources that are used by
+ the image.
+
+ Use Fl_Image::fail() to check if Fl_BMP_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not bo opened or read, ERR_FORMAT if the
+ PNM format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+ */
Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
: Fl_RGB_Image(0,0,0) {
FILE *fp; // File pointer
@@ -56,7 +63,10 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
maxval; // Maximum pixel value
- if ((fp = fl_fopen(name, "rb")) == NULL) return;
+ if ((fp = fl_fopen(name, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
//
// Read the file header in the format:
@@ -75,6 +85,7 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
if (!lineptr) {
fclose(fp);
Fl::error("Early end-of-file in PNM file \"%s\"!", name);
+ ld(ERR_FILE_ACCESS);
return;
}
@@ -122,6 +133,7 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
if (((size_t)w()) * h() * d() > max_size() ) {
Fl::warning("PNM file \"%s\" is too large!\n", name);
fclose(fp);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
array = new uchar[w() * h() * d()];