Mercurial > sdl-ios-xcode
changeset 4583:5c925d4f220f
X11_DrawRects now uses a very hacky way of drawing rectangles with XRender. This will be improved in some time.
author | Sunny Sachanandani <sunnysachanandani@gmail.com> |
---|---|
date | Tue, 08 Jun 2010 19:26:32 +0530 |
parents | a17fbd25767b |
children | 9907c8cc6015 |
files | src/video/x11/SDL_x11render.c |
diffstat | 1 files changed, 82 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/src/video/x11/SDL_x11render.c Wed Jun 02 11:55:40 2010 +0530 +++ b/src/video/x11/SDL_x11render.c Tue Jun 08 19:26:32 2010 +0530 @@ -222,10 +222,8 @@ if(!data->xwindow_pict_fmt) { data->xrender_available = SDL_FALSE; } - data->xwindow_pict_attr.graphics_exposures = False; - data->xwindow_pict_attr_valuemask = CPGraphicsExposure; data->xwindow_pict = XRenderCreatePicture(data->display, data->xwindow, data->xwindow_pict_fmt, - data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); + 0, None); if(!data->xwindow_pict) { data->xrender_available = SDL_FALSE; } @@ -286,7 +284,7 @@ if(data->xrender_available == SDL_TRUE) { data->pixmap_picts[i] = XRenderCreatePicture(data->display, data->pixmaps[i], data->xwindow_pict_fmt, - data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); + 0, None); if(!data->pixmap_picts[i]) { data->xrender_available = SDL_FALSE; } @@ -372,7 +370,7 @@ if(data->xrender_available == SDL_TRUE) { data->pixmap_picts[i] = XRenderCreatePicture(data->display, data->pixmaps[i], data->xwindow_pict_fmt, - data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); + 0, None); if(!data->pixmap_picts[i]) { data->xrender_available = SDL_FALSE; } @@ -769,6 +767,18 @@ return SDL_MapRGBA(&data->format, r, g, b, a); } +static XRenderColor +xrenderdrawcolor(SDL_Renderer *renderer) +{ + // Premultiply the color channels as well as modulate them to a 16 bit color space + XRenderColor xrender_color; + xrender_color.red = ((unsigned short)renderer->r + 1) * ((unsigned short)renderer->a + 1) - 1; + xrender_color.green = ((unsigned short)renderer->g + 1) * ((unsigned short)renderer->a + 1) - 1; + xrender_color.blue = ((unsigned short)renderer->b + 1) * ((unsigned short)renderer->a + 1) - 1; + xrender_color.alpha = ((unsigned short)renderer->a + 1) * ((unsigned short)renderer->a + 1) - 1; + return xrender_color; +} + static int X11_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) @@ -973,32 +983,75 @@ clip.w = window->w; clip.h = window->h; - foreground = renderdrawcolor(renderer, 1); - XSetForeground(data->display, data->gc, foreground); - - xrect = xrects = SDL_stack_alloc(XRectangle, count); - xcount = 0; - for (i = 0; i < count; ++i) { - if (!SDL_IntersectRect(rects[i], &clip, &rect)) { - continue; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(data->xrender_available == SDL_TRUE) { + XRenderColor xrender_foreground; + xrender_foreground = xrenderdrawcolor(renderer); + + xrects = SDL_stack_alloc(XRectangle, 4*count); + xcount = 0; + for(i = 0; i < 4*count; i+=4) { + if(!SDL_IntersectRect(rects[i], &clip, &rect)) { + continue; + } + + xrects[xcount].x = rect.x; + xrects[xcount].y = rect.y; + xrects[xcount].width = 1; + xrects[xcount].height = rect.h; + ++xcount; + xrects[xcount].x = rect.x; + xrects[xcount].y = rect.y+rect.h; + xrects[xcount].width = rect.w; + xrects[xcount].height = 1; + ++xcount; + xrects[xcount].x = rect.x+rect.w; + xrects[xcount].y = rect.y; + xrects[xcount].width = 1; + xrects[xcount].height = rect.h; + ++xcount; + xrects[xcount].x = rect.x; + xrects[xcount].y = rect.y; + xrects[xcount].width = rect.w; + xrects[xcount].height = 1; + ++xcount; + if(data->makedirty) { + SDL_AddDirtyRect(&data->dirty, &rect); + } } + XRenderFillRectangles(data->display, PictOpOver, data->drawable_pict, + &xrender_foreground, xrects, xcount); + } + else +#endif + { + foreground = renderdrawcolor(renderer, 1); + XSetForeground(data->display, data->gc, foreground); + + xrect = xrects = SDL_stack_alloc(XRectangle, count); + xcount = 0; + for (i = 0; i < count; ++i) { + if (!SDL_IntersectRect(rects[i], &clip, &rect)) { + continue; + } - xrect->x = (short)rect.x; - xrect->y = (short)rect.y; - xrect->width = (unsigned short)rect.w; - xrect->height = (unsigned short)rect.h; - ++xrect; - ++xcount; - - if (data->makedirty) { - SDL_AddDirtyRect(&data->dirty, &rect); + xrect->x = (short)rect.x; + xrect->y = (short)rect.y; + xrect->width = (unsigned short)rect.w; + xrect->height = (unsigned short)rect.h; + ++xrect; + ++xcount; + + if (data->makedirty) { + SDL_AddDirtyRect(&data->dirty, &rect); + } + } + if (xcount > 0) { + XDrawRectangles(data->display, data->drawable, data->gc, + xrects, xcount); } } - if (xcount > 0) { - XDrawRectangles(data->display, data->drawable, data->gc, - xrects, xcount); - } - SDL_stack_free(xpoints); + SDL_stack_free(xrects); return 0; } @@ -1044,11 +1097,7 @@ if(data->xrender_available == SDL_TRUE) { XRenderColor xrender_foreground_color; - // Premultiply the color channels as well as modulate them to a 16 bit color space - xrender_foreground_color.red = ((unsigned short)renderer->r + 1) * ((unsigned short)renderer->a + 1) - 1; - xrender_foreground_color.green = ((unsigned short)renderer->g + 1) * ((unsigned short)renderer->a + 1) - 1; - xrender_foreground_color.blue = ((unsigned short)renderer->b + 1) * ((unsigned short)renderer->a + 1) - 1; - xrender_foreground_color.alpha = ((unsigned short)renderer->a + 1) * ((unsigned short)renderer->a + 1) - 1; + xrender_foreground_color = xrenderdrawcolor(renderer); XRenderFillRectangles(data->display, PictOpOver, data->drawable_pict, &xrender_foreground_color, xrects, xcount); } @@ -1253,7 +1302,7 @@ if(data->xrender_available == SDL_TRUE) { XRenderComposite(data->display, PictOpOver, data->drawable_pict, None, data->xwindow_pict, - rect->x, rect->y, 0, 0, rect->x, rect->y, rect->w, rect->h); + rect->x, rect->y, 0, 0, rect->x, rect->y, rect->w+1, rect->h+1); } else #endif