6 WMPixmap
*WMRetainPixmap(WMPixmap
* pixmap
)
14 void WMReleasePixmap(WMPixmap
* pixmap
)
16 wassertr(pixmap
!= NULL
);
20 if (pixmap
->refCount
< 1) {
22 XFreePixmap(pixmap
->screen
->display
, pixmap
->pixmap
);
24 XFreePixmap(pixmap
->screen
->display
, pixmap
->mask
);
29 WMPixmap
*WMCreatePixmap(WMScreen
* scrPtr
, int width
, int height
, int depth
, Bool masked
)
33 pixPtr
= wmalloc(sizeof(WMPixmap
));
34 pixPtr
->screen
= scrPtr
;
35 pixPtr
->width
= width
;
36 pixPtr
->height
= height
;
37 pixPtr
->depth
= depth
;
40 pixPtr
->pixmap
= XCreatePixmap(scrPtr
->display
, W_DRAWABLE(scrPtr
), width
, height
, depth
);
42 pixPtr
->mask
= XCreatePixmap(scrPtr
->display
, W_DRAWABLE(scrPtr
), width
, height
, 1);
50 WMPixmap
*WMCreatePixmapFromXPixmaps(WMScreen
* scrPtr
, Pixmap pixmap
, Pixmap mask
,
51 int width
, int height
, int depth
)
55 pixPtr
= wmalloc(sizeof(WMPixmap
));
56 pixPtr
->screen
= scrPtr
;
57 pixPtr
->pixmap
= pixmap
;
59 pixPtr
->width
= width
;
60 pixPtr
->height
= height
;
61 pixPtr
->depth
= depth
;
67 WMPixmap
*WMCreatePixmapFromFile(WMScreen
* scrPtr
, const char *fileName
)
72 image
= RLoadImage(scrPtr
->rcontext
, fileName
, 0);
76 pixPtr
= WMCreatePixmapFromRImage(scrPtr
, image
, 127);
83 WMPixmap
*WMCreatePixmapFromRImage(WMScreen
* scrPtr
, RImage
* image
, int threshold
)
91 if (!RConvertImageMask(scrPtr
->rcontext
, image
, &pixmap
, &mask
, threshold
)) {
95 pixPtr
= wmalloc(sizeof(WMPixmap
));
96 pixPtr
->screen
= scrPtr
;
97 pixPtr
->pixmap
= pixmap
;
99 pixPtr
->width
= image
->width
;
100 pixPtr
->height
= image
->height
;
101 pixPtr
->depth
= scrPtr
->depth
;
102 pixPtr
->refCount
= 1;
107 WMPixmap
*WMCreateBlendedPixmapFromRImage(WMScreen
* scrPtr
, RImage
* image
, const RColor
* color
)
112 copy
= RCloneImage(image
);
116 RCombineImageWithColor(copy
, color
);
117 pixPtr
= WMCreatePixmapFromRImage(scrPtr
, copy
, 0);
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
)
134 image
= RLoadImage(scrPtr
->rcontext
, fileName
, 0);
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
;
143 new_width
= image
->width
;
144 new_height
= image
->height
;
145 if (new_width
> width
) {
147 new_height
= width
* image
->height
/ image
->width
;
149 if (new_height
> height
) {
150 new_width
= height
* image
->width
/ image
->height
;
154 new_image
= RScaleImage(image
, new_width
, new_height
);
155 RReleaseImage(image
);
159 RCombineImageWithColor(image
, color
);
160 pixPtr
= WMCreatePixmapFromRImage(scrPtr
, image
, 0);
161 RReleaseImage(image
);
166 WMPixmap
*WMCreatePixmapFromXPMData(WMScreen
* scrPtr
, char **data
)
171 image
= RGetImageFromXPMData(scrPtr
->rcontext
, data
);
175 pixPtr
= WMCreatePixmapFromRImage(scrPtr
, image
, 127);
177 RReleaseImage(image
);
182 Pixmap
WMGetPixmapXID(WMPixmap
* pixmap
)
184 wassertrv(pixmap
!= NULL
, None
);
186 return pixmap
->pixmap
;
189 Pixmap
WMGetPixmapMaskXID(WMPixmap
* pixmap
)
191 wassertrv(pixmap
!= NULL
, None
);
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
;
208 WMPixmap
*WMGetSystemPixmap(WMScreen
* scr
, int image
)
212 return WMRetainPixmap(scr
->buttonArrow
);
214 case WSIHighlightedReturnArrow
:
215 return WMRetainPixmap(scr
->pushedButtonArrow
);
217 case WSIScrollerDimple
:
218 return WMRetainPixmap(scr
->scrollerDimple
);
221 return WMRetainPixmap(scr
->leftArrow
);
223 case WSIHighlightedArrowLeft
:
224 return WMRetainPixmap(scr
->hiLeftArrow
);
227 return WMRetainPixmap(scr
->rightArrow
);
229 case WSIHighlightedArrowRight
:
230 return WMRetainPixmap(scr
->hiRightArrow
);
233 return WMRetainPixmap(scr
->upArrow
);
235 case WSIHighlightedArrowUp
:
236 return WMRetainPixmap(scr
->hiUpArrow
);
239 return WMRetainPixmap(scr
->downArrow
);
241 case WSIHighlightedArrowDown
:
242 return WMRetainPixmap(scr
->hiDownArrow
);
245 return WMRetainPixmap(scr
->checkMark
);
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
);