diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_GIF_Image.cxx | 7 | ||||
| -rw-r--r-- | src/Fl_PNM_Image.cxx | 161 | ||||
| -rw-r--r-- | src/Fl_Shared_Image.cxx | 15 | ||||
| -rw-r--r-- | src/Fl_Tiled_Image.cxx | 133 | ||||
| -rw-r--r-- | src/Fl_XBM_Image.cxx | 88 | ||||
| -rw-r--r-- | src/Fl_XPM_Image.cxx | 129 | ||||
| -rw-r--r-- | src/Makefile | 8 | ||||
| -rw-r--r-- | src/makedepend | 3 |
8 files changed, 534 insertions, 10 deletions
diff --git a/src/Fl_GIF_Image.cxx b/src/Fl_GIF_Image.cxx index 51cbcff70..99ba3b6ed 100644 --- a/src/Fl_GIF_Image.cxx +++ b/src/Fl_GIF_Image.cxx @@ -1,10 +1,9 @@ // -// "$Id: Fl_GIF_Image.cxx,v 1.1.2.4 2001/11/24 02:46:19 easysw Exp $" +// "$Id: Fl_GIF_Image.cxx,v 1.1.2.5 2001/11/24 18:07:57 easysw Exp $" // // Fl_GIF_Image routines. // -// Copyright 1997-2001 by Easy Software Products. -// Image support donated by Matthias Melcher, Copyright 2000. +// Copyright 1997-2001 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 @@ -366,5 +365,5 @@ Fl_GIF_Image::Fl_GIF_Image(const char *infname) : Fl_Pixmap((char *const*)0) { // -// End of "$Id: Fl_GIF_Image.cxx,v 1.1.2.4 2001/11/24 02:46:19 easysw Exp $". +// End of "$Id: Fl_GIF_Image.cxx,v 1.1.2.5 2001/11/24 18:07:57 easysw Exp $". // diff --git a/src/Fl_PNM_Image.cxx b/src/Fl_PNM_Image.cxx new file mode 100644 index 000000000..059cdb22e --- /dev/null +++ b/src/Fl_PNM_Image.cxx @@ -0,0 +1,161 @@ +// +// "$Id: Fl_PNM_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $" +// +// Fl_PNM_Image routines. +// +// Copyright 1997-2001 by Easy Software Products. +// +// 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@fltk.org". +// +// Contents: +// +// + +// +// Include necessary header files... +// + +#include <FL/Fl.H> +#include <FL/Fl_PNM_Image.H> +#include "config.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + + +// +// 'Fl_PNM_Image::Fl_PNM_Image()' - Load a PNM image... +// + +Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read + : Fl_RGB_Image(0,0,0) { + FILE *fp; // File pointer + int x, y; // Looping vars + char line[1024], // Input line + *lineptr; // Pointer in line + uchar *ptr, // Pointer to pixel values + byte, // Byte from file + bit; // Bit in pixel + int format, // Format of PNM file + val, // Pixel value + maxval; // Maximum pixel value + + + // + // Read the file header in the format: + // + // Pformat + // # comment1 + // # comment2 + // ... + // # commentN + // width + // height + // max sample + // + + lineptr = fgets(line, sizeof(line), fp); + lineptr ++; + + format = atoi(lineptr); + while (isdigit(*lineptr)) lineptr ++; + + while (lineptr != NULL && w() == 0) { + if (*lineptr == '\0' || *lineptr == '#') { + lineptr = fgets(line, sizeof(line), fp); + } else if (isdigit(*lineptr)) { + w(atoi(lineptr)); + while (isdigit(*lineptr)) lineptr ++; + } else lineptr ++; + } + + while (lineptr != NULL && h()) { + if (*lineptr == '\0' || *lineptr == '#') { + lineptr = fgets(line, sizeof(line), fp); + } else if (isdigit(*lineptr)) { + h(atoi(lineptr)); + while (isdigit(*lineptr)) lineptr ++; + } else lineptr ++; + } + + if (format != 1 && format != 4) { + maxval = 0; + + while (lineptr != NULL && maxval == 0) { + if (*lineptr == '\0' || *lineptr == '#') { + lineptr = fgets(line, sizeof(line), fp); + } else if (isdigit(*lineptr)) { + maxval = atoi(lineptr); + while (isdigit(*lineptr)) lineptr ++; + } else lineptr ++; + } + } else maxval = 1; + + // Allocate memory... + if (format == 1 || format == 2 || format == 4 || format == 5) d(1); + else d(3); + + array = new uchar[w() * h() * d()]; + + // Read the image file... + for (y = 0; y < h(); y ++) { + ptr = (uchar *)array + y * w() * d(); + + switch (format) { + case 1 : + case 2 : + for (x = w(); x > 0; x --) + if (fscanf(fp, "%d", &val) == 1) *ptr++ = 255 * val / maxval; + break; + + case 3 : + for (x = w(); x > 0; x --) { + if (fscanf(fp, "%d", &val) == 1) *ptr++ = 255 * val / maxval; + if (fscanf(fp, "%d", &val) == 1) *ptr++ = 255 * val / maxval; + if (fscanf(fp, "%d", &val) == 1) *ptr++ = 255 * val / maxval; + } + break; + + case 4 : + for (x = w(), byte = getc(fp), bit = 128; x > 0; x --) { + if (byte & bit) *ptr++ = 255; + else *ptr++ = 0; + + if (bit > 1) bit >>= 1; + else { + bit = 128; + byte = getc(fp); + } + } + break; + + case 5 : + case 6 : + fread(ptr, w(), d(), fp); + break; + } + } + + fclose(fp); +} + + +// +// End of "$Id: Fl_PNM_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $". +// diff --git a/src/Fl_Shared_Image.cxx b/src/Fl_Shared_Image.cxx index fd345412f..996ea39ff 100644 --- a/src/Fl_Shared_Image.cxx +++ b/src/Fl_Shared_Image.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_Shared_Image.cxx,v 1.23.2.1 2001/11/24 02:46:19 easysw Exp $" +// "$Id: Fl_Shared_Image.cxx,v 1.23.2.2 2001/11/24 18:07:57 easysw Exp $" // // Shared image code for the Fast Light Tool Kit (FLTK). // @@ -32,8 +32,9 @@ #include <FL/Fl_GIF_Image.H> #include <FL/Fl_JPEG_Image.H> #include <FL/Fl_PNG_Image.H> -//#include <FL/Fl_XBM_Image.H> -//#include <FL/Fl_XPM_Image.H> +#include <FL/Fl_PNM_Image.H> +#include <FL/Fl_XBM_Image.H> +#include <FL/Fl_XPM_Image.H> // @@ -224,6 +225,12 @@ Fl_Shared_Image::reload() { else if (memcmp(header, "\377\330\377", 3) == 0 && // Start-of-Image header[3] >= 0xe0 && header[3] <= 0xef) // APPn img = new Fl_JPEG_Image(name_); + else if (header[0] == 'P' && header[1] >= '1' && header[1] <= '6') // Portable anymap + img = new Fl_PNM_Image(name_); + else if (memcmp(header, "#define", 7) == 0) // XBM file + img = new Fl_XBM_Image(name_); + else if (memcmp(header, "/* XPM */", 9) == 0) // XPM file + img = new Fl_XPM_Image(name_); else img = 0; @@ -369,5 +376,5 @@ Fl_Shared_Image::get(const char *n, int W, int H) { // -// End of "$Id: Fl_Shared_Image.cxx,v 1.23.2.1 2001/11/24 02:46:19 easysw Exp $". +// End of "$Id: Fl_Shared_Image.cxx,v 1.23.2.2 2001/11/24 18:07:57 easysw Exp $". // diff --git a/src/Fl_Tiled_Image.cxx b/src/Fl_Tiled_Image.cxx new file mode 100644 index 000000000..fc652ca43 --- /dev/null +++ b/src/Fl_Tiled_Image.cxx @@ -0,0 +1,133 @@ +// +// "$Id: Fl_Tiled_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $" +// +// Tiled image code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2001 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@fltk.org". +// + +#include <FL/Fl.H> +#include <FL/Fl_Tiled_Image.H> +#include <FL/fl_draw.H> + + +// +// 'Fl_Tiled_Image::Fl_Tiled_Image()' - Constructor. +// +// Use a width and height of 0 to tile the whole window/widget. +// + +Fl_Tiled_Image::Fl_Tiled_Image(Fl_Image *i, // I - Image to tile + int W, // I - Width of tiled area + int H) : // I - Height of tiled area + Fl_Image(W,H,0) { + image_ = i; + alloc_image_ = 0; + + if (W == 0) w(Fl::w()); + if (H == 0) h(Fl::h()); +} + + +// +// 'Fl_Tiled_Image::~Fl_Tiled_Image()' - Destructor. +// + +Fl_Tiled_Image::~Fl_Tiled_Image() { + if (alloc_image_) delete image_; +} + + +// +// 'Fl_Tiled_Image::copy()' - Copy and resize a tiled image... +// + +Fl_Image * // O - New image +Fl_Tiled_Image::copy(int W, // I - New width + int H) { // I - New height + if (W == w() && H == h()) return this; + else return new Fl_Tiled_Image(image_, W, H); +} + + +// +// 'Fl_Tiled_Image::color_average()' - Blend colors... +// + +void +Fl_Tiled_Image::color_average(Fl_Color c, // I - Color to blend with + float i) { // I - Blend fraction + Fl_Image *temp = image_->copy(); + + temp->color_average(c, i); + + image_ = temp; + alloc_image_ = 1; +} + + +// +// 'Fl_Tiled_Image::desaturate()' - Convert the image to grayscale... +// + +void +Fl_Tiled_Image::desaturate() { + Fl_Image *temp = image_->copy(); + + temp->desaturate(); + + image_ = temp; + alloc_image_ = 1; +} + + +// +// 'Fl_Tiled_Image::draw()' - Draw a shared image... +// + +void +Fl_Tiled_Image::draw(int X, // I - Starting X position + int Y, // I - Starting Y position + int W, // I - Width of area to be filled + int H, // I - Height of area to be filled + int cx, // I - "Source" X position + int cy) { // I - "Source" Y position + if (!image_->w() || !image_->h()) return; + if (W == 0) W = Fl::w(); + if (H == 0) H = Fl::h(); + + X += cx; + Y += cy; + + X = X - (X % image_->w()); + Y = Y - (Y % image_->h()); + + W += X; + H += Y; + + for (int yy = Y; yy < H; yy += image_->h()) + for (int xx = X; xx < W; xx += image_->w()) + image_->draw(xx, yy); +} + + +// +// End of "$Id: Fl_Tiled_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $". +// diff --git a/src/Fl_XBM_Image.cxx b/src/Fl_XBM_Image.cxx new file mode 100644 index 000000000..9eedcad2f --- /dev/null +++ b/src/Fl_XBM_Image.cxx @@ -0,0 +1,88 @@ +// +// "$Id: Fl_XBM_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $" +// +// Fl_XBM_Image routines. +// +// Copyright 1997-2001 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@fltk.org". +// +// Contents: +// +// + +// +// Include necessary header files... +// + +#include <FL/Fl.H> +#include <FL/Fl_XBM_Image.H> +#include "config.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +Fl_XBM_Image::Fl_XBM_Image(const char *name) : Fl_Bitmap((const char *)0,0,0) { + FILE *f; + uchar *data; + + if ((f = fopen(name, "rb")) == NULL) return; + + char buffer[1024]; + char junk[1024]; + int wh[2]; // width and height + int i; + for (i = 0; i<2; i++) { + for (;;) { + if (!fgets(buffer,1024,f)) return; + int r = sscanf(buffer,"#define %s %d",junk,&wh[i]); + if (r >= 2) break; + } + } + + // skip to data array: + for (;;) { + if (!fgets(buffer,1024,f)) return; + if (!strncmp(buffer,"static ",7)) break; + } + + // Allocate memory... + w(wh[0]); + h(wh[1]); + + int n = ((wh[0]+7)/8)*wh[1]; + array = new uchar[((w() + 7) / 8) * h()]; + + // read the data: + for (i = 0, data = (uchar *)array; i < n;) { + if (!fgets(buffer,1024,f)) return; + const char *a = buffer; + while (*a && i<n) { + int t; + if (sscanf(a," 0x%x",&t)>0) *data++ = t; + while (*a && *a++ != ','); + } + } + + fclose(f); +} + + +// +// End of "$Id: Fl_XBM_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $". +// diff --git a/src/Fl_XPM_Image.cxx b/src/Fl_XPM_Image.cxx new file mode 100644 index 000000000..d29429599 --- /dev/null +++ b/src/Fl_XPM_Image.cxx @@ -0,0 +1,129 @@ +// +// "$Id: Fl_XPM_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $" +// +// Fl_XPM_Image routines. +// +// Copyright 1997-2001 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@fltk.org". +// +// Contents: +// +// + +// +// Include necessary header files... +// + +#include <FL/Fl.H> +#include <FL/Fl_XPM_Image.H> +#include "config.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + + +// +// 'hexdigit()' - Convert a hex digit to an integer. +// + +static int hexdigit(int x) { // I - Hex digit... + if (isdigit(x)) return x-'0'; + if (isupper(x)) return x-'A'+10; + if (islower(x)) return x-'a'+10; + return 20; +} + +#define MAXSIZE 2048 +#define INITIALLINES 256 + +Fl_XPM_Image::Fl_XPM_Image(const char *name) : Fl_Pixmap((char *const*)0) { + FILE *f; + + if ((f = fopen(name, "rb")) == NULL) return; + + // read all the c-strings out of the file: + char** new_data = new char *[INITIALLINES]; + char** temp_data; + int malloc_size = INITIALLINES; + char buffer[MAXSIZE+20]; + int i = 0; + while (fgets(buffer,MAXSIZE+20,f)) { + if (buffer[0] != '\"') continue; + char *myp = buffer; + char *q = buffer+1; + while (*q != '\"' && myp < buffer+MAXSIZE) { + if (*q == '\\') switch (*++q) { + case '\r': + case '\n': + fgets(q,(buffer+MAXSIZE+20)-q,f); break; + case 0: + break; + case 'x': { + q++; + int n = 0; + for (int x = 0; x < 3; x++) { + int d = hexdigit(*q); + if (d > 15) break; + n = (n<<4)+d; + q++; + } + *myp++ = n; + } break; + default: { + int c = *q++; + if (c>='0' && c<='7') { + c -= '0'; + for (int x=0; x<2; x++) { + int d = hexdigit(*q); + if (d>7) break; + c = (c<<3)+d; + q++; + } + } + *myp++ = c; + } break; + } else { + *myp++ = *q++; + } + } + *myp++ = 0; + if (i >= malloc_size) { + temp_data = new char *[malloc_size + INITIALLINES]; + memcpy(temp_data, new_data, sizeof(char *) * malloc_size); + delete[] new_data; + new_data = temp_data; + malloc_size += INITIALLINES; + } + new_data[i] = new char[myp-buffer+1]; + memcpy(new_data[i], buffer,myp-buffer); + new_data[i][myp-buffer] = 0; + i++; + } + + fclose(f); + + data(new_data, i); + measure(); +} + + +// +// End of "$Id: Fl_XPM_Image.cxx,v 1.1.2.1 2001/11/24 18:07:57 easysw Exp $". +// diff --git a/src/Makefile b/src/Makefile index e72c809f0..6b7a920bb 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile,v 1.18.2.14.2.19 2001/11/24 02:46:19 easysw Exp $" +# "$Id: Makefile,v 1.18.2.14.2.20 2001/11/24 18:07:57 easysw Exp $" # # Library makefile for the Fast Light Tool Kit (FLTK). # @@ -68,6 +68,7 @@ CPPFILES = \ Fl_Pack.cxx \ Fl_Pixmap.cxx \ Fl_PNG_Image.cxx \ + Fl_PNM_Image.cxx \ Fl_Positioner.cxx \ Fl_Progress.cxx \ Fl_Repeat_Button.cxx \ @@ -84,6 +85,7 @@ CPPFILES = \ Fl_Text_Display.cxx \ Fl_Text_Editor.cxx \ Fl_Tile.cxx \ + Fl_Tiled_Image.cxx \ Fl_Tooltip.cxx \ Fl_Valuator.cxx \ Fl_Value_Input.cxx \ @@ -95,6 +97,8 @@ CPPFILES = \ Fl_Window_hotspot.cxx \ Fl_Window_iconize.cxx \ Fl_Wizard.cxx \ + Fl_XBM_Image.cxx \ + Fl_XPM_Image.cxx \ Fl_abort.cxx \ Fl_add_idle.cxx \ Fl_arg.cxx \ @@ -280,5 +284,5 @@ uninstall: # -# End of "$Id: Makefile,v 1.18.2.14.2.19 2001/11/24 02:46:19 easysw Exp $". +# End of "$Id: Makefile,v 1.18.2.14.2.20 2001/11/24 18:07:57 easysw Exp $". # diff --git a/src/makedepend b/src/makedepend index e37cd9c11..e3ce1c961 100644 --- a/src/makedepend +++ b/src/makedepend @@ -207,6 +207,9 @@ Fl_Text_Editor.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H Fl_Text_Editor.o: ../FL/Fl_Text_Buffer.H Fl_Tile.o: ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Tile.H Fl_Tile.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Window.H +Fl_Tiled_Image.o: ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H +Fl_Tiled_Image.o: ../FL/Fl_Tiled_Image.H ../FL/Fl_Image.H ../FL/x.H +Fl_Tiled_Image.o: ../FL/Fl_Window.H Fl_Tooltip.o: ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H Fl_Tooltip.o: ../FL/Fl_Menu_Window.H ../FL/Fl_Single_Window.H Fl_Tooltip.o: ../FL/Fl_Window.H ../FL/Fl_Box.H ../FL/Fl_Widget.H |
