1998-10-20 00:46:58 +04:00
|
|
|
//
|
2001-11-22 18:35:02 +03:00
|
|
|
// "$Id: Fl_Pixmap.cxx,v 1.9.2.4.2.7 2001/11/22 15:35:01 easysw Exp $"
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
|
|
|
// Pixmap drawing code for the Fast Light Tool Kit (FLTK).
|
|
|
|
//
|
2001-01-22 18:13:41 +03:00
|
|
|
// Copyright 1998-2001 by Bill Spitzak and others.
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
//
|
2000-06-06 01:21:24 +04:00
|
|
|
// Please report all bugs and problems to "fltk-bugs@fltk.org".
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
1998-10-06 22:21:25 +04:00
|
|
|
|
|
|
|
// Draws X pixmap data, keeping it stashed in a server pixmap so it
|
|
|
|
// redraws fast.
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
// See fl_draw_pixmap.cxx for code used to get the actual data into pixmap.
|
1998-10-06 22:21:25 +04:00
|
|
|
// Implemented without using the xpm library (which I can't use because
|
|
|
|
// it interferes with the color cube used by fl_draw_image).
|
|
|
|
|
|
|
|
#include <FL/Fl.H>
|
|
|
|
#include <FL/fl_draw.H>
|
|
|
|
#include <FL/x.H>
|
|
|
|
#include <FL/Fl_Widget.H>
|
|
|
|
#include <FL/Fl_Menu_Item.H>
|
|
|
|
#include <FL/Fl_Pixmap.H>
|
|
|
|
|
1998-12-15 18:42:35 +03:00
|
|
|
#include <stdio.h>
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
#include <string.h>
|
|
|
|
#include <ctype.h>
|
1998-12-15 18:42:35 +03:00
|
|
|
|
2001-11-18 23:52:28 +03:00
|
|
|
extern uchar **fl_mask_bitmap; // used by fl_draw_pixmap.cxx to store mask
|
|
|
|
void fl_restore_clip(); // in fl_rect.cxx
|
1998-10-06 22:21:25 +04:00
|
|
|
|
2001-08-06 03:58:54 +04:00
|
|
|
void Fl_Pixmap::measure() {
|
|
|
|
int W, H;
|
|
|
|
|
|
|
|
// ignore empty or bad pixmap data:
|
2001-11-22 18:35:02 +03:00
|
|
|
if (w()<0 && data()) {
|
|
|
|
fl_measure_pixmap(data(), W, H);
|
2001-08-06 03:58:54 +04:00
|
|
|
w(W); h(H);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-10-15 18:06:16 +04:00
|
|
|
void Fl_Pixmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
|
|
|
|
// ignore empty or bad pixmap data:
|
2001-11-22 18:35:02 +03:00
|
|
|
if (!data()) return;
|
|
|
|
if (w()<0) measure();
|
|
|
|
if (WP==-1) {
|
|
|
|
WP = w();
|
|
|
|
HP = h();
|
1998-12-03 16:28:21 +03:00
|
|
|
}
|
2001-08-06 03:58:54 +04:00
|
|
|
if (!w()) return;
|
1998-10-15 18:06:16 +04:00
|
|
|
// 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;
|
1998-10-06 22:21:25 +04:00
|
|
|
// clip the box down to the size of image, quit if empty:
|
|
|
|
if (cx < 0) {W += cx; X -= cx; cx = 0;}
|
2001-08-06 03:58:54 +04:00
|
|
|
if (cx+W > w()) W = w()-cx;
|
1998-10-06 22:21:25 +04:00
|
|
|
if (W <= 0) return;
|
|
|
|
if (cy < 0) {H += cy; Y -= cy; cy = 0;}
|
2001-08-06 03:58:54 +04:00
|
|
|
if (cy+H > h()) H = h()-cy;
|
1998-10-06 22:21:25 +04:00
|
|
|
if (H <= 0) return;
|
|
|
|
if (!id) {
|
2001-11-18 23:52:28 +03:00
|
|
|
id = fl_create_offscreen(w(), h());
|
|
|
|
fl_begin_offscreen(id);
|
1998-10-06 22:21:25 +04:00
|
|
|
uchar *bitmap = 0;
|
|
|
|
fl_mask_bitmap = &bitmap;
|
2001-11-22 18:35:02 +03:00
|
|
|
fl_draw_pixmap(data(), 0, 0, FL_BLACK);
|
1998-10-06 22:21:25 +04:00
|
|
|
fl_mask_bitmap = 0;
|
1998-12-06 18:12:23 +03:00
|
|
|
if (bitmap) {
|
2001-11-18 23:52:28 +03:00
|
|
|
mask = fl_create_bitmask(w(), h(), bitmap);
|
1998-10-06 22:21:25 +04:00
|
|
|
delete[] bitmap;
|
|
|
|
}
|
2001-11-18 23:52:28 +03:00
|
|
|
|
1998-10-06 22:21:25 +04:00
|
|
|
fl_end_offscreen();
|
|
|
|
}
|
1998-12-06 18:12:23 +03:00
|
|
|
#ifdef WIN32
|
|
|
|
if (mask) {
|
|
|
|
HDC new_gc = CreateCompatibleDC(fl_gc);
|
|
|
|
SelectObject(new_gc, (void*)mask);
|
|
|
|
BitBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, SRCAND);
|
|
|
|
SelectObject(new_gc, (void*)id);
|
|
|
|
BitBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, SRCPAINT);
|
|
|
|
DeleteDC(new_gc);
|
|
|
|
} else {
|
|
|
|
fl_copy_offscreen(X, Y, W, H, (Fl_Offscreen)id, cx, cy);
|
|
|
|
}
|
|
|
|
#else
|
1998-10-06 22:21:25 +04:00
|
|
|
if (mask) {
|
|
|
|
// I can't figure out how to combine a mask with existing region,
|
|
|
|
// so cut the image down to a clipped rectangle:
|
|
|
|
int nx, ny; fl_clip_box(X,Y,W,H,nx,ny,W,H);
|
|
|
|
cx += nx-X; X = nx;
|
|
|
|
cy += ny-Y; Y = ny;
|
|
|
|
// make X use the bitmap as a mask:
|
|
|
|
XSetClipMask(fl_display, fl_gc, mask);
|
2001-08-06 03:58:54 +04:00
|
|
|
int ox = X-cx; if (ox < 0) ox += w();
|
|
|
|
int oy = Y-cy; if (oy < 0) oy += h();
|
1998-10-06 22:21:25 +04:00
|
|
|
XSetClipOrigin(fl_display, fl_gc, X-cx, Y-cy);
|
|
|
|
}
|
|
|
|
fl_copy_offscreen(X, Y, W, H, (Fl_Offscreen)id, cx, cy);
|
|
|
|
if (mask) {
|
|
|
|
// put the old clip region back
|
|
|
|
XSetClipOrigin(fl_display, fl_gc, 0, 0);
|
|
|
|
fl_restore_clip();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
Fl_Pixmap::~Fl_Pixmap() {
|
2001-11-18 23:52:28 +03:00
|
|
|
if (id) fl_delete_offscreen(id);
|
|
|
|
if (mask) fl_delete_bitmask(mask);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
delete_data();
|
1998-10-06 22:21:25 +04:00
|
|
|
}
|
|
|
|
|
2001-08-06 03:58:54 +04:00
|
|
|
void Fl_Pixmap::label(Fl_Widget* w) {
|
|
|
|
w->image(this);
|
1998-10-06 22:21:25 +04:00
|
|
|
}
|
|
|
|
|
2001-08-06 03:58:54 +04:00
|
|
|
void Fl_Pixmap::label(Fl_Menu_Item* m) {
|
1998-10-06 22:21:25 +04:00
|
|
|
}
|
1998-10-20 00:46:58 +04:00
|
|
|
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
void Fl_Pixmap::copy_data() {
|
|
|
|
if (alloc_data) return;
|
|
|
|
|
|
|
|
char **new_data, // New data array
|
|
|
|
**new_row; // Current row in image
|
|
|
|
int i, // Looping var
|
|
|
|
ncolors, // Number of colors in image
|
|
|
|
chars_per_pixel,// Characters per color
|
|
|
|
chars_per_line; // Characters per line
|
|
|
|
|
|
|
|
// Figure out how many colors there are, and how big they are...
|
2001-11-22 18:35:02 +03:00
|
|
|
sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
chars_per_line = chars_per_pixel * w() + 1;
|
|
|
|
|
|
|
|
// Allocate memory for the new array...
|
2001-11-20 08:13:23 +03:00
|
|
|
if (ncolors < 0) new_data = new char *[h() + 2];
|
|
|
|
else new_data = new char *[h() + ncolors + 1];
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
new_data[0] = new char[strlen(data()[0]) + 1];
|
|
|
|
strcpy(new_data[0], data()[0]);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
|
|
|
|
// Copy colors...
|
|
|
|
if (ncolors < 0) {
|
|
|
|
// Copy FLTK colormap values...
|
|
|
|
ncolors = -ncolors;
|
2001-11-20 08:13:23 +03:00
|
|
|
new_row = new_data + 1;
|
|
|
|
*new_row = new char[ncolors * 4];
|
2001-11-22 18:35:02 +03:00
|
|
|
memcpy(*new_row, data()[1], ncolors * 4);
|
2001-11-20 08:13:23 +03:00
|
|
|
ncolors = 1;
|
|
|
|
new_row ++;
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
} else {
|
|
|
|
// Copy standard XPM colormap values...
|
|
|
|
for (i = 0, new_row = new_data + 1; i < ncolors; i ++, new_row ++) {
|
2001-11-22 18:35:02 +03:00
|
|
|
*new_row = new char[strlen(data()[i + 1]) + 1];
|
|
|
|
strcpy(*new_row, data()[i + 1]);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copy image data...
|
|
|
|
for (i = 0; i < h(); i ++, new_row ++) {
|
|
|
|
*new_row = new char[chars_per_line];
|
2001-11-22 18:35:02 +03:00
|
|
|
memcpy(*new_row, data()[i + ncolors + 1], chars_per_line);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Update pointers...
|
2001-11-22 18:35:02 +03:00
|
|
|
data(new_data, h() + ncolors + 1);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
alloc_data = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
Fl_Image *Fl_Pixmap::copy(int W, int H) {
|
|
|
|
// Optimize the simple copy where the width and height are the same...
|
2001-11-22 18:35:02 +03:00
|
|
|
if (W == w() && H == h()) return new Fl_Pixmap(data());
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
|
|
|
|
// OK, need to resize the image data; allocate memory and
|
|
|
|
Fl_Pixmap *new_image; // New pixmap
|
|
|
|
char **new_data, // New array for image data
|
|
|
|
**new_row, // Pointer to row in image data
|
|
|
|
*new_ptr, // Pointer into new array
|
|
|
|
new_info[255]; // New information line
|
|
|
|
const char *old_ptr; // Pointer into old array
|
|
|
|
int i, // Looping var
|
|
|
|
c, // Channel number
|
|
|
|
sy, // Source coordinate
|
|
|
|
dx, dy, // Destination coordinates
|
|
|
|
xerr, yerr, // X & Y errors
|
|
|
|
xmod, ymod, // X & Y moduli
|
|
|
|
xstep, ystep; // X & Y step increments
|
|
|
|
int ncolors, // Number of colors in image
|
|
|
|
chars_per_pixel,// Characters per color
|
|
|
|
chars_per_line; // Characters per line
|
|
|
|
|
|
|
|
// Figure out how many colors there are, and how big they are...
|
2001-11-22 18:35:02 +03:00
|
|
|
sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
chars_per_line = chars_per_pixel * W + 1;
|
|
|
|
|
|
|
|
sprintf(new_info, "%d %d %d %d", W, H, ncolors, chars_per_pixel);
|
|
|
|
|
|
|
|
// Figure out Bresenheim step/modulus values...
|
|
|
|
xmod = w() % W;
|
|
|
|
xstep = (w() / W) * chars_per_pixel;
|
|
|
|
ymod = h() % H;
|
|
|
|
ystep = h() / H;
|
|
|
|
|
|
|
|
// Allocate memory for the new array...
|
2001-11-20 08:13:23 +03:00
|
|
|
if (ncolors < 0) new_data = new char *[H + 2];
|
|
|
|
else new_data = new char *[H + ncolors + 1];
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
new_data[0] = new char[strlen(new_info) + 1];
|
|
|
|
strcpy(new_data[0], new_info);
|
|
|
|
|
|
|
|
// Copy colors...
|
|
|
|
if (ncolors < 0) {
|
|
|
|
// Copy FLTK colormap values...
|
|
|
|
ncolors = -ncolors;
|
2001-11-20 08:13:23 +03:00
|
|
|
new_row = new_data + 1;
|
|
|
|
*new_row = new char[ncolors * 4];
|
2001-11-22 18:35:02 +03:00
|
|
|
memcpy(*new_row, data()[1], ncolors * 4);
|
2001-11-20 08:13:23 +03:00
|
|
|
ncolors = 1;
|
|
|
|
new_row ++;
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
} else {
|
|
|
|
// Copy standard XPM colormap values...
|
|
|
|
for (i = 0, new_row = new_data + 1; i < ncolors; i ++, new_row ++) {
|
2001-11-22 18:35:02 +03:00
|
|
|
*new_row = new char[strlen(data()[i + 1]) + 1];
|
|
|
|
strcpy(*new_row, data()[i + 1]);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copy image data...
|
|
|
|
for (i = 0; i < h(); i ++, new_row ++) {
|
|
|
|
*new_row = new char[chars_per_line];
|
2001-11-22 18:35:02 +03:00
|
|
|
memcpy(*new_row, data()[i + ncolors + 1], chars_per_line);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
// Scale the image using a nearest-neighbor algorithm...
|
|
|
|
for (dy = h(), sy = 0, yerr = H / 2; dy > 0; dy --, new_row ++) {
|
|
|
|
*new_row = new char[chars_per_line];
|
|
|
|
new_ptr = *new_row;
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
for (dx = w(), xerr = W / 2, old_ptr = data()[sy + ncolors + 1];
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
dx > 0;
|
|
|
|
dx --) {
|
|
|
|
for (c = 0; c < chars_per_pixel; c ++) *new_ptr++ = old_ptr[c];
|
|
|
|
|
|
|
|
old_ptr += xstep;
|
|
|
|
xerr -= xmod;
|
|
|
|
|
|
|
|
if (xerr <= 0) {
|
|
|
|
xerr += W;
|
|
|
|
old_ptr += chars_per_pixel;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*new_ptr = '\0';
|
|
|
|
sy += ystep;
|
|
|
|
yerr -= ymod;
|
|
|
|
if (yerr <= 0) {
|
|
|
|
yerr += H;
|
|
|
|
sy ++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
new_image = new Fl_Pixmap(new_data);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
new_image->alloc_data = 1;
|
|
|
|
|
|
|
|
return new_image;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Fl_Pixmap::color_average(Fl_Color c, float i) {
|
|
|
|
// Delete any existing pixmap/mask objects...
|
|
|
|
if (id) {
|
|
|
|
fl_delete_offscreen(id);
|
|
|
|
id = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mask) {
|
|
|
|
fl_delete_bitmask(mask);
|
|
|
|
mask = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Allocate memory as needed...
|
|
|
|
copy_data();
|
|
|
|
|
|
|
|
// Get the color to blend with...
|
|
|
|
uchar r, g, b;
|
|
|
|
unsigned ia, ir, ig, ib;
|
|
|
|
|
|
|
|
Fl::get_color(c, r, g, b);
|
|
|
|
if (i < 0.0f) i = 0.0f;
|
|
|
|
else if (i > 1.0f) i = 1.0f;
|
|
|
|
|
|
|
|
ia = (unsigned)(256 * i);
|
|
|
|
ir = r * (256 - ia);
|
|
|
|
ig = g * (256 - ia);
|
|
|
|
ib = b * (256 - ia);
|
|
|
|
|
|
|
|
// Update the colormap to do the blend...
|
|
|
|
char line[255]; // New colormap line
|
|
|
|
int color, // Looping var
|
|
|
|
ncolors, // Number of colors in image
|
|
|
|
chars_per_pixel;// Characters per color
|
|
|
|
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
|
|
|
|
if (ncolors < 0) {
|
|
|
|
// Update FLTK colormap...
|
|
|
|
ncolors = -ncolors;
|
2001-11-22 18:35:02 +03:00
|
|
|
uchar *cmap = (uchar *)(data()[1]);
|
2001-11-20 08:13:23 +03:00
|
|
|
for (color = 0; color < ncolors; color ++, cmap += 4) {
|
|
|
|
cmap[1] = (ia * cmap[1] + ir) >> 8;
|
|
|
|
cmap[2] = (ia * cmap[2] + ig) >> 8;
|
|
|
|
cmap[3] = (ia * cmap[3] + ib) >> 8;
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Update standard XPM colormap...
|
|
|
|
for (color = 0; color < ncolors; color ++) {
|
|
|
|
// look for "c word", or last word if none:
|
2001-11-22 18:35:02 +03:00
|
|
|
const char *p = data()[color + 1] + chars_per_pixel + 1;
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
const char *previous_word = p;
|
|
|
|
for (;;) {
|
|
|
|
while (*p && isspace(*p)) p++;
|
|
|
|
char what = *p++;
|
|
|
|
while (*p && !isspace(*p)) p++;
|
|
|
|
while (*p && isspace(*p)) p++;
|
|
|
|
if (!*p) {p = previous_word; break;}
|
|
|
|
if (what == 'c') break;
|
|
|
|
previous_word = p;
|
|
|
|
while (*p && !isspace(*p)) p++;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef WIN32
|
2001-11-19 23:59:59 +03:00
|
|
|
if (fl_parse_color(p, r, g, b)) {
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
#else
|
|
|
|
XColor x;
|
|
|
|
if (XParseColor(fl_display, fl_colormap, p, &x)) {
|
|
|
|
r = x.red>>8;
|
|
|
|
g = x.green>>8;
|
|
|
|
b = x.blue>>8;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
r = (ia * r + ir) >> 8;
|
|
|
|
g = (ia * g + ig) >> 8;
|
|
|
|
b = (ia * b + ib) >> 8;
|
|
|
|
|
|
|
|
if (chars_per_pixel > 1) sprintf(line, "%c%c c #%02X%02X%02X",
|
2001-11-22 18:35:02 +03:00
|
|
|
data()[color + 1][0],
|
|
|
|
data()[color + 1][1], r, g, b);
|
|
|
|
else sprintf(line, "%c c #%02X%02X%02X", data()[color + 1][0], r, g, b);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
delete[] (char *)data()[color + 1];
|
|
|
|
((char **)data())[color + 1] = new char[strlen(line) + 1];
|
|
|
|
strcpy((char *)data()[color + 1], line);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Fl_Pixmap::delete_data() {
|
|
|
|
if (alloc_data) {
|
2001-11-22 18:35:02 +03:00
|
|
|
for (int i = 0; i < count(); i ++) delete[] (char *)data()[i];
|
|
|
|
delete[] (char **)data();
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
void Fl_Pixmap::set_data(const char * const * p) {
|
|
|
|
int height, // Number of lines in image
|
|
|
|
ncolors; // Number of colors in image
|
|
|
|
|
|
|
|
if (p) {
|
|
|
|
sscanf(p[0],"%*d%d%d", &height, &ncolors);
|
|
|
|
if (ncolors < 0) data(p, height + 2);
|
|
|
|
else data(p, height + ncolors + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
void Fl_Pixmap::desaturate() {
|
|
|
|
// Delete any existing pixmap/mask objects...
|
|
|
|
if (id) {
|
|
|
|
fl_delete_offscreen(id);
|
|
|
|
id = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mask) {
|
|
|
|
fl_delete_bitmask(mask);
|
|
|
|
mask = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Allocate memory as needed...
|
|
|
|
copy_data();
|
|
|
|
|
|
|
|
// Update the colormap to grayscale...
|
|
|
|
char line[255]; // New colormap line
|
|
|
|
int i, // Looping var
|
|
|
|
ncolors, // Number of colors in image
|
|
|
|
chars_per_pixel;// Characters per color
|
|
|
|
uchar r, g, b;
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
|
|
|
|
if (ncolors < 0) {
|
|
|
|
// Update FLTK colormap...
|
|
|
|
ncolors = -ncolors;
|
2001-11-22 18:35:02 +03:00
|
|
|
uchar *cmap = (uchar *)(data()[1]);
|
2001-11-20 08:13:23 +03:00
|
|
|
for (i = 0; i < ncolors; i ++, cmap += 4) {
|
|
|
|
g = (cmap[1] * 31 + cmap[2] * 61 + cmap[3] * 8) / 100;
|
|
|
|
cmap[1] = cmap[2] = cmap[3] = g;
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Update standard XPM colormap...
|
|
|
|
for (i = 0; i < ncolors; i ++) {
|
|
|
|
// look for "c word", or last word if none:
|
2001-11-22 18:35:02 +03:00
|
|
|
const char *p = data()[i + 1] + chars_per_pixel + 1;
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
const char *previous_word = p;
|
|
|
|
for (;;) {
|
|
|
|
while (*p && isspace(*p)) p++;
|
|
|
|
char what = *p++;
|
|
|
|
while (*p && !isspace(*p)) p++;
|
|
|
|
while (*p && isspace(*p)) p++;
|
|
|
|
if (!*p) {p = previous_word; break;}
|
|
|
|
if (what == 'c') break;
|
|
|
|
previous_word = p;
|
|
|
|
while (*p && !isspace(*p)) p++;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef WIN32
|
2001-11-19 23:59:59 +03:00
|
|
|
if (fl_parse_color(p, r, g, b)) {
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
#else
|
|
|
|
XColor x;
|
|
|
|
if (XParseColor(fl_display, fl_colormap, p, &x)) {
|
|
|
|
r = x.red>>8;
|
|
|
|
g = x.green>>8;
|
|
|
|
b = x.blue>>8;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
g = (r * 31 + g * 61 + b * 8) / 100;
|
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
if (chars_per_pixel > 1) sprintf(line, "%c%c c #%02X%02X%02X", data()[i + 1][0],
|
|
|
|
data()[i + 1][1], g, g, g);
|
|
|
|
else sprintf(line, "%c c #%02X%02X%02X", data()[i + 1][0], g, g, g);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
|
2001-11-22 18:35:02 +03:00
|
|
|
delete[] (char *)data()[i + 1];
|
|
|
|
((char **)data())[i + 1] = new char[strlen(line) + 1];
|
|
|
|
strcpy((char *)data()[i + 1], line);
|
OK, lots of changes to the Fl_Image, Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image
classes: new copy(), copy(w,h), desaturate(), color_average(), and
inactive() methods, alloc_xyz member for copied data, etc.
Updated test programs to use inactive() and copy() methods to create
inactive images for the test buttons, plus the inactive button to toggle
it...
Added start of separate image classes, a la 2.0, for various image formats.
FLUID will also be updated for it...
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1703 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2001-11-19 04:06:45 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|
2001-11-22 18:35:02 +03:00
|
|
|
// End of "$Id: Fl_Pixmap.cxx,v 1.9.2.4.2.7 2001/11/22 15:35:01 easysw Exp $".
|
1998-10-20 00:46:58 +04:00
|
|
|
//
|