- paint = x_paint;
-
- render_depth = DefaultDepth(ob_display, ob_screen);
- render_visual = DefaultVisual(ob_display, ob_screen);
- render_colormap = DefaultColormap(ob_display, ob_screen);
-
- if (render_depth < 8) {
- XVisualInfo vinfo_template, *vinfo_return;
- /* search for a TrueColor Visual... if we can't find one...
- we will use the default visual for the screen */
- int vinfo_nitems;
- int best = -1;
-
- vinfo_template.screen = ob_screen;
- vinfo_template.class = TrueColor;
- vinfo_return = XGetVisualInfo(ob_display,
- VisualScreenMask | VisualClassMask,
- &vinfo_template, &vinfo_nitems);
- if (vinfo_return) {
- int i;
- int max_depth = 1;
- for (i = 0; i < vinfo_nitems; ++i) {
- if (vinfo_return[i].depth > max_depth) {
- if (max_depth == 24 && vinfo_return[i].depth > 24)
- break; /* prefer 24 bit over 32 */
- max_depth = vinfo_return[i].depth;
- best = i;
- }
+ gint i, transferred = 0, force_transfer = 0;
+ Pixmap oldp = None;
+ RrRect tarea; /* area in which to draw textures */
+ gboolean resized;
+
+ if (w <= 0 || h <= 0) return None;
+
+ if (a->surface.parentx < 0 || a->surface.parenty < 0) {
+ /* ob_debug("Invalid parent co-ordinates\n"); */
+ return None;
+ }
+
+ if (a->surface.grad == RR_SURFACE_PARENTREL &&
+ (a->surface.parentx >= a->surface.parent->w ||
+ a->surface.parenty >= a->surface.parent->h))
+ {
+ return None;
+ }
+
+ resized = (a->w != w || a->h != h);
+
+ oldp = a->pixmap; /* save to free after changing the visible pixmap */
+ a->pixmap = XCreatePixmap(RrDisplay(a->inst),
+ RrRootWindow(a->inst),
+ w, h, RrDepth(a->inst));
+
+ g_assert(a->pixmap != None);
+ a->w = w;
+ a->h = h;
+
+ if (a->xftdraw != NULL)
+ XftDrawDestroy(a->xftdraw);
+ a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap,
+ RrVisual(a->inst), RrColormap(a->inst));
+ g_assert(a->xftdraw != NULL);
+
+ if (resized) {
+ g_free(a->surface.pixel_data);
+ a->surface.pixel_data = g_new(RrPixel32, w * h);
+ }
+
+ RrRender(a, w, h);
+
+ {
+ gint l, t, r, b;
+ RrMargins(a, &l, &t, &r, &b);
+ RECT_SET(tarea, l, t, w - l - r, h - t - b);
+ }
+
+ for (i = 0; i < a->textures; i++) {
+ switch (a->texture[i].type) {
+ case RR_TEXTURE_NONE:
+ break;
+ case RR_TEXTURE_TEXT:
+ if (!transferred) {
+ transferred = 1;
+ if ((a->surface.grad != RR_SURFACE_SOLID)
+ || (a->surface.interlaced))
+ pixel_data_to_pixmap(a, 0, 0, w, h);
+ }
+ if (a->xftdraw == NULL) {
+ a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap,
+ RrVisual(a->inst),
+ RrColormap(a->inst));
+ }
+ RrFontDraw(a->xftdraw, &a->texture[i].data.text, &tarea);
+ break;
+ case RR_TEXTURE_LINE_ART:
+ if (!transferred) {
+ transferred = 1;
+ if ((a->surface.grad != RR_SURFACE_SOLID)
+ || (a->surface.interlaced))
+ pixel_data_to_pixmap(a, 0, 0, w, h);
+ }
+ XDrawLine(RrDisplay(a->inst), a->pixmap,
+ RrColorGC(a->texture[i].data.lineart.color),
+ a->texture[i].data.lineart.x1,
+ a->texture[i].data.lineart.y1,
+ a->texture[i].data.lineart.x2,
+ a->texture[i].data.lineart.y2);
+ break;
+ case RR_TEXTURE_MASK:
+ if (!transferred) {
+ transferred = 1;
+ if ((a->surface.grad != RR_SURFACE_SOLID)
+ || (a->surface.interlaced))
+ pixel_data_to_pixmap(a, 0, 0, w, h);
+ }
+ RrPixmapMaskDraw(a->pixmap, &a->texture[i].data.mask, &tarea);
+ break;
+ case RR_TEXTURE_RGBA:
+ g_assert(!transferred);
+ RrImageDraw(a->surface.pixel_data,
+ &a->texture[i].data.rgba,
+ a->w, a->h,
+ &tarea);
+ force_transfer = 1;
+ break;
+ }
+ }
+
+ if (!transferred) {
+ transferred = 1;
+ if ((a->surface.grad != RR_SURFACE_SOLID) || (a->surface.interlaced) ||
+ force_transfer)
+ {
+ pixel_data_to_pixmap(a, 0, 0, w, h);