diff options
| author | No Author <No Author> | 2001-08-01 21:24:49 +0000 |
|---|---|---|
| committer | No Author <No Author> | 2001-08-01 21:24:49 +0000 |
| commit | 3cb5ebe0e811f3db008085d985b7761725589a74 (patch) | |
| tree | 0a7184a5f02fffe927af911758f3a9a4a2f4a37e /FL/Fl_Shared_Image.H | |
| parent | 4477e166400f197bed50b09e01e695221cde96b6 (diff) | |
This commit was manufactured by cvs2svn to create branch 'branch-1.1'.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1513 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'FL/Fl_Shared_Image.H')
| -rw-r--r-- | FL/Fl_Shared_Image.H | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/FL/Fl_Shared_Image.H b/FL/Fl_Shared_Image.H new file mode 100644 index 000000000..11c5ce794 --- /dev/null +++ b/FL/Fl_Shared_Image.H @@ -0,0 +1,203 @@ +// +// "$Id: Fl_Shared_Image.H,v 1.22 2001/07/16 19:38:17 robertk Exp $" +// +// Image file header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-1999 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems to "fltk-bugs@easysw.com". +// + +#ifndef Fl_Shared_Image_H +#define Fl_Shared_Image_H + +#include <FL/Fl_Image.H> +#include <stddef.h> + +struct FL_IMAGES_API Fl_Image_Type; + +// Shared images class. +class FL_IMAGES_API Fl_Shared_Image : public Fl_Image { +protected: + static const char* fl_shared_image_root; + + static int image_used; + static size_t mem_usage_limit; + + static size_t mem_used; + static int forbid_delete; + + Fl_Shared_Image* l1; // Left leaf in the binary tree + Fl_Shared_Image* l2; // Right leaf in the binary tree + const char* name; // Used to indentify the image, and as filename + const uchar* datas; // If non zero, pointers on inlined compressed datas + unsigned int used; // Last time used, for cache handling purpose + int refcount; // Number of time this image has been get + + Fl_Shared_Image() { }; // Constructor is private on purpose, + // use the get function rather + ~Fl_Shared_Image(); + + void find_less_used(); + static void check_mem_usage(); + + const char* get_filename();// Return the filename obtained from the concatenation + // of the image root directory and this image name + // WARNING : the returned pointer will be + // available only until next call to get_filename + + static const char* get_filename(const char*); + + virtual void read() = 0;// decompress the image and create its pixmap + + static void insert(Fl_Shared_Image*& p, Fl_Shared_Image* image); + static Fl_Shared_Image* find(Fl_Shared_Image* image, const char* name); + void remove_from_tree(Fl_Shared_Image*& p, Fl_Shared_Image* image); + + +public: + static Fl_Shared_Image *first_image; + + // Return an Fl_Shared_Image, using the create function if an image with + // the given name doesn't already exist. Use datas, or read from the + // file with filename name if datas==0. + static Fl_Shared_Image* get(Fl_Shared_Image* (*create)(), + const char* name, const uchar* datas=0); + + // Reload the image, useful if it has changed on disk, or if the datas + // in memory have changed (you can also give a new pointer on datas) + void reload(const uchar* datas=0); + static void reload(const char* name, const uchar* datas=0); + + // Remove an image from the database and delete it if its refcount has + // fallen to zero + // Each remove decrement the refcount, each get increment it + // Return 1 if it has been really deleted. + int remove(); + static int remove(const char* name); + + // Clear the cache for this image and all of its children in the binary tree + void clear_cache(); + + // Try to guess the filetype + // Beware that calling this force you to link in all image types ! + static Fl_Image_Type* guess(const char* name, const uchar* datas=0); + + // Set the position where images are looked for on disk + static void set_root_directory(const char* d); + + // Set the size of the cache (0 = unlimited is the default) + static void set_cache_size(size_t l); + + virtual void draw(int X, int Y, int W, int H, int cx, int cy); +}; + + + +// Description of a file format +struct FL_IMAGES_API Fl_Image_Type { + // Name of the filetype as it appear in the source code (uppercase) + const char* name; + // Function to test the filetype + int (*test)(const uchar* datas, size_t size=0); + // Function to get/create an image of this type + Fl_Shared_Image* (*get)(const char* name, const uchar* datas=0); +}; +extern FL_IMAGES_API Fl_Image_Type fl_image_filetypes[]; + +/* Specific image format functions. Add you own file format here. */ + +// PNG image class +class FL_IMAGES_API Fl_PNG_Image : public Fl_Shared_Image { + void read(); // Uncompress PNG datas + Fl_PNG_Image() { } + static Fl_Shared_Image* create() { return new Fl_PNG_Image; } // Instantiate +public: +// Check the given buffer if it is in PNG format + static int test(const uchar* datas, size_t size=0); + void measure(int& W, int& H); // Return width and heigth + static Fl_Shared_Image* get(const char* name, const uchar* datas = 0) { + return Fl_Shared_Image::get(create, name, datas); + } +}; + +class FL_IMAGES_API Fl_GIF_Image : public Fl_Shared_Image { + void read(); + Fl_GIF_Image() { } + static Fl_Shared_Image* create() { return new Fl_GIF_Image; } +public: + static int test(const uchar* datas, size_t size=0); + void measure(int& W, int& H); + static Fl_Shared_Image* get(const char* name, const uchar* datas = 0) { + return Fl_Shared_Image::get(create, name, datas); + } +}; + +class FL_IMAGES_API Fl_XPM_Image : public Fl_Shared_Image { + void read(); + Fl_XPM_Image() { } + static Fl_Shared_Image* create() { return new Fl_XPM_Image; } +public: + static int test(const uchar* datas, size_t size=0); + void measure(int& W, int& H); + static Fl_Shared_Image* get(const char* name, const uchar* datas = 0) { + return Fl_Shared_Image::get(create, name, datas); + } +}; + +class FL_IMAGES_API Fl_BMP_Image : public Fl_Shared_Image { + void read(); + Fl_BMP_Image() { } + static Fl_Shared_Image* create() { return new Fl_BMP_Image; } +public: + static int test(const uchar* datas, size_t size=0); + void measure(int& W, int& H); + static Fl_Shared_Image* get(const char* name, const uchar* datas = 0) { + return Fl_Shared_Image::get(create, name, datas); + } +}; + +class FL_IMAGES_API Fl_JPEG_Image : public Fl_Shared_Image { + void read(); + Fl_JPEG_Image() { } + static Fl_Shared_Image* create() { return new Fl_JPEG_Image; } +public: + static int test(const uchar* datas, size_t size=0); + void measure(int& W, int& H); + static Fl_Shared_Image* get(const char* name, const uchar* datas = 0) { + return Fl_Shared_Image::get(create, name, datas); + } +}; + +//class FL_API Fl_Bitmap; +class Fl_Bitmap; +extern FL_IMAGES_API Fl_Bitmap nosuch_bitmap; + +class FL_IMAGES_API Fl_UNKNOWN_Image { +public: + static int test(const uchar*, size_t =0) { return 1; }; + static Fl_Shared_Image* get(const char*, const uchar* = 0) { + return (Fl_Shared_Image*) &nosuch_bitmap; + }; +}; + +#endif + +// +// End of "$Id: Fl_Shared_Image.H,v 1.22 2001/07/16 19:38:17 robertk Exp $" +// |
