Include screen.h in dialog.h for definition of WScreen
[wmaker-crm.git] / WINGs / wpixmap.c
blob5ad311cbc86a19761bdeb5e29272153d0e4bcf04
2 #include "WINGsP.h"
4 #include <wraster.h>
6 WMPixmap *WMRetainPixmap(WMPixmap * pixmap)
8 if (pixmap)
9 pixmap->refCount++;
11 return pixmap;
14 void WMReleasePixmap(WMPixmap * pixmap)
16 wassertr(pixmap != NULL);
18 pixmap->refCount--;
20 if (pixmap->refCount < 1) {
21 if (pixmap->pixmap)
22 XFreePixmap(pixmap->screen->display, pixmap->pixmap);
23 if (pixmap->mask)
24 XFreePixmap(pixmap->screen->display, pixmap->mask);
25 wfree(pixmap);
29 WMPixmap *WMCreatePixmap(WMScreen * scrPtr, int width, int height, int depth, Bool masked)
31 WMPixmap *pixPtr;
33 pixPtr = wmalloc(sizeof(WMPixmap));
34 pixPtr->screen = scrPtr;
35 pixPtr->width = width;
36 pixPtr->height = height;
37 pixPtr->depth = depth;
38 pixPtr->refCount = 1;
40 pixPtr->pixmap = XCreatePixmap(scrPtr->display, W_DRAWABLE(scrPtr), width, height, depth);
41 if (masked) {
42 pixPtr->mask = XCreatePixmap(scrPtr->display, W_DRAWABLE(scrPtr), width, height, 1);
43 } else {
44 pixPtr->mask = None;
47 return pixPtr;
50 WMPixmap *WMCreatePixmapFromXPixmaps(WMScreen * scrPtr, Pixmap pixmap, Pixmap mask,
51 int width, int height, int depth)
53 WMPixmap *pixPtr;
55 pixPtr = wmalloc(sizeof(WMPixmap));
56 pixPtr->screen = scrPtr;
57 pixPtr->pixmap = pixmap;
58 pixPtr->mask = mask;
59 pixPtr->width = width;
60 pixPtr->height = height;
61 pixPtr->depth = depth;
62 pixPtr->refCount = 1;
64 return pixPtr;
67 WMPixmap *WMCreatePixmapFromFile(WMScreen * scrPtr, const char *fileName)
69 WMPixmap *pixPtr;
70 RImage *image;
72 image = RLoadImage(scrPtr->rcontext, fileName, 0);
73 if (!image)
74 return NULL;
76 pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 127);
78 RReleaseImage(image);
80 return pixPtr;
83 WMPixmap *WMCreatePixmapFromRImage(WMScreen * scrPtr, RImage * image, int threshold)
85 WMPixmap *pixPtr;
86 Pixmap pixmap, mask;
88 if (image == NULL)
89 return NULL;
91 if (!RConvertImageMask(scrPtr->rcontext, image, &pixmap, &mask, threshold)) {
92 return NULL;
95 pixPtr = wmalloc(sizeof(WMPixmap));
96 pixPtr->screen = scrPtr;
97 pixPtr->pixmap = pixmap;
98 pixPtr->mask = mask;
99 pixPtr->width = image->width;
100 pixPtr->height = image->height;
101 pixPtr->depth = scrPtr->depth;
102 pixPtr->refCount = 1;
104 return pixPtr;
107 WMPixmap *WMCreateBlendedPixmapFromRImage(WMScreen * scrPtr, RImage * image, const RColor * color)
109 WMPixmap *pixPtr;
110 RImage *copy;
112 copy = RCloneImage(image);
113 if (!copy)
114 return NULL;
116 RCombineImageWithColor(copy, color);
117 pixPtr = WMCreatePixmapFromRImage(scrPtr, copy, 0);
118 RReleaseImage(copy);
120 return pixPtr;
123 WMPixmap *WMCreateBlendedPixmapFromFile(WMScreen * scrPtr, const char *fileName, const RColor * color)
125 return WMCreateScaledBlendedPixmapFromFile(scrPtr, fileName, color, 0, 0);
128 WMPixmap *WMCreateScaledBlendedPixmapFromFile(WMScreen *scrPtr, const char *fileName, const RColor *color,
129 unsigned int width, unsigned int height)
131 WMPixmap *pixPtr;
132 RImage *image;
134 image = RLoadImage(scrPtr->rcontext, fileName, 0);
135 if (!image)
136 return NULL;
138 /* scale it if needed to fit in the specified box */
139 if ((width > 0) && (height > 0) && ((image->width > width) || (image->height > height))) {
140 int new_width, new_height;
141 RImage *new_image;
143 new_width = image->width;
144 new_height = image->height;
145 if (new_width > width) {
146 new_width = width;
147 new_height = width * image->height / image->width;
149 if (new_height > height) {
150 new_width = height * image->width / image->height;
151 new_height = height;
154 new_image = RScaleImage(image, new_width, new_height);
155 RReleaseImage(image);
156 image = new_image;
159 RCombineImageWithColor(image, color);
160 pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 0);
161 RReleaseImage(image);
163 return pixPtr;
166 WMPixmap *WMCreatePixmapFromXPMData(WMScreen * scrPtr, char **data)
168 WMPixmap *pixPtr;
169 RImage *image;
171 image = RGetImageFromXPMData(scrPtr->rcontext, data);
172 if (!image)
173 return NULL;
175 pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 127);
177 RReleaseImage(image);
179 return pixPtr;
182 Pixmap WMGetPixmapXID(WMPixmap * pixmap)
184 wassertrv(pixmap != NULL, None);
186 return pixmap->pixmap;
189 Pixmap WMGetPixmapMaskXID(WMPixmap * pixmap)
191 wassertrv(pixmap != NULL, None);
193 return pixmap->mask;
196 WMSize WMGetPixmapSize(WMPixmap * pixmap)
198 WMSize size = { 0, 0 };
200 wassertrv(pixmap != NULL, size);
202 size.width = pixmap->width;
203 size.height = pixmap->height;
205 return size;
208 WMPixmap *WMGetSystemPixmap(WMScreen * scr, int image)
210 switch (image) {
211 case WSIReturnArrow:
212 return WMRetainPixmap(scr->buttonArrow);
214 case WSIHighlightedReturnArrow:
215 return WMRetainPixmap(scr->pushedButtonArrow);
217 case WSIScrollerDimple:
218 return WMRetainPixmap(scr->scrollerDimple);
220 case WSIArrowLeft:
221 return WMRetainPixmap(scr->leftArrow);
223 case WSIHighlightedArrowLeft:
224 return WMRetainPixmap(scr->hiLeftArrow);
226 case WSIArrowRight:
227 return WMRetainPixmap(scr->rightArrow);
229 case WSIHighlightedArrowRight:
230 return WMRetainPixmap(scr->hiRightArrow);
232 case WSIArrowUp:
233 return WMRetainPixmap(scr->upArrow);
235 case WSIHighlightedArrowUp:
236 return WMRetainPixmap(scr->hiUpArrow);
238 case WSIArrowDown:
239 return WMRetainPixmap(scr->downArrow);
241 case WSIHighlightedArrowDown:
242 return WMRetainPixmap(scr->hiDownArrow);
244 case WSICheckMark:
245 return WMRetainPixmap(scr->checkMark);
247 default:
248 return NULL;
252 void WMDrawPixmap(WMPixmap * pixmap, Drawable d, int x, int y)
254 WMScreen *scr = pixmap->screen;
256 XSetClipMask(scr->display, scr->clipGC, pixmap->mask);
257 XSetClipOrigin(scr->display, scr->clipGC, x, y);
259 XCopyArea(scr->display, pixmap->pixmap, d, scr->clipGC, 0, 0, pixmap->width, pixmap->height, x, y);