1 
2 /*	$Id: tixDiImg.c,v 1.1.1.1 2000/05/17 11:08:38 idiscovery Exp $	*/
3 
4 /*
5  * tixDiImgTxt.c --
6  *
7  *	This file implements one of the "Display Items" in the Tix library :
8  *	Image-text display items.
9  *
10  * Copyright (c) 1996, Expert Interface Technologies
11  *
12  * See the file "license.terms" for information on usage and redistribution
13  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14  *
15  */
16 
17 #include "tixPort.h"
18 #include "tixInt.h"
19 #include "tixDef.h"
20 
21 #define DEF_IMAGEITEM_BITMAP	""
22 #define DEF_IMAGEITEM_IMAGE		""
23 #define DEF_IMAGEITEM_TYPE		"image"
24 #define DEF_IMAGEITEM_SHOWIMAGE		"1"
25 #define DEF_IMAGEITEM_SHOWTEXT		"1"
26 #define DEF_IMAGEITEM_STYLE		""
27 #define DEF_IMAGEITEM_TEXT		""
28 #define DEF_IMAGEITEM_UNDERLINE		"-1"
29 
30 static Tk_ConfigSpec imageItemConfigSpecs[] = {
31 
32     {TK_CONFIG_STRING, "-image", "image", "Image",
33        DEF_IMAGEITEM_IMAGE, Tk_Offset(TixImageItem, imageString),
34        TK_CONFIG_NULL_OK},
35 
36     {TK_CONFIG_CUSTOM, "-itemtype", "itemType", "ItemType",
37        DEF_IMAGEITEM_TYPE, Tk_Offset(TixImageItem, diTypePtr),
38        0, &tixConfigItemType},
39 
40     {TK_CONFIG_CUSTOM, "-style", "imageStyle", "ImageStyle",
41        DEF_IMAGEITEM_STYLE, Tk_Offset(TixImageItem, stylePtr),
42        TK_CONFIG_NULL_OK, &tixConfigItemStyle},
43 
44     {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
45        (char *) NULL, 0, 0}
46 };
47 
48 /*----------------------------------------------------------------------
49  *
50  *		Configuration options for Text Styles
51  *
52  *----------------------------------------------------------------------
53  */
54 
55 
56 #define SELECTED_BG SELECT_BG
57 #define DISABLED_BG DISABLED
58 
59 #define DEF_IMAGESTYLE_NORMAL_FG_COLOR		BLACK
60 #define DEF_IMAGESTYLE_NORMAL_FG_MONO		BLACK
61 #define DEF_IMAGESTYLE_NORMAL_BG_COLOR		NORMAL_BG
62 #define DEF_IMAGESTYLE_NORMAL_BG_MONO		WHITE
63 
64 #define DEF_IMAGESTYLE_ACTIVE_FG_COLOR		BLACK
65 #define DEF_IMAGESTYLE_ACTIVE_FG_MONO		WHITE
66 #define DEF_IMAGESTYLE_ACTIVE_BG_COLOR		ACTIVE_BG
67 #define DEF_IMAGESTYLE_ACTIVE_BG_MONO		BLACK
68 
69 #define DEF_IMAGESTYLE_SELECTED_FG_COLOR	BLACK
70 #define DEF_IMAGESTYLE_SELECTED_FG_MONO		WHITE
71 #define DEF_IMAGESTYLE_SELECTED_BG_COLOR	SELECTED_BG
72 #define DEF_IMAGESTYLE_SELECTED_BG_MONO		BLACK
73 
74 #define DEF_IMAGESTYLE_DISABLED_FG_COLOR	BLACK
75 #define DEF_IMAGESTYLE_DISABLED_FG_MONO		BLACK
76 #define DEF_IMAGESTYLE_DISABLED_BG_COLOR	DISABLED_BG
77 #define DEF_IMAGESTYLE_DISABLED_BG_MONO		WHITE
78 
79 #define DEF_IMAGESTYLE_PADX		"0"
80 #define DEF_IMAGESTYLE_PADY		"0"
81 #define DEF_IMAGESTYLE_ANCHOR		"w"
82 
83 
84 static Tk_ConfigSpec imageStyleConfigSpecs[] = {
85     {TK_CONFIG_ANCHOR, "-anchor", "anchor", "Anchor",
86        DEF_IMAGESTYLE_ANCHOR, Tk_Offset(TixImageStyle, anchor), 0},
87 
88     {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
89        (char *) NULL, 0, 0},
90     {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
91        (char *) NULL, 0, 0},
92 
93     {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",
94        DEF_IMAGESTYLE_PADX, Tk_Offset(TixImageStyle, pad[0]), 0},
95 
96     {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",
97        DEF_IMAGESTYLE_PADY, Tk_Offset(TixImageStyle, pad[1]), 0},
98 
99 /* The following is automatically generated */
100 	{TK_CONFIG_COLOR,"-background","background","Background",
101 	DEF_IMAGESTYLE_NORMAL_BG_COLOR,
102 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].bg),
103 	TK_CONFIG_COLOR_ONLY},
104 	{TK_CONFIG_COLOR,"-background","background","Background",
105 	DEF_IMAGESTYLE_NORMAL_BG_MONO,
106 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].bg),
107 	TK_CONFIG_MONO_ONLY},
108 	{TK_CONFIG_COLOR,"-foreground","foreground","Foreground",
109 	DEF_IMAGESTYLE_NORMAL_FG_COLOR,
110 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].fg),
111 	TK_CONFIG_COLOR_ONLY},
112 	{TK_CONFIG_COLOR,"-foreground","foreground","Foreground",
113 	DEF_IMAGESTYLE_NORMAL_FG_MONO,
114 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_NORMAL].fg),
115 	TK_CONFIG_MONO_ONLY},
116 	{TK_CONFIG_COLOR,"-activebackground","activeBackground","ActiveBackground",
117 	DEF_IMAGESTYLE_ACTIVE_BG_COLOR,
118 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].bg),
119 	TK_CONFIG_COLOR_ONLY},
120 	{TK_CONFIG_COLOR,"-activebackground","activeBackground","ActiveBackground",
121 	DEF_IMAGESTYLE_ACTIVE_BG_MONO,
122 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].bg),
123 	TK_CONFIG_MONO_ONLY},
124 	{TK_CONFIG_COLOR,"-activeforeground","activeForeground","ActiveForeground",
125 	DEF_IMAGESTYLE_ACTIVE_FG_COLOR,
126 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].fg),
127 	TK_CONFIG_COLOR_ONLY},
128 	{TK_CONFIG_COLOR,"-activeforeground","activeForeground","ActiveForeground",
129 	DEF_IMAGESTYLE_ACTIVE_FG_MONO,
130 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_ACTIVE].fg),
131 	TK_CONFIG_MONO_ONLY},
132 	{TK_CONFIG_COLOR,"-selectbackground","selectBackground","SelectBackground",
133 	DEF_IMAGESTYLE_SELECTED_BG_COLOR,
134 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].bg),
135 	TK_CONFIG_COLOR_ONLY},
136 	{TK_CONFIG_COLOR,"-selectbackground","selectBackground","SelectBackground",
137 	DEF_IMAGESTYLE_SELECTED_BG_MONO,
138 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].bg),
139 	TK_CONFIG_MONO_ONLY},
140 	{TK_CONFIG_COLOR,"-selectforeground","selectForeground","SelectForeground",
141 	DEF_IMAGESTYLE_SELECTED_FG_COLOR,
142 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].fg),
143 	TK_CONFIG_COLOR_ONLY},
144 	{TK_CONFIG_COLOR,"-selectforeground","selectForeground","SelectForeground",
145 	DEF_IMAGESTYLE_SELECTED_FG_MONO,
146 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_SELECTED].fg),
147 	TK_CONFIG_MONO_ONLY},
148 	{TK_CONFIG_COLOR,"-disabledbackground","disabledBackground","DisabledBackground",
149 	DEF_IMAGESTYLE_DISABLED_BG_COLOR,
150 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].bg),
151 	TK_CONFIG_COLOR_ONLY},
152 	{TK_CONFIG_COLOR,"-disabledbackground","disabledBackground","DisabledBackground",
153 	DEF_IMAGESTYLE_DISABLED_BG_MONO,
154 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].bg),
155 	TK_CONFIG_MONO_ONLY},
156 	{TK_CONFIG_COLOR,"-disabledforeground","disabledForeground","DisabledForeground",
157 	DEF_IMAGESTYLE_DISABLED_FG_COLOR,
158 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].fg),
159 	TK_CONFIG_COLOR_ONLY},
160 	{TK_CONFIG_COLOR,"-disabledforeground","disabledForeground","DisabledForeground",
161 	DEF_IMAGESTYLE_DISABLED_FG_MONO,
162 	Tk_Offset(TixImageStyle,colors[TIX_DITEM_DISABLED].fg),
163 	TK_CONFIG_MONO_ONLY},
164 
165     {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
166        (char *) NULL, 0, 0}
167 };
168 
169 /*----------------------------------------------------------------------
170  * Forward declarations for procedures defined later in this file:
171  *----------------------------------------------------------------------
172  */
173 static void		ImageProc _ANSI_ARGS_((ClientData clientData,
174 			    int x, int y, int width, int height,
175 			    int imgWidth, int imgHeight));
176 static void		Tix_ImageItemCalculateSize  _ANSI_ARGS_((
177 			    Tix_DItem * iPtr));
178 static char *		Tix_ImageItemComponent	_ANSI_ARGS_((
179 			    Tix_DItem * iPtr, int x, int y));
180 static int		Tix_ImageItemConfigure _ANSI_ARGS_((
181 			    Tix_DItem * iPtr, int argc, char ** argv,
182 			    int flags));
183 static Tix_DItem *	Tix_ImageItemCreate _ANSI_ARGS_((
184 			    Tix_DispData * ddPtr, Tix_DItemInfo * diTypePtr));
185 static void		Tix_ImageItemDisplay  _ANSI_ARGS_((
186 			    Pixmap pixmap, GC gc, Tix_DItem * iPtr,
187 			    int x, int y, int width, int height, int flag));
188 static void		Tix_ImageItemFree  _ANSI_ARGS_((
189 			    Tix_DItem * iPtr));
190 static void		Tix_ImageItemLostStyle	_ANSI_ARGS_((
191 			    Tix_DItem * iPtr));
192 static void		Tix_ImageItemStyleChanged  _ANSI_ARGS_((
193 			    Tix_DItem * iPtr));
194 static int		Tix_ImageStyleConfigure _ANSI_ARGS_((
195 			    Tix_DItemStyle* style, int argc, char ** argv,
196 			    int flags));
197 static Tix_DItemStyle *	Tix_ImageStyleCreate _ANSI_ARGS_((
198 			    Tcl_Interp *interp, Tk_Window tkwin,
199 			    Tix_DItemInfo * diTypePtr, char * name));
200 static void		Tix_ImageStyleFree _ANSI_ARGS_((
201 			    Tix_DItemStyle* style));
202 static void		Tix_ImageStyleSetTemplate _ANSI_ARGS_((
203 			    Tix_DItemStyle* style,
204 			    Tix_StyleTemplate * tmplPtr));
205 
206 Tix_DItemInfo tix_ImageItemType = {
207     "image",			/* type */
208     TIX_DITEM_IMAGE,
209     Tix_ImageItemCreate,		/* createProc */
210     Tix_ImageItemConfigure,
211     Tix_ImageItemCalculateSize,
212     Tix_ImageItemComponent,
213     Tix_ImageItemDisplay,
214     Tix_ImageItemFree,
215     Tix_ImageItemStyleChanged,
216     Tix_ImageItemLostStyle,
217 
218     Tix_ImageStyleCreate,
219     Tix_ImageStyleConfigure,
220     Tix_ImageStyleFree,
221     Tix_ImageStyleSetTemplate,
222 
223     imageItemConfigSpecs,
224     imageStyleConfigSpecs,
225     NULL,				/*next */
226 };
227 
228 
229 /*----------------------------------------------------------------------
230  * Tix_Image --
231  *
232  *
233  *----------------------------------------------------------------------
234  */
Tix_ImageItemCreate(ddPtr,diTypePtr)235 static Tix_DItem * Tix_ImageItemCreate(ddPtr, diTypePtr)
236     Tix_DispData * ddPtr;
237     Tix_DItemInfo * diTypePtr;
238 {
239     TixImageItem * itPtr;
240 
241     itPtr = (TixImageItem*) ckalloc(sizeof(TixImageItem));
242 
243     itPtr->diTypePtr	= diTypePtr;
244     itPtr->ddPtr	= ddPtr;
245     itPtr->stylePtr	= NULL;
246     itPtr->clientData	= 0;
247     itPtr->size[0]	= 0;
248     itPtr->size[1]	= 0;
249 
250     itPtr->imageString	= NULL;
251     itPtr->image	= NULL;
252     itPtr->imageW	= 0;
253     itPtr->imageH	= 0;
254 
255     return (Tix_DItem *)itPtr;
256 }
257 
Tix_ImageItemFree(iPtr)258 static void Tix_ImageItemFree(iPtr)
259     Tix_DItem * iPtr;
260 {
261     TixImageItem * itPtr = (TixImageItem *) iPtr;
262 
263     if (itPtr->image) {
264 	Tk_FreeImage(itPtr->image);
265     }
266     if (itPtr->stylePtr) {
267 	TixDItemStyleFree(iPtr, (Tix_DItemStyle*)itPtr->stylePtr);
268     }
269 
270     Tk_FreeOptions(imageItemConfigSpecs, (char *)itPtr,
271 	itPtr->ddPtr->display, 0);
272     ckfree((char*)itPtr);
273 }
274 
Tix_ImageItemConfigure(iPtr,argc,argv,flags)275 static int Tix_ImageItemConfigure(iPtr, argc, argv, flags)
276     Tix_DItem * iPtr;
277     int argc;
278     char ** argv;
279     int flags;
280 {
281     TixImageItem * itPtr = (TixImageItem *) iPtr;
282     TixImageStyle * oldStyle = itPtr->stylePtr;
283 
284     if (Tk_ConfigureWidget(itPtr->ddPtr->interp, itPtr->ddPtr->tkwin,
285 	imageItemConfigSpecs,
286 	argc, argv, (char *)itPtr, flags) != TCL_OK) {
287 	return TCL_ERROR;
288     }
289     if (itPtr->stylePtr == NULL) {
290 	itPtr->stylePtr = (TixImageStyle*)TixGetDefaultDItemStyle(
291 	    itPtr->ddPtr, &tix_ImageItemType, iPtr, NULL);
292     }
293 
294     /*
295      * Free the old images for the widget, if there were any.
296      */
297     if (itPtr->image != NULL) {
298 	Tk_FreeImage(itPtr->image);
299 	itPtr->image = NULL;
300     }
301 
302     if (itPtr->imageString != NULL) {
303 	itPtr->image = Tk_GetImage(itPtr->ddPtr->interp, itPtr->ddPtr->tkwin,
304 	    itPtr->imageString, ImageProc, (ClientData) itPtr);
305 	if (itPtr->image == NULL) {
306 	    return TCL_ERROR;
307 	}
308     }
309 
310     if (oldStyle != NULL && itPtr->stylePtr != oldStyle) {
311 	Tix_ImageItemStyleChanged(iPtr);
312     }
313     else {
314 	Tix_ImageItemCalculateSize((Tix_DItem*)itPtr);
315     }
316 
317     return TCL_OK;
318 }
319 
Tix_ImageItemDisplay(pixmap,gc,iPtr,x,y,width,height,flags)320 static void Tix_ImageItemDisplay(pixmap, gc, iPtr, x, y, width, height, flags)
321     Pixmap pixmap;
322     GC gc;
323     Tix_DItem * iPtr;
324     int x;
325     int y;
326     int width;
327     int height;
328     int flags;
329 {
330     TixImageItem *itPtr = (TixImageItem *)iPtr;
331     GC foreGC, backGC;
332     TixpSubRegion subReg;
333 
334     if ((width <= 0) || (height <= 0)) {
335 	return;
336     }
337 
338     TixGetColorDItemGC(iPtr, &backGC, &foreGC, flags);
339     TixpStartSubRegionDraw(itPtr->ddPtr, pixmap, foreGC,
340 	    &subReg, 0, 0, x, y, width, height,
341 	    itPtr->size[0], itPtr->size[1]);
342     TixDItemGetAnchor(itPtr->stylePtr->anchor, x, y, width, height,
343 	itPtr->size[0], itPtr->size[1], &x, &y);
344 
345     if (backGC != None) {
346 	TixpSubRegFillRectangle(itPtr->ddPtr->display, pixmap,
347 		backGC, &subReg, x, y, width, height);
348     }
349 
350     if (itPtr->image != NULL) {
351 	int bitY;
352 
353 	bitY = itPtr->size[1] - itPtr->imageH - 2*itPtr->stylePtr->pad[1];
354 
355 	if (bitY > 0) {
356 	    bitY = bitY / 2;
357 	} else {
358 	    bitY = 0;
359 	}
360 	TixpSubRegDrawImage(&subReg, itPtr->image, 0, 0, itPtr->imageW,
361 		itPtr->imageH, pixmap,
362 		x + itPtr->stylePtr->pad[0],
363 		y + itPtr->stylePtr->pad[1] + bitY);
364     }
365 
366     TixpEndSubRegionDraw(itPtr->ddPtr->display, pixmap, foreGC,
367 	    &subReg);
368 }
369 
Tix_ImageItemCalculateSize(iPtr)370 static void Tix_ImageItemCalculateSize(iPtr)
371     Tix_DItem * iPtr;
372 {
373     TixImageItem *itPtr = (TixImageItem *)iPtr;
374 
375     itPtr->size[0] = 0;
376     itPtr->size[1] = 0;
377 
378     if (itPtr->image != NULL) {
379 	Tk_SizeOfImage(itPtr->image, &itPtr->imageW, &itPtr->imageH);
380 
381 	itPtr->size[0] = itPtr->imageW;
382 	itPtr->size[1] = itPtr->imageH;
383     }
384 
385     itPtr->size[0] += 2*itPtr->stylePtr->pad[0];
386     itPtr->size[1] += 2*itPtr->stylePtr->pad[1];
387 }
388 
Tix_ImageItemComponent(iPtr,x,y)389 static char * Tix_ImageItemComponent(iPtr, x, y)
390     Tix_DItem * iPtr;
391     int x;
392     int y;
393 {
394 #if 0
395     TixImageItem *itPtr = (TixImageItem *)iPtr;
396 #endif
397     static char * body = "body";
398 
399     return body;
400 }
401 
402 
Tix_ImageItemStyleChanged(iPtr)403 static void Tix_ImageItemStyleChanged(iPtr)
404     Tix_DItem * iPtr;
405 {
406     TixImageItem *itPtr = (TixImageItem *)iPtr;
407 
408     if (itPtr->stylePtr == NULL) {
409 	/* Maybe we haven't set the style to default style yet */
410 	return;
411     }
412     Tix_ImageItemCalculateSize(iPtr);
413     if (itPtr->ddPtr->sizeChangedProc != NULL) {
414 	itPtr->ddPtr->sizeChangedProc(iPtr);
415     }
416 }
Tix_ImageItemLostStyle(iPtr)417 static void Tix_ImageItemLostStyle(iPtr)
418     Tix_DItem * iPtr;
419 {
420     TixImageItem *itPtr = (TixImageItem *)iPtr;
421 
422     itPtr->stylePtr = (TixImageStyle*)TixGetDefaultDItemStyle(
423 	itPtr->ddPtr, &tix_ImageItemType, iPtr, NULL);
424 
425     Tix_ImageItemStyleChanged(iPtr);
426 }
427 
428 /*
429  *----------------------------------------------------------------------
430  *
431  * ImageProc --
432  *
433  *	This procedure is invoked by the image code whenever the manager
434  *	for an image does something that affects the size of contents
435  *	of an image displayed in this widget.
436  *
437  * Results:
438  *	None.
439  *
440  * Side effects:
441  *	Arranges for the HList to get redisplayed.
442  *
443  *----------------------------------------------------------------------
444  */
445 static void
ImageProc(clientData,x,y,width,height,imgWidth,imgHeight)446 ImageProc(clientData, x, y, width, height, imgWidth, imgHeight)
447     ClientData clientData;		/* Pointer to widget record. */
448     int x, y;				/* Upper left pixel (within image)
449 					 * that must be redisplayed. */
450     int width, height;			/* Dimensions of area to redisplay
451 					 * (may be <= 0). */
452     int imgWidth, imgHeight;		/* New dimensions of image. */
453 {
454     TixImageItem *itPtr = (TixImageItem *)clientData;
455 
456     Tix_ImageItemCalculateSize((Tix_DItem *)itPtr);
457     if (itPtr->ddPtr->sizeChangedProc != NULL) {
458 	itPtr->ddPtr->sizeChangedProc((Tix_DItem *)itPtr);
459     }
460 }
461 
462 /*----------------------------------------------------------------------
463  *
464  *
465  *			Display styles
466  *
467  *
468  *----------------------------------------------------------------------
469  */
470 static Tix_DItemStyle *
Tix_ImageStyleCreate(interp,tkwin,diTypePtr,name)471 Tix_ImageStyleCreate(interp, tkwin, diTypePtr, name)
472     Tcl_Interp * interp;
473     Tk_Window tkwin;
474     char * name;
475     Tix_DItemInfo * diTypePtr;
476 {
477     int i;
478     TixImageStyle * stylePtr =
479       (TixImageStyle *)ckalloc(sizeof(TixImageStyle));
480 
481     stylePtr->pad[0]	 = 0;
482     stylePtr->pad[1]	 = 0;
483     stylePtr->anchor	 = TK_ANCHOR_CENTER;
484 
485     for (i=0; i<4; i++) {
486 	stylePtr->colors[i].bg = NULL;
487 	stylePtr->colors[i].fg = NULL;
488 	stylePtr->colors[i].backGC = None;
489 	stylePtr->colors[i].foreGC = NULL;
490     }
491 
492     return (Tix_DItemStyle *)stylePtr;
493 }
494 
495 static int
Tix_ImageStyleConfigure(style,argc,argv,flags)496 Tix_ImageStyleConfigure(style, argc, argv, flags)
497     Tix_DItemStyle *style;
498     int argc;
499     char ** argv;
500     int flags;
501 {
502     TixImageStyle * stylePtr = (TixImageStyle *)style;
503     XGCValues gcValues;
504     GC newGC;
505     int i;
506 
507     if (!(flags &TIX_DONT_CALL_CONFIG)) {
508 	if (Tk_ConfigureWidget(stylePtr->interp, stylePtr->tkwin,
509 	    imageStyleConfigSpecs,
510 	    argc, argv, (char *)stylePtr, flags) != TCL_OK) {
511 	    return TCL_ERROR;
512 	}
513     }
514 
515     gcValues.graphics_exposures = False;
516     for (i=0; i<4; i++) {
517 	/* Foreground */
518 	gcValues.background = stylePtr->colors[i].bg->pixel;
519 	gcValues.foreground = stylePtr->colors[i].fg->pixel;
520 	newGC = Tk_GetGC(stylePtr->tkwin,
521 	    GCForeground|GCBackground|GCGraphicsExposures, &gcValues);
522 
523 	if (stylePtr->colors[i].foreGC != None) {
524 	    Tk_FreeGC(Tk_Display(stylePtr->tkwin),
525 		stylePtr->colors[i].foreGC);
526 	}
527 	stylePtr->colors[i].foreGC = newGC;
528 
529 	/* Background */
530 	gcValues.foreground = stylePtr->colors[i].bg->pixel;
531 	newGC = Tk_GetGC(stylePtr->tkwin,
532 	    GCForeground|GCGraphicsExposures, &gcValues);
533 
534 	if (stylePtr->colors[i].backGC != None) {
535 	    Tk_FreeGC(Tk_Display(stylePtr->tkwin),
536 		stylePtr->colors[i].backGC);
537 	}
538 	stylePtr->colors[i].backGC = newGC;
539     }
540 
541     return TCL_OK;
542 }
543 
Tix_ImageStyleFree(style)544 static void Tix_ImageStyleFree(style)
545     Tix_DItemStyle *style;
546 {
547     TixImageStyle * stylePtr = (TixImageStyle *)style;
548     int i;
549 
550     for (i=0; i<4; i++) {
551 	if (stylePtr->colors[i].backGC != None) {
552 	    Tk_FreeGC(Tk_Display(stylePtr->tkwin), stylePtr->colors[i].backGC);
553 	}
554 	if (stylePtr->colors[i].foreGC != None) {
555 	    Tk_FreeGC(Tk_Display(stylePtr->tkwin), stylePtr->colors[i].foreGC);
556 	}
557     }
558 
559     Tk_FreeOptions(imageStyleConfigSpecs, (char *)stylePtr,
560 	Tk_Display(stylePtr->tkwin), 0);
561     ckfree((char *)stylePtr);
562 }
563 
564 static int bg_flags [4] = {
565     TIX_DITEM_NORMAL_BG,
566     TIX_DITEM_ACTIVE_BG,
567     TIX_DITEM_SELECTED_BG,
568     TIX_DITEM_DISABLED_BG
569 };
570 static int fg_flags [4] = {
571     TIX_DITEM_NORMAL_FG,
572     TIX_DITEM_ACTIVE_FG,
573     TIX_DITEM_SELECTED_FG,
574     TIX_DITEM_DISABLED_FG
575 };
576 
577 static void
Tix_ImageStyleSetTemplate(style,tmplPtr)578 Tix_ImageStyleSetTemplate(style, tmplPtr)
579     Tix_DItemStyle* style;
580     Tix_StyleTemplate * tmplPtr;
581 {
582     TixImageStyle * stylePtr = (TixImageStyle *)style;
583     int i;
584 
585     if (tmplPtr->flags & TIX_DITEM_PADX) {
586 	stylePtr->pad[0] = tmplPtr->pad[0];
587     }
588     if (tmplPtr->flags & TIX_DITEM_PADY) {
589 	stylePtr->pad[1] = tmplPtr->pad[1];
590     }
591 
592     for (i=0; i<4; i++) {
593 	if (tmplPtr->flags & bg_flags[i]) {
594 	    if (stylePtr->colors[i].bg != NULL) {
595 		Tk_FreeColor(stylePtr->colors[i].bg);
596 	    }
597 	    stylePtr->colors[i].bg = Tk_GetColor(
598 		stylePtr->interp, stylePtr->tkwin,
599 		Tk_NameOfColor(tmplPtr->colors[i].bg));
600 	}
601     }
602     for (i=0; i<4; i++) {
603 	if (tmplPtr->flags & fg_flags[i]) {
604 	    if (stylePtr->colors[i].fg != NULL) {
605 		Tk_FreeColor(stylePtr->colors[i].fg);
606 	    }
607 	    stylePtr->colors[i].fg = Tk_GetColor(
608 		stylePtr->interp, stylePtr->tkwin,
609 		Tk_NameOfColor(tmplPtr->colors[i].fg));
610 	}
611     }
612 
613     Tix_ImageStyleConfigure(style, 0, 0, TIX_DONT_CALL_CONFIG);
614 }
615