weird - identity matrix with 16.16 fixed point DOESNt work for bitmap mask
authorCarsten Haitzler <raster@rasterman.com>
Thu, 11 May 2006 12:48:22 +0000 (12:48 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Thu, 11 May 2006 12:48:22 +0000 (12:48 +0000)
render picutres. need to make an exception. also we still need the extra
pixle to interpolate to. it screws up some example sin e17 (configuration
panel will show it).

SVN revision: 22529

legacy/evas/src/modules/engines/xrender_x11/evas_engine_gradient.c
legacy/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c

index 365fab7..1edc79b 100644 (file)
@@ -164,8 +164,10 @@ void
 _xre_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h, double angle, int spread)
 {
    RGBA_Image *im;
+   int mul_use;
    
    if ((w <= 0) || (h <= 0)) return;
+   if (!rs || !dc || !gr) return;
    
    if ((angle != gr->angle) || (spread != gr->spread) || (gr->changed))
      {
@@ -201,7 +203,10 @@ _xre_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr,
             evas_common_image_free(im);
          }
      }
+   mul_use = dc->mul.use;
+   dc->mul.use = 0;
    if (gr->surface)
      _xr_render_surface_composite(gr->surface, rs, dc, 0, 0, gr->surface->w, gr->surface->h, x, y, w, h, 1);
+   dc->mul.use = mul_use;
    gr->changed = 0;
 }
index 7c8796c..73e17b3 100644 (file)
@@ -11,6 +11,7 @@ _xr_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt,
    Xrender_Surface *rs;
    XRenderPictureAttributes att;
    
+   if ((!xinf) || (!fmt) || (w < 1) || (h < 1)) return NULL;
    rs = calloc(1, sizeof(Xrender_Surface));
    if (!rs) return NULL;
    rs->xinf = xinf;
@@ -21,11 +22,23 @@ _xr_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt,
    rs->depth = fmt->depth;
    rs->allocated = 1;
    rs->draw = XCreatePixmap(xinf->disp, xinf->root, w, h, fmt->depth);
+   if (rs->draw == None)
+     {
+       free(rs);
+       return NULL;
+     }
    rs->xinf->references++;
    att.dither = 0;
    att.component_alpha = 0;
    att.repeat = 0;
    rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, CPRepeat | CPDither | CPComponentAlpha, &att);
+   if (rs->pic == None)
+     {
+       XFreePixmap(rs->xinf->disp, rs->draw);
+       rs->xinf->references--;
+        free(rs);
+       return NULL;
+     }
    return rs;
 }
 
@@ -36,9 +49,11 @@ _xr_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alp
    XRenderPictFormat *fmt;
    XRenderPictureAttributes att;
    
+   if ((!xinf) || (draw == None) || (w < 1) || (h < 1)) return NULL;
    fmt = XRenderFindVisualFormat(xinf->disp, xinf->vis);
    if (!fmt) return NULL;
    rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
    rs->xinf = xinf;
    rs->w = w;
    rs->h = h;
@@ -53,6 +68,12 @@ _xr_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alp
    att.component_alpha = 0;
    att.repeat = 0;
    rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, CPRepeat | CPDither | CPComponentAlpha, &att);
+   if (rs->pic == None)
+     {
+       rs->xinf->references--;
+        free(rs);
+       return NULL;
+     }
    return rs;
 }
 
@@ -62,7 +83,9 @@ _xr_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h,
    Xrender_Surface *rs;
    XRenderPictureAttributes att;
    
+   if ((!xinf) || (!fmt) || (draw == None) || (w < 1) || (h < 1)) return NULL;
    rs = calloc(1, sizeof(Xrender_Surface));
+   if (!rs) return NULL;
    rs->xinf = xinf;
    rs->w = w;
    rs->h = h;
@@ -77,16 +100,28 @@ _xr_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h,
    att.component_alpha = 0;
    att.repeat = 0;
    rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, CPRepeat | CPDither | CPComponentAlpha, &att);
+   if (rs->pic == None)
+     {
+       rs->xinf->references--;
+        free(rs);
+       return NULL;
+     }
    return rs;
 }
 
 void
 _xr_render_surface_free(Xrender_Surface *rs)
 {
-   if (rs->allocated) XFreePixmap(rs->xinf->disp, rs->draw);
-   XRenderFreePicture(rs->xinf->disp, rs->pic);
-   _xr_image_info_free(rs->xinf);
-   rs->xinf = NULL;
+   if (!rs) return;
+   if (rs->xinf)
+     {
+       if ((rs->allocated) && (rs->draw != None))
+          XFreePixmap(rs->xinf->disp, rs->draw);
+       if (rs->pic != None)
+          XRenderFreePicture(rs->xinf->disp, rs->pic);
+       _xr_image_info_free(rs->xinf);
+       rs->xinf = NULL;
+     }
    free(rs);
 }
 
@@ -105,7 +140,7 @@ _xr_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b,
    XRenderColor col;
    int aa;
    
-   aa = a +1;
+   aa = a + 1;
    r = (r * aa) >> 8;
    g = (g * aa) >> 8;
    b = (b * aa) >> 8;
@@ -144,21 +179,21 @@ _xr_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *p
             while (sp < sple)
               {
                  switch (a = A_VAL(sp))
-                 {
-                   case 0:
-                       *p = 0;
-                   break;
-                   case 255:
-                       *p = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | 0xff;
-                   break;
-                   default:
-                       aa = a + 1;
-                       r = ((R_VAL(sp)) * aa) >> 8;
-                       g = ((G_VAL(sp)) * aa) >> 8;
-                       b = ((B_VAL(sp)) * aa) >> 8;
-                       *p = (b << 24) | (g << 16) | (r << 8) | a;
-                   break;
-                 }
+                   {
+                    case 0:
+                      *p = 0;
+                      break;
+                    case 255:
+                      *p = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | 0xff;
+                      break;
+                    default:
+                      aa = a + 1;
+                      r = ((R_VAL(sp)) * aa) >> 8;
+                      g = ((G_VAL(sp)) * aa) >> 8;
+                      b = ((B_VAL(sp)) * aa) >> 8;
+                      *p = (b << 24) | (g << 16) | (r << 8) | a;
+                      break;
+                   }
                  p++;
                  sp++;
               }
@@ -173,22 +208,20 @@ _xr_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *p
             sple = sp + w;
             while (sp < sple)
               {
-                 switch (a = A_VAL(sp))
-                 {
-                   case 0:
-                       *p = 0;
-                   break;
-                   case 255:
-                       *p = *sp;
-                   break;
-                   default:
-                       aa = a + 1;
-                       r = ((R_VAL(sp)) * aa) >> 8;
-                       g = ((G_VAL(sp)) * aa) >> 8;
-                       b = ((B_VAL(sp)) * aa) >> 8;
-                       *p = (a << 24) | (r << 16) | (g << 8) | b;
-                   break;
-                 }
+                 switch (a = (*sp & 0xff000000))
+                   {
+                    case 0:
+                      *p = 0;
+                      break;
+                    case 0xff000000:
+                      *p = *sp;
+                      break;
+                    default:
+                      aa = (a >> 24) + 1;
+                      *p = a + (((((*sp) >> 8) & 0xff) * aa) & 0xff00) + 
+                        (((((*sp) & 0x00ff00ff) * aa) >> 8) & 0x00ff00ff);
+                      break;
+                   }
                  p++;
                  sp++;
               }
@@ -240,7 +273,7 @@ _xr_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pi
             sple = sp + w;
             while (sp < sple)
               {
-                 *p = 0xff000000 | ((R_VAL(sp)) << 16) | ((G_VAL(sp)) << 8) | (B_VAL(sp));
+                 *p = 0xff000000 | *sp;
                  p++;
                  sp++;
               }
@@ -362,9 +395,11 @@ _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Dr
                  xf.matrix[2][2] = 1 << 16;
                  if ((srs->alpha) || (a != 0xff))
                    trs = _xr_render_surface_new(srs->xinf, sw + 1, sh + 1,
+//                 trs = _xr_render_surface_new(srs->xinf, sw, sh,
                                                 srs->xinf->fmt32, 1);
                  else
                    trs = _xr_render_surface_new(srs->xinf, sw + 1, sh + 1,
+//                 trs = _xr_render_surface_new(srs->xinf, sw, sh,
                                                 srs->fmt, srs->alpha);
                  XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
                  XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
@@ -448,19 +483,25 @@ _xr_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int
 {
    XTransform xf;
    XRenderPictureAttributes att;
-
+   int ident;
+   
    if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return;
-   xf.matrix[0][0] = 1;
+   ident = 1 << 16;
+   /* FIXME: why do we need to change the identity matrix ifthe src surface
+    * is 1 bit deep?
+    */
+   if (srs->depth == 1) ident = 1;
+   xf.matrix[0][0] = ident;
    xf.matrix[0][1] = 0;
    xf.matrix[0][2] = 0;
    
    xf.matrix[1][0] = 0;
-   xf.matrix[1][1] = 1;
+   xf.matrix[1][1] = ident;
    xf.matrix[1][2] = 0;
    
    xf.matrix[2][0] = 0;
    xf.matrix[2][1] = 0;
-   xf.matrix[2][2] = 1;
+   xf.matrix[2][2] = ident;
    
    XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
    att.clip_mask = None;
@@ -479,13 +520,13 @@ _xr_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, in
    XRenderPictureAttributes att;
    int r, g, b, a, aa, op;
 
-   if ((w <= 0) || (h <= 0)) return;
+   if ((w <= 0) || (h <= 0) || (!rs) || (!dc)) return;
    a = (dc->col.col >> 24) & 0xff;
    if (a == 0) return;
    r = (dc->col.col >> 16) & 0xff;
    g = (dc->col.col >> 8 ) & 0xff;
    b = (dc->col.col      ) & 0xff;
-   aa = a +1;
+   aa = a + 1;
    r = (r * aa) >> 8;
    g = (g * aa) >> 8;
    b = (b * aa) >> 8;
@@ -508,6 +549,7 @@ _xr_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1,
    XRenderPictureAttributes att;
    int op;
    
+   if ((!rs) || (!dc)) return;
    op = PictOpSrc;
    att.clip_mask = None;
    XRenderChangePicture(rs->xinf->disp, rs->pic, CPClipMask, &att);
@@ -565,6 +607,7 @@ _xre_poly_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *p
    XRenderPictureAttributes att;
    int op;
    
+   if ((!rs) || (!dc)) return;
    op = PictOpSrc;
    num = 0;
    for (pt = points; pt; pt = (RGBA_Polygon_Point *)(((Evas_Object_List *)pt)->next)) num++;