1 /*
2  * bltImage.h --
3  *
4  * Copyright 1993-1998 Lucent Technologies, Inc.
5  *
6  * Permission to use, copy, modify, and distribute this software and
7  * its documentation for any purpose and without fee is hereby
8  * granted, provided that the above copyright notice appear in all
9  * copies and that both that the copyright notice and warranty
10  * disclaimer appear in supporting documentation, and that the names
11  * of Lucent Technologies any of their entities not be used in
12  * advertising or publicity pertaining to distribution of the software
13  * without specific, written prior permission.
14  *
15  * Lucent Technologies disclaims all warranties with regard to this
16  * software, including all implied warranties of merchantability and
17  * fitness.  In no event shall Lucent Technologies be liable for any
18  * special, indirect or consequential damages or any damages
19  * whatsoever resulting from loss of use, data or profits, whether in
20  * an action of contract, negligence or other tortuous action, arising
21  * out of or in connection with the use or performance of this
22  * software.
23  */
24 
25 #include <X11/Xutil.h>
26 #ifndef WIN32
27 #include <X11/Xproto.h>
28 #endif
29 
30 #ifndef _BLT_IMAGE_H
31 #define _BLT_IMAGE_H
32 
33 #define DIV255(i) ((((i) + 1) + (((i) + 1) >> 8) ) >> 8)
34 
35 #define GAMMA	(1.0)
36 
37 #define ROTATE_0	0
38 #define ROTATE_90	1
39 #define ROTATE_180	2
40 #define ROTATE_270	3
41 
42 /*
43  *----------------------------------------------------------------------
44  *
45  * Pix32 --
46  *
47  *      A union representing either a pixel as a RGB triplet or a
48  *	single word value.
49  *
50  *----------------------------------------------------------------------
51  */
52 typedef union {
53     unsigned int value;		/* Lookup table address */
54     struct RGBA {
55 	unsigned char red;	/* Red intensity 0..255 */
56 	unsigned char green;	/* Green intensity 0.255 */
57 	unsigned char blue;	/* Blue intensity 0..255 */
58 	unsigned char alpha;	/* Alpha-channel for compositing. 0..255 */
59     } rgba;
60     unsigned char channel[4];
61 } Pix32;
62 
63 #define Red	rgba.red
64 #define Blue	rgba.blue
65 #define Green	rgba.green
66 #define Alpha	rgba.alpha
67 
68 
69 typedef struct {
70     XColor exact, best;
71     double error;
72     unsigned int freq;
73     int allocated;
74     int index;
75 } ColorInfo;
76 
77 /*
78  *----------------------------------------------------------------------
79  *
80  * ColorTable --
81  *
82  *	For colormap-ed visuals, this structure contains color lookup
83  *	information needed to translate RGB triplets to pixel indices.
84  *
85  *	This structure isn't needed for TrueColor or Monochrome visuals.
86  *
87  *	DirectColor:
88  *		Pixel values for each color channel
89  *	StaticColor, PsuedoColor, StaticGray, and GrayScale:
90  *		Red represents the 8-bit color. Green and Blue pixel
91  *		values are unused.
92  *
93  *----------------------------------------------------------------------
94  */
95 typedef struct ColorTableStruct {
96     double outputGamma;		/* Gamma correction value */
97     Display *display;		/* Display of colortable. Used to free
98 				 * colors allocated. */
99     XVisualInfo visualInfo;	/* Visual information for window displaying
100 				 * the image. */
101     Colormap colorMap;		/* Colormap used.  This may be the default
102 				 * colormap, or an allocated private map. */
103     int flags;
104     unsigned int red[256], green[256], blue[256];
105 
106     /* Array of allocated pixels in colormap */
107     ColorInfo colorInfo[256];
108     ColorInfo *sortedColors[256];
109 
110     int nUsedColors, nFreeColors;
111     int nPixels;		/* Number of colors in the quantized image */
112     unsigned long int pixelValues[256];
113 
114     unsigned int *lut;		/* Color lookup table. Used to collect
115 				 * frequencies of colors and later
116 				 * colormap indices */
117 } *ColorTable;
118 
119 #define PRIVATE_COLORMAP	1
120 #define RGBIndex(r,g,b) (((r)<<10) + ((r)<<6) + (r) + ((g) << 5) + (g) + (b))
121 
122 /*
123  *----------------------------------------------------------------------
124  *
125  * Blt_ColorImage --
126  *
127  *      The structure below represents a color image.  Each pixel
128  *	occupies a 32-bit word of memory: one byte for each of the
129  *	red, green, and blue color intensities, and another for
130  *	alpha-channel image compositing (e.g. transparency).
131  *
132  *----------------------------------------------------------------------
133  */
134 typedef struct ColorImage {
135     int width, height;		/* Dimensions of the image */
136     Pix32 *bits;		/* Array of pixels representing the image. */
137 } *Blt_ColorImage;
138 
139 /*
140  * Blt_ColorImage is supposed to be an opaque type.
141  * Use the macros below to access its members.
142  */
143 #define Blt_ColorImageHeight(c)	((c)->height)
144 #define Blt_ColorImageWidth(c)	((c)->width)
145 #define Blt_ColorImageBits(c)	((c)->bits)
146 #define Blt_ColorImagePixel(c, x, y) ((c)->bits + ((c)->width * (y)) + (x))
147 
148 /*
149  *----------------------------------------------------------------------
150  *
151  * ResampleFilterProc --
152  *
153  *      A function implementing a 1-D filter.
154  *
155  *----------------------------------------------------------------------
156  */
157 typedef double (ResampleFilterProc) _ANSI_ARGS_((double value));
158 
159 /*
160  *----------------------------------------------------------------------
161  *
162  * ResampleFilter --
163  *
164  *      Contains information about a 1-D filter (its support and
165  *	the procedure implementing the filter).
166  *
167  *----------------------------------------------------------------------
168  */
169 typedef struct {
170     char *name;			/* Name of the filter */
171     ResampleFilterProc *proc;	/* 1-D filter procedure. */
172     double support;		/* Width of 1-D filter */
173 } ResampleFilter;
174 
175 extern ResampleFilter *bltBoxFilterPtr; /* The ubiquitous box filter */
176 
177 
178 /*
179  *----------------------------------------------------------------------
180  *
181  * Filter2D --
182  *
183  *      Defines a convolution mask for a 2-D filter.  Used to smooth or
184  *	enhance images.
185  *
186  *----------------------------------------------------------------------
187  */
188 typedef struct {
189     double support;		/* Radius of filter */
190     double sum, scale;		/* Sum of kernel */
191     double *kernel;		/* Array of values (malloc-ed) representing
192 				 * the discrete 2-D filter. */
193 } Filter2D;
194 
195 /* Prototypes of image routines */
196 
197 extern void Blt_ColorImageToGreyscale _ANSI_ARGS_((Blt_ColorImage image));
198 
199 extern void Blt_ColorImageToPhoto _ANSI_ARGS_((Blt_ColorImage image,
200 	Tk_PhotoHandle photo));
201 
202 extern Pixmap Blt_ColorImageToPixmap _ANSI_ARGS_((Tcl_Interp *interp,
203 	Tk_Window tkwin, Blt_ColorImage image, ColorTable *colorTablePtr));
204 
205 extern Blt_ColorImage Blt_ConvolveColorImage _ANSI_ARGS_((
206 	Blt_ColorImage srcImage, Filter2D *filter));
207 
208 extern Blt_ColorImage Blt_CreateColorImage _ANSI_ARGS_((int width,int height));
209 
210 extern Blt_ColorImage Blt_DrawableToColorImage _ANSI_ARGS_((Tk_Window tkwin,
211 	Drawable drawable, int x, int y, int width, int height,
212 	double inputGamma));
213 
214 extern int Blt_GetResampleFilter _ANSI_ARGS_((Tcl_Interp *interp,
215 	char *filterName, ResampleFilter **filterPtrPtr));
216 
217 extern void Blt_FreeColorImage _ANSI_ARGS_((Blt_ColorImage image));
218 
219 #if HAVE_JPEG
220 extern Blt_ColorImage Blt_JPEGToColorImage _ANSI_ARGS_((Tcl_Interp *interp,
221 	char *fileName));
222 #endif
223 
224 extern Blt_ColorImage Blt_PhotoToColorImage _ANSI_ARGS_((
225 	Tk_PhotoHandle photo));
226 
227 extern Blt_ColorImage Blt_PhotoRegionToColorImage _ANSI_ARGS_((
228 	Tk_PhotoHandle photo, int x, int y, int width, int height));
229 
230 extern int Blt_TransColorImage _ANSI_ARGS_((Blt_ColorImage src,
231         Blt_ColorImage dest, Pix32 *color, int alpha, int flags));
232 
233 extern int Blt_RecolorImage _ANSI_ARGS_((Blt_ColorImage src,
234         Blt_ColorImage dest, Pix32 *oldColor,  Pix32 *newColor, int alpha));
235 
236 extern int Blt_MergeColorImage _ANSI_ARGS_((Blt_ColorImage src,
237         Blt_ColorImage src2,
238         Blt_ColorImage dest, double opacity,  double opacity2, Pix32 *withColor));
239 
240 int Blt_ImageMergeInner  _ANSI_ARGS_((Tcl_Interp *interp, char *srcName, char *src2Name,
241     char * destName, XColor *maskColor, int leaveMsg));
242 
243 extern int Blt_QuantizeColorImage _ANSI_ARGS_((Blt_ColorImage src,
244         Blt_ColorImage dest, int nColors));
245 
246 extern Blt_ColorImage Blt_ResampleColorImage _ANSI_ARGS_((Blt_ColorImage image,
247 	int destWidth, int destHeight, ResampleFilter *horzFilterPtr,
248 	ResampleFilter *vertFilterPtr));
249 
250 extern void Blt_ResamplePhoto _ANSI_ARGS_((Tk_PhotoHandle srcPhoto,
251 	int x, int y, int width, int height, Tk_PhotoHandle destPhoto,
252 	ResampleFilter *horzFilterPtr, ResampleFilter *vertFilterPtr));
253 
254 
255 extern int Blt_BlurColorImage _ANSI_ARGS_((
256         Tk_PhotoHandle srcPhoto, Tk_PhotoHandle dstPhoto, int radius));
257 
258 extern Blt_ColorImage Blt_ResizeColorImage _ANSI_ARGS_((Blt_ColorImage src,
259 	int x, int y, int width, int height, int destWidth, int destHeight));
260 
261 extern Blt_ColorImage Blt_ResizeColorSubimage _ANSI_ARGS_((Blt_ColorImage src,
262 	int x, int y, int width, int height, int destWidth, int destHeight));
263 
264 extern Blt_ColorImage Blt_RotateColorImage _ANSI_ARGS_((Blt_ColorImage image,
265 	double theta));
266 
267 extern void Blt_ResizePhoto _ANSI_ARGS_((Tk_PhotoHandle srcPhoto, int x, int y,
268 	int width, int height, Tk_PhotoHandle destPhoto));
269 
270 extern int Blt_SnapPhoto _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin,
271 	Drawable drawable, int x, int y, int width, int height, int destWidth,
272 	int destHeight, char *photoName, double inputGamma));
273 
274 extern void Blt_ImageRegion _ANSI_ARGS_((Blt_ColorImage image,
275 	Region2D *regionPtr));
276 
277 Blt_ColorImage Blt_CopyColorImage _ANSI_ARGS_(( Blt_ColorImage src));
278 
279 extern Region2D *Blt_ColorImageRegion _ANSI_ARGS_((Blt_ColorImage image,
280 	Region2D *regionPtr));
281 
282 extern Region2D *Blt_SetRegion _ANSI_ARGS_((int x, int y, int width,
283 	int height, Region2D *regionPtr));
284 
285 extern ColorTable Blt_CreateColorTable _ANSI_ARGS_((Tk_Window tkwin));
286 
287 extern ColorTable Blt_DirectColorTable _ANSI_ARGS_((Tcl_Interp *interp,
288 	Tk_Window tkwin, Blt_ColorImage image));
289 
290 extern ColorTable Blt_PseudoColorTable _ANSI_ARGS_((Tcl_Interp *interp,
291 	Tk_Window tkwin, Blt_ColorImage image));
292 
293 extern void Blt_FreeColorTable _ANSI_ARGS_((ColorTable colorTable));
294 
295 /* Missing routines from the Tk photo C API */
296 
297 extern int Tk_ImageIsDeleted _ANSI_ARGS_((Tk_Image tkImage));
298 extern Tk_ImageMaster Tk_ImageGetMaster _ANSI_ARGS_((Tk_Image tkImage));
299 extern Tk_ImageType *Tk_ImageGetType _ANSI_ARGS_((Tk_Image tkImage));
300 extern Pixmap Tk_ImageGetPhotoPixmap _ANSI_ARGS_((Tk_Image photoImage));
301 extern GC Tk_ImageGetPhotoGC _ANSI_ARGS_((Tk_Image photoImage));
302 
303 extern char *Blt_NameOfImage _ANSI_ARGS_((Tk_Image tkImage));
304 extern Tk_Image Blt_CreateTemporaryImage _ANSI_ARGS_((Tcl_Interp *interp,
305 	Tk_Window tkwin, ClientData clientData));
306 extern int Blt_DestroyTemporaryImage _ANSI_ARGS_((Tcl_Interp *interp,
307 	Tk_Image tkImage));
308 
309 extern GC Blt_GetBitmapGC _ANSI_ARGS_((Tk_Window tkwin));
310 extern Pixmap Blt_PhotoImageMask _ANSI_ARGS_((Tk_Window tkwin,
311 	Tk_PhotoImageBlock src));
312 
313 extern Pixmap Blt_RotateBitmap _ANSI_ARGS_((Tk_Window tkwin, Pixmap bitmap,
314 	int width, int height, double theta, int *widthPtr, int *heightPtr));
315 
316 extern Pixmap Blt_ScaleBitmap _ANSI_ARGS_((Tk_Window tkwin, Pixmap srcBitmap,
317 	int srcWidth, int srcHeight, int scaledWidth, int scaledHeight));
318 
319 extern Pixmap Blt_ScaleRotateBitmapRegion _ANSI_ARGS_((Tk_Window tkwin,
320 	Pixmap srcBitmap, unsigned int srcWidth, unsigned int srcHeight,
321 	int regionX, int regionY, unsigned int regionWidth,
322 	unsigned int regionHeight, unsigned int virtWidth,
323 	unsigned int virtHeight, double theta));
324 
325 typedef enum {MIRROR_X=1, MIRROR_Y=2, MIRROR_XY=3, MIRROR_TILE=4, MIRROR_OUTER=5, MIRROR_INNER=6} BltMirrorEnum;
326 
327 extern int
328 Blt_ImageMirror(Tcl_Interp *interp, char *srcImg, char *dstImg, int flip, int halo);
329 
330 
331 #endif /*_BLT_IMAGE_H*/
332