Code update for Window Maker version 0.50.0
[wmaker-crm.git] / WINGs / wpixmap.c
blob43a5f84f51d967e884301ac519abc43148f2ad7a
2 #include "WINGsP.h"
4 #include <wraster.h>
7 WMPixmap*
8 WMRetainPixmap(WMPixmap *pixmap)
10 if (pixmap)
11 pixmap->refCount++;
13 return pixmap;
17 void
18 WMReleasePixmap(WMPixmap *pixmap)
20 wassertr(pixmap!=NULL);
22 pixmap->refCount--;
24 if (pixmap->refCount<1) {
25 XFreePixmap(pixmap->screen->display, pixmap->pixmap);
26 if (pixmap->mask)
27 XFreePixmap(pixmap->screen->display, pixmap->mask);
28 free(pixmap);
33 WMPixmap*
34 WMCreatePixmapFromXPixmaps(WMScreen *scrPtr, Pixmap pixmap, Pixmap mask,
35 int width, int height, int depth)
37 WMPixmap *pixPtr;
39 pixPtr = malloc(sizeof(WMPixmap));
40 if (!pixPtr) {
41 return NULL;
43 pixPtr->screen = scrPtr;
44 pixPtr->pixmap = pixmap;
45 pixPtr->mask = mask;
46 pixPtr->width = width;
47 pixPtr->height = height;
48 pixPtr->depth = depth;
49 pixPtr->refCount = 1;
51 return pixPtr;
57 WMPixmap*
58 WMCreatePixmapFromFile(WMScreen *scrPtr, char *fileName)
60 WMPixmap *pixPtr;
61 RImage *image;
63 image = RLoadImage(scrPtr->rcontext, fileName, 0);
64 if (!image)
65 return NULL;
67 pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 127);
69 RDestroyImage(image);
71 return pixPtr;
75 WMPixmap*
76 WMCreatePixmapFromRImage(WMScreen *scrPtr, RImage *image, int threshold)
78 WMPixmap *pixPtr;
79 Pixmap pixmap, mask;
81 if (!RConvertImageMask(scrPtr->rcontext, image, &pixmap, &mask,
82 threshold)) {
83 return NULL;
86 pixPtr = malloc(sizeof(WMPixmap));
87 if (!pixPtr) {
88 return NULL;
90 pixPtr->screen = scrPtr;
91 pixPtr->pixmap = pixmap;
92 pixPtr->mask = mask;
93 pixPtr->width = image->width;
94 pixPtr->height = image->height;
95 pixPtr->depth = scrPtr->depth;
96 pixPtr->refCount = 1;
98 return pixPtr;
102 WMPixmap*
103 WMCreateBlendedPixmapFromFile(WMScreen *scrPtr, char *fileName, RColor *color)
105 WMPixmap *pixPtr;
106 RImage *image;
109 image = RLoadImage(scrPtr->rcontext, fileName, 0);
110 if (!image)
111 return NULL;
113 RCombineImageWithColor(image, color);
115 pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 0);
117 RDestroyImage(image);
119 return pixPtr;
123 WMPixmap*
124 WMCreatePixmapFromXPMData(WMScreen *scrPtr, char **data)
126 WMPixmap *pixPtr;
127 RImage *image;
129 image = RGetImageFromXPMData(scrPtr->rcontext, data);
130 if (!image)
131 return NULL;
133 pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 127);
135 RDestroyImage(image);
137 return pixPtr;
141 Pixmap
142 WMGetPixmapXID(WMPixmap *pixmap)
144 wassertrv(pixmap != NULL, None);
146 return pixmap->pixmap;
150 Pixmap
151 WMGetPixmapMaskXID(WMPixmap *pixmap)
153 wassertrv(pixmap != NULL, None);
155 return pixmap->mask;
159 WMSize
160 WMGetPixmapSize(WMPixmap *pixmap)
162 WMSize size = {0,0};
164 wassertrv(pixmap != NULL, size);
166 size.width = pixmap->width;
167 size.height = pixmap->height;
169 return size;
173 WMPixmap*
174 WMGetSystemPixmap(WMScreen *scr, int image)
176 switch (image) {
177 case WSIReturnArrow:
178 return WMRetainPixmap(scr->buttonArrow);
180 case WSIHighlightedReturnArrow:
181 return WMRetainPixmap(scr->pushedButtonArrow);
183 case WSIScrollerDimple:
184 return WMRetainPixmap(scr->scrollerDimple);
186 case WSIArrowLeft:
187 return WMRetainPixmap(scr->leftArrow);
189 case WSIHighlightedArrowLeft:
190 return WMRetainPixmap(scr->hiLeftArrow);
192 case WSIArrowRight:
193 return WMRetainPixmap(scr->rightArrow);
195 case WSIHighlightedArrowRight:
196 return WMRetainPixmap(scr->hiRightArrow);
198 case WSIArrowUp:
199 return WMRetainPixmap(scr->upArrow);
201 case WSIHighlightedArrowUp:
202 return WMRetainPixmap(scr->hiUpArrow);
204 case WSIArrowDown:
205 return WMRetainPixmap(scr->downArrow);
207 case WSIHighlightedArrowDown:
208 return WMRetainPixmap(scr->hiDownArrow);
210 case WSICheckMark:
211 return WMRetainPixmap(scr->checkMark);
213 default:
214 return NULL;
220 void
221 WMDrawPixmap(WMPixmap *pixmap, Drawable d, int x, int y)
223 WMScreen *scr = pixmap->screen;
225 XSetClipMask(scr->display, scr->clipGC, pixmap->mask);
226 XSetClipOrigin(scr->display, scr->clipGC, x, y);
228 XCopyArea(scr->display, pixmap->pixmap, d, scr->clipGC, 0, 0,
229 pixmap->width, pixmap->height, x, y);