patches/cairo-02-8bit-fix.diff
author dcarbery
Fri, 24 Nov 2006 16:37:59 +0000
branch217update
changeset 19096 d542fc2c823e
parent 8219 7a2b0d7d65fe
child 9690 db254913d306
child 19029 f9c75e0c3153
permissions -rw-r--r--
Merged trunk changes r9797:9829 into 217update branch.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
     1
diff -Nrup cairo-1.2.4/src/cairo-xlib-surface.c ../SUNWgnome-base-libs-2.16.0-compiled/cairo-1.2.4/src/cairo-xlib-surface.c
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
     2
--- cairo-1.2.4/src/cairo-xlib-surface.c	2006-08-18 16:20:16.000000000 +0200
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
     3
+++ ../SUNWgnome-base-libs-2.16.0-compiled/cairo-1.2.4/src/cairo-xlib-surface.c	2006-09-26 18:41:14.604976000 +0200
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
     4
@@ -81,6 +81,8 @@ _cairo_xlib_surface_show_glyphs (void   
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
     5
 
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
     6
 #define CAIRO_ASSUME_PIXMAP	20
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
     7
 
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
     8
+struct clut_r3g3b2;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
     9
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    10
 struct _cairo_xlib_surface {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    11
     cairo_surface_t base;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    12
 
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
    13
@@ -126,6 +128,9 @@ struct _cairo_xlib_surface {
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    14
     int num_clip_rects;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    15
 
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
    16
     XRenderPictFormat *xrender_format;
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    17
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    18
+    struct clut_r3g3b2 *clut;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    19
+    int workaround;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    20
 };
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    21
 
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    22
 #define CAIRO_SURFACE_RENDER_AT_LEAST(surface, major, minor)	\
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
    23
@@ -504,6 +509,158 @@ _swap_ximage_to_native (XImage *ximage)
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    24
     }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    25
 }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    26
 
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    27
+#if 0
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    28
+static void _set_optimal_cmap(Display *dpy, Colormap cmap) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    29
+    int i, r, g, b;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    30
+    XColor cm[256];
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    31
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    32
+    for (i = 0; i < 256; i++) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    33
+	r = i >> 5;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    34
+	g = (i >> 2) & 0x7;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    35
+	b = (i << 1) & 0x7;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    36
+	cm[i].pixel = i;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    37
+	cm[i].flags = DoRed | DoGreen | DoBlue;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    38
+	cm[i].red   = r << 13 | r << 10 | r << 7 | r << 4 | r << 1 | r >> 2;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    39
+	cm[i].green = g << 13 | g << 10 | g << 7 | g << 4 | g << 1 | g >> 2;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    40
+	cm[i].blue  = b << 13 | b << 10 | b << 7 | b << 4 | b << 1 | b >> 2;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    41
+    }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    42
+    XStoreColors(dpy, cmap, cm, 256);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    43
+}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    44
+#endif
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    45
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    46
+struct clut_r3g3b2 {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    47
+    struct clut_r3g3b2 *next;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    48
+    Display            *dpy;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    49
+    Colormap           cmap;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    50
+    uint32_t           clut[256];
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    51
+    unsigned char      ilut[256];
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    52
+};
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    53
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    54
+static struct clut_r3g3b2 * _get_clut_r3g3b2(Display *dpy, Colormap cmap) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    55
+    static struct clut_r3g3b2 *first = NULL;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    56
+    int i,j, min, d;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    57
+    struct clut_r3g3b2 *clut;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    58
+    unsigned char r,g,b, r2,g2,b2;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    59
+    
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    60
+    clut = first;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    61
+    while(clut) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    62
+	if ( clut->dpy == dpy && clut->cmap == cmap )
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    63
+	    return clut;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    64
+	clut = clut->next;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    65
+    }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    66
+    
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    67
+    clut = calloc(1, sizeof(*clut));
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    68
+    if(clut == NULL)
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    69
+	return NULL;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    70
+    
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    71
+    clut->next = first;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    72
+    clut->dpy = dpy;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    73
+    clut->cmap = cmap;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    74
+    first = clut;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    75
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    76
+    /* Construct the clut from Colormap */
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    77
+    for (i = 0; i < 256; i++) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    78
+	XColor xcol;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    79
+	xcol.pixel = i;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    80
+	XQueryColor(dpy, cmap, &xcol);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    81
+	clut->clut[i] = ( ( ((uint32_t)xcol.red   & 0xff00 ) << 8) |
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    82
+			  ( ((uint32_t)xcol.green & 0xff00 ) ) |
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    83
+			  ( ((uint32_t)xcol.blue  & 0xff00 ) >> 8) );
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    84
+    }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    85
+    /*
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    86
+      
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    87
+    Find the best matching color in the colormap for all r3g3b2
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    88
+    values. The distance is maybe not perceptively valid, but it
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    89
+    should not be too bad.
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    90
+    
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    91
+    */
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    92
+    for (i = 0; i < 256; i++) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    93
+	r = i >> 5;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    94
+	g = (i >> 2) & 0x7;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    95
+	b = (i << 1) & 0x7;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    96
+	min = 255;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    97
+	for(j = 0; j < 256; j++) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    98
+	    r2 = (clut->clut[j] & 0xff0000) >> 21;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
    99
+	    g2 = (clut->clut[j] & 0x00ff00) >> 13;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   100
+	    b2 = (clut->clut[j] & 0x0000ff) >> 5;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   101
+	    if ( r2 == r && g2 == g && (b2 & 0x6) == b ) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   102
+		clut->ilut[i] = j;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   103
+		break;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   104
+	    }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   105
+	    /*
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   106
+	      Squares make higher bits much more important than lower
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   107
+	      ones.
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   108
+	    */
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   109
+	    d  = (r2 ^ r) * (r2 ^ r);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   110
+	    d += (g2 ^ g) * (g2 ^ g);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   111
+	    d += (b2 ^ b) * (b2 ^ b);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   112
+	    if(d < min) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   113
+		clut->ilut[i] = j;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   114
+		min = d;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   115
+	    }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   116
+	}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   117
+    }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   118
+    
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   119
+    return clut;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   120
+}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   121
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   122
+static const char * _visualClass[] = {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   123
+    "StaticGray",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   124
+    "GrayScale",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   125
+    "StaticColor",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   126
+    "PseudoColor",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   127
+    "TrueColor",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   128
+    "DirectColor"
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   129
+};
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   130
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   131
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   132
+static void _print_visual(Visual *v) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   133
+    printf("Visual: class=%s, bpRGB=%i, CM=%i, r=%lx, g=%lx, b=%lx\n",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   134
+	   _visualClass[v->class],
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   135
+	   v->bits_per_rgb,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   136
+	   v->map_entries,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   137
+	   v->red_mask, v->green_mask, v->blue_mask);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   138
+}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   139
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   140
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   141
+#if 0
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   142
+static void _print_ximage(XImage *x) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   143
+    const char * format[] = { "XYBitmap", "XYPixmap", "ZPixmap" };
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   144
+    printf("XImage: size=(%i,%i), xoffset=%i, format=%s, depth=%i, bpp=%i, stride=%i\n        r=%lx, g=%lx, b=%lx, unit=%i, pad=%i\n",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   145
+	   x->width,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   146
+	   x->height,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   147
+	   x->xoffset,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   148
+	   format[x->format],
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   149
+	   x->depth,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   150
+	   x->bits_per_pixel,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   151
+	   x->bytes_per_line,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   152
+	   x->red_mask, x->green_mask, x->blue_mask,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   153
+	   x->bitmap_unit, x->bitmap_pad);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   154
+}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   155
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   156
+const char * _cairoFormats[] = { "ARGB32", "RGB24", "A8", "A1" };
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   157
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   158
+static void _print_cairoimage(cairo_image_surface_t *i) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   159
+    
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   160
+    printf("CairoImage: size=(%i,%i), format=%s, depth=%i, stride=%i\n",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   161
+	   i->width,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   162
+	   i->height,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   163
+	   _cairoFormats[i->format],
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   164
+	   i->depth,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   165
+	   i->stride);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   166
+}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   167
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   168
+static void _print_cairomasks(cairo_format_masks_t *m) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   169
+    printf("CairoFormatMask: bpp=%i, a=%lx, r=%lx, g=%lx, b=%lx\n",
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   170
+	   m->bpp, m->alpha_mask, m->red_mask, m->green_mask, m->blue_mask);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   171
+}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   172
+#endif
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   173
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   174
+#define WORKAROUND_NONE           0
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   175
+#define WORKAROUND_8BIT_GRAYLEVEL 1
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   176
+#define WORKAROUND_8BIT_PALETTE   2
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   177
+#define WORKAROUND_R5G6B5         3
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   178
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   179
 static cairo_status_t
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   180
 _get_image_surface (cairo_xlib_surface_t    *surface,
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   181
 		    cairo_rectangle_int16_t *interest_rect,
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   182
@@ -657,20 +814,127 @@ _get_image_surface (cairo_xlib_surface_t
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   183
     }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   184
     else
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   185
     {
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   186
+       /*
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   187
+        * Otherwise, we construct a buffer containing RGB24 data
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   188
+        * using the specified workaround.
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   189
+        */
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   190
+       uint32_t *data, *dst, *clut;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   191
+       uint8_t  *src8;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   192
+       uint16_t *src16;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   193
+       int i,j;
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   194
+
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   195
+       if(surface->visual == NULL) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   196
+           printf("No visual for surface\n");
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   197
+           goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   198
+       }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   199
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   200
+       if (surface->workaround == WORKAROUND_NONE) {
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   201
+         /*printf("No workaround for this pixel format: ");
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   202
+           _print_visual(surface->visual);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   203
+           goto FAIL;*/
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   204
 	/*
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   205
 	 * XXX This can't work.  We must convert the data to one of the
7463
986247427d5d 2006-06-16 Erwann Chenede - <[email protected]>
erwannc
parents: 7421
diff changeset
   206
 	 * supported pixman formats.  Pixman needs another function
986247427d5d 2006-06-16 Erwann Chenede - <[email protected]>
erwannc
parents: 7421
diff changeset
   207
 	 * which takes data in an arbitrary format and converts it
986247427d5d 2006-06-16 Erwann Chenede - <[email protected]>
erwannc
parents: 7421
diff changeset
   208
 	 * to something supported by that library.
986247427d5d 2006-06-16 Erwann Chenede - <[email protected]>
erwannc
parents: 7421
diff changeset
   209
 	 */
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   210
-	image = (cairo_image_surface_t*)
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   211
-	    _cairo_image_surface_create_with_masks ((unsigned char *) ximage->data,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   212
-						    &masks,
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   213
-						    ximage->width,
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   214
-						    ximage->height,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   215
-						    ximage->bytes_per_line);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   216
-	if (image->base.status)
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   217
-	    goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   218
+         image = (cairo_image_surface_t*) _cairo_image_surface_create_with_masks ((unsigned char *) ximage->data,
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   219
+                       &masks,
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   220
+                       ximage->width,
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   221
+                       ximage->height,
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   222
+                       ximage->bytes_per_line);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   223
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   224
+         if (image->base.status)
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   225
+           goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   226
+         /* Let the surface take ownership of the data */
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   227
+         _cairo_image_surface_assume_ownership_of_data (image);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   228
+         ximage->data = NULL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   229
+         XDestroyImage (ximage);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   230
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   231
+         *image_out = image;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   232
+         return CAIRO_STATUS_SUCCESS;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   233
+       }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   234
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   235
+       data = (uint32_t*)malloc(ximage->height * ximage->width * 4);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   236
+       if(data == NULL) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   237
+           printf("Cannot allocate RGB buffer\n");
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   238
+           goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   239
+       }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   240
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   241
+       switch (surface->workaround) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   242
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   243
+       case WORKAROUND_8BIT_GRAYLEVEL:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   244
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   245
+           dst = data;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   246
+           for(j = 0; j < ximage->height; j++) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   247
+               src8 = (uint8_t *) (ximage->data + ximage->bytes_per_line * j);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   248
+               for(i = 0; i < ximage->width; i++) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   249
+                   *dst++ = (*src8 << 16) | (*src8 << 8) | *src8;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   250
+                   src8++;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   251
+               }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   252
+           }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   253
+           break;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   254
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   255
+       case WORKAROUND_8BIT_PALETTE:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   256
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   257
+           if(surface->clut == NULL) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   258
+               surface->clut = _get_clut_r3g3b2(
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   259
+                   surface->dpy,
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   260
+                   DefaultColormapOfScreen(surface->screen));
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   261
+           }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   262
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   263
+           if(surface->clut == NULL) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   264
+               free(data);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   265
+               goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   266
+           }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   267
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   268
+           clut = surface->clut->clut;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   269
+           src8 = (uint8_t*) ximage->data;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   270
+           dst = data;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   271
+           for(j = 0; j < ximage->height; j++) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   272
+               for(i = 0; i < ximage->width; i++)
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   273
+                   *dst++ = clut[src8[i]];
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   274
+               src8 += ximage->bytes_per_line;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   275
+           }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   276
+           break;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   277
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   278
+       case WORKAROUND_R5G6B5:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   279
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   280
+           src16 = (uint16_t*)ximage->data;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   281
+           dst = data;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   282
+           for(j = 0; j < ximage->height; j++) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   283
+               for(i = 0; i < ximage->width; i++) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   284
+                              *dst++ = ( ( ((src16[i] & 0xf800) << 8) | ((src16[i] & 0xe000) << 3) ) |
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   285
+                              ( ((src16[i] & 0x07e0) << 5) | ((src16[i] & 0x0600) >> 1) ) |
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   286
+                              ( ((src16[i] & 0x001f) << 3) | ((src16[i] & 0x001f) >> 2) ) );
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   287
+               }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   288
+               src16 += ximage->bytes_per_line / sizeof(*src16);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   289
+           }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   290
+           break;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   291
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   292
+       default:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   293
+           printf("Dunno what to do with: ");
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   294
+           _print_visual(surface->visual);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   295
+           goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   296
+       }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   297
+       free(ximage->data);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   298
+        image = (cairo_image_surface_t*)
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   299
+        cairo_image_surface_create_for_data((unsigned char *)data, CAIRO_FORMAT_RGB24, ximage->width, ximage->height, ximage->width*4);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   300
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   301
+       if (image->base.status) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   302
+           printf("Failed!\n");
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   303
+           free(data);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   304
+           goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   305
+       }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   306
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   307
+        cairo_image_surface_create_for_data((unsigned char *)data, CAIRO_FORMAT_RGB24, ximage->width, ximage->height, ximage->width*4);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   308
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   309
+       if (image->base.status) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   310
+           printf("Failed!\n");
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   311
+           free(data);
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   312
+            goto FAIL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   313
+       }
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   314
+
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   315
     }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   316
 
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   317
     /* Let the surface take ownership of the data */
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   318
@@ -743,29 +1007,129 @@ _cairo_xlib_surface_ensure_gc (cairo_xli
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   319
     _cairo_xlib_surface_set_gc_clip_rects (surface);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   320
 }
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   321
 
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   322
+static int
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   323
+make_space_for(unsigned char ** buf, int *size, int *stride, int width, int height, int Bpp) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   324
+    unsigned char * data;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   325
+    int l;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   326
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   327
+    *stride = width * Bpp;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   328
+    if(*stride%4)
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   329
+        *stride += 4 - *stride % 4;
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   330
+    l = (*stride * height);
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   331
+    if (*size < l) {
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   332
+        if(*buf)
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   333
+            data = realloc(*buf, l);
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   334
+        else
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   335
+            data = malloc(l);
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   336
+        if(data) {
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   337
+            *buf = data;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   338
+            *size = l;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   339
+        } else {
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   340
+            return -1;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   341
+        }
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   342
+    }
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   343
+    return 0;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   344
+}
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   345
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   346
 static cairo_status_t
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   347
 _draw_image_surface (cairo_xlib_surface_t   *surface,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   348
 		     cairo_image_surface_t  *image,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   349
 		     int                    dst_x,
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   350
 		     int                    dst_y)
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   351
 {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   352
+    static unsigned char *buf = NULL;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   353
+    static int size = 0;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   354
     XImage ximage;
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   355
-    unsigned int bpp, alpha, red, green, blue;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   356
+    unsigned int bpp, alpha, red, green, blue, stride, depth, i, j;
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   357
+    unsigned char *data, *c, *ilut;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   358
+    uint32_t *src;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   359
+    uint8_t *dst8;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   360
+    uint16_t *dst16;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   361
     int native_byte_order = _native_byte_order_lsb () ? LSBFirst : MSBFirst;
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   362
 
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   363
     pixman_format_get_masks (pixman_image_get_format (image->pixman_image),
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   364
 			     &bpp, &alpha, &red, &green, &blue);
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   365
 
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   366
+    switch(surface->workaround) {
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   367
+    case WORKAROUND_NONE:
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   368
+        /* Default behaviour is supposed to work */
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   369
+        stride = image->stride;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   370
+        depth = image->depth;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   371
+        data = image->data;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   372
+        break;
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   373
+
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   374
+    case WORKAROUND_8BIT_GRAYLEVEL:
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   375
+
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   376
+        if (make_space_for(&buf, &size, &stride, image->width, image->height, 1))
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   377
+            return CAIRO_STATUS_NO_MEMORY;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   378
+        data = buf;
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   379
+
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   380
+       for(j=0;j<image->height;j++) {
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   381
+            src = image->data;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   382
+            dst8 = data + j * stride;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   383
+            for(i=0;i<image->width;i++) {
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   384
+                /* XXX use correct factor for each channel */
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   385
+                dst8[i] = ( ((*src >> 16) & 0xff) +
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   386
+                            ((*src >> 8) & 0xff) +
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   387
+                            (*src & 0xff) ) / 3;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   388
+                src++;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   389
+            }
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   390
+        }
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   391
+
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   392
+        alpha = red = green = blue = 0;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   393
+        depth = bpp = 8;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   394
+        break;
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   395
+
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   396
+    case WORKAROUND_8BIT_PALETTE:
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   397
+
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   398
+        if (make_space_for(&buf, &size, &stride, image->width, image->height, 1))
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   399
+            return CAIRO_STATUS_NO_MEMORY;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   400
+        data = buf;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   401
+        src = image->data;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   402
+        ilut = surface->clut->ilut;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   403
+        for(j=0;j<image->height;j++) {
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   404
+            dst8 = data + j * stride;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   405
+            for(i=0;i<image->width;i++) {
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   406
+                dst8[i] = ilut[ ((*src >> 16) & 0xe0) |
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   407
+                                ((*src >> 11) & 0x1c) |
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   408
+                                ((*src >> 6)  & 0x03) ];
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   409
+                src++;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   410
+            }
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   411
+        }
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   412
+        alpha = red = green = blue = 0;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   413
+        depth = bpp = 8;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   414
+        break;
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   415
+
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   416
+    case WORKAROUND_R5G6B5:
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   417
+        if (make_space_for(&buf, &size, &stride, image->width, image->height, 2))
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   418
+            return CAIRO_STATUS_NO_MEMORY;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   419
+        data = buf;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   420
+        src = image->data;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   421
+        for(j=0;j<image->height;j++) {
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   422
+            dst16 = (uint16_t*)(data + j * stride);
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   423
+            for(i=0;i<image->width;i++) {
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   424
+                dst16[i] = ( ((*src >> 8) & 0xf800) |
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   425
+                             ((*src >> 5) & 0x07e0) |
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   426
+                             ((*src >> 3) & 0x001f) );
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   427
+                src++;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   428
+            }
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   429
+        }
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   430
+        alpha = 0; red = 0xf800; green = 0x07e0; blue = 0x001f;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   431
+        depth = bpp = 16;
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   432
+        break;
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   433
+
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   434
+    }
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   435
+
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   436
     ximage.width = image->width;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   437
     ximage.height = image->height;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   438
     ximage.format = ZPixmap;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   439
-    ximage.data = (char *)image->data;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   440
+    ximage.data = data;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   441
     ximage.byte_order = native_byte_order;
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   442
     ximage.bitmap_unit = 32;	/* always for libpixman */
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   443
     ximage.bitmap_bit_order = native_byte_order;
7900
aeeb2b424df4 2006-08-11 Damien Carbery <[email protected]>
dc144907
parents: 7676
diff changeset
   444
     ximage.bitmap_pad = 32;	/* always for libpixman */
7421
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   445
-    ximage.depth = image->depth;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   446
-    ximage.bytes_per_line = image->stride;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   447
+    ximage.depth = depth;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   448
+    ximage.bytes_per_line = stride;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   449
     ximage.bits_per_pixel = bpp;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   450
     ximage.red_mask = red;
d6ca71648198 2006-06-09 Erwann Chenede - <[email protected]>
erwannc
parents:
diff changeset
   451
     ximage.green_mask = green;
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   452
@@ -1891,6 +2255,36 @@ _cairo_xlib_surface_create_internal (Dis
7567
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   453
     surface->clip_rects = NULL;
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   454
     surface->num_clip_rects = 0;
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   455
 
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   456
+    surface->clut = NULL;
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   457
+    surface->workaround = WORKAROUND_NONE;
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   458
+
7676
38403698b3d9 format member renamed to xrender_format.
dc144907
parents: 7673
diff changeset
   459
+    if (surface->xrender_format == NULL) {
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   460
+       /* Install the correct workaround */
7567
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   461
+      if (visual) {
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   462
+       switch (visual->class) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   463
+       case StaticGray:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   464
+       case GrayScale:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   465
+           surface->workaround = WORKAROUND_8BIT_GRAYLEVEL;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   466
+           break;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   467
+       case PseudoColor:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   468
+       case StaticColor:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   469
+           surface->workaround = WORKAROUND_8BIT_PALETTE;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   470
+           break;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   471
+       case TrueColor:
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   472
+           if (visual->red_mask   == 0xf800 &&
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   473
+               visual->green_mask == 0x07e0 &&
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   474
+               visual->blue_mask  == 0x001f) {
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   475
+               surface->workaround = WORKAROUND_R5G6B5;
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   476
+               }
7567
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   477
+
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   478
+       }
7567
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   479
+      }
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   480
+    }
8219
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   481
+    else if (depth == 8)
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   482
+      {
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   483
+	surface->workaround = WORKAROUND_8BIT_PALETTE;
7a2b0d7d65fe 2006-09-28 Erwann Chenede - <[email protected]>
erwannc
parents: 7900
diff changeset
   484
+      }
7673
eac137a5cb41 2006-07-20 Damien Carbery <[email protected]>
dc144907
parents: 7567
diff changeset
   485
+
7567
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   486
     return (cairo_surface_t *) surface;
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   487
 }
8c05cbe6c7bb 2006-07-03 Erwann Chenede - <[email protected]>
erwannc
parents: 7463
diff changeset
   488