Merge branch 'master' of /home/nchip/public_html/qemu into garage-push
[qemu] / vnchextile.h
index 7277670..f5b6fcb 100644 (file)
@@ -1,22 +1,30 @@
 #define CONCAT_I(a, b) a ## b
 #define CONCAT(a, b) CONCAT_I(a, b)
 #define pixel_t CONCAT(uint, CONCAT(BPP, _t))
-
-static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
-                                           int x, int y, int w, int h,
-                                           pixel_t *last_bg, pixel_t *last_fg,
-                                           int *has_bg, int *has_fg)
+#ifdef GENERIC
+#define NAME CONCAT(generic_, BPP)
+#else
+#define NAME BPP
+#endif
+
+static void CONCAT(send_hextile_tile_, NAME)(VncState *vs,
+                                             int x, int y, int w, int h,
+                                             void *last_bg_,
+                                             void *last_fg_,
+                                             int *has_bg, int *has_fg)
 {
-    char *row = (vs->ds->data + y * vs->ds->linesize + x * vs->depth);
+    uint8_t *row = vs->server.ds->data + y * ds_get_linesize(vs->ds) + x * ds_get_bytes_per_pixel(vs->ds);
     pixel_t *irow = (pixel_t *)row;
     int j, i;
+    pixel_t *last_bg = (pixel_t *)last_bg_;
+    pixel_t *last_fg = (pixel_t *)last_fg_;
     pixel_t bg = 0;
     pixel_t fg = 0;
     int n_colors = 0;
     int bg_count = 0;
     int fg_count = 0;
     int flags = 0;
-    uint8_t data[(sizeof(pixel_t) + 2) * 16 * 16];
+    uint8_t data[(vs->clientds.pf.bytes_per_pixel + 2) * 16 * 16];
     int n_data = 0;
     int n_subtiles = 0;
 
@@ -49,7 +57,7 @@ static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
        }
        if (n_colors > 2)
            break;
-       irow += vs->ds->linesize / sizeof(pixel_t);
+       irow += ds_get_linesize(vs->ds) / sizeof(pixel_t);
     }
 
     if (n_colors > 1 && fg_count > bg_count) {
@@ -78,7 +86,7 @@ static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
        flags |= 0x08;
 
        irow = (pixel_t *)row;
-       
+
        for (j = 0; j < h; j++) {
            int min_x = -1;
            for (i = 0; i < w; i++) {
@@ -97,7 +105,7 @@ static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
                n_data += 2;
                n_subtiles++;
            }
-           irow += vs->ds->linesize / sizeof(pixel_t);
+           irow += ds_get_linesize(vs->ds) / sizeof(pixel_t);
        }
        break;
     case 3:
@@ -111,7 +119,7 @@ static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
        for (j = 0; j < h; j++) {
            int has_color = 0;
            int min_x = -1;
-           pixel_t color;
+           pixel_t color = 0; /* shut up gcc */
 
            for (i = 0; i < w; i++) {
                if (!has_color) {
@@ -122,10 +130,15 @@ static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
                    has_color = 1;
                } else if (irow[i] != color) {
                    has_color = 0;
-
+#ifdef GENERIC
+                    vnc_convert_pixel(vs, data + n_data, color);
+                    n_data += vs->clientds.pf.bytes_per_pixel;
+#else
                    memcpy(data + n_data, &color, sizeof(color));
-                   hextile_enc_cord(data + n_data + sizeof(pixel_t), min_x, j, i - min_x, 1);
-                   n_data += 2 + sizeof(pixel_t);
+                    n_data += sizeof(pixel_t);
+#endif
+                   hextile_enc_cord(data + n_data, min_x, j, i - min_x, 1);
+                   n_data += 2;
                    n_subtiles++;
 
                    min_x = -1;
@@ -137,12 +150,18 @@ static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
                }
            }
            if (has_color) {
-               memcpy(data + n_data, &color, sizeof(color));
-               hextile_enc_cord(data + n_data + sizeof(pixel_t), min_x, j, i - min_x, 1);
-               n_data += 2 + sizeof(pixel_t);
+#ifdef GENERIC
+                vnc_convert_pixel(vs, data + n_data, color);
+                n_data += vs->clientds.pf.bytes_per_pixel;
+#else
+                memcpy(data + n_data, &color, sizeof(color));
+                n_data += sizeof(pixel_t);
+#endif
+               hextile_enc_cord(data + n_data, min_x, j, i - min_x, 1);
+               n_data += 2;
                n_subtiles++;
            }
-           irow += vs->ds->linesize / sizeof(pixel_t);
+           irow += ds_get_linesize(vs->ds) / sizeof(pixel_t);
        }
 
        /* A SubrectsColoured subtile invalidates the foreground color */
@@ -169,21 +188,22 @@ static void CONCAT(send_hextile_tile_, BPP)(VncState *vs,
     vnc_write_u8(vs, flags);
     if (n_colors < 4) {
        if (flags & 0x02)
-           vnc_write(vs, last_bg, sizeof(pixel_t));
+           vs->write_pixels(vs, last_bg, sizeof(pixel_t));
        if (flags & 0x04)
-           vnc_write(vs, last_fg, sizeof(pixel_t));
+           vs->write_pixels(vs, last_fg, sizeof(pixel_t));
        if (n_subtiles) {
            vnc_write_u8(vs, n_subtiles);
            vnc_write(vs, data, n_data);
        }
     } else {
        for (j = 0; j < h; j++) {
-           vnc_write(vs, row, w * vs->depth);
-           row += vs->ds->linesize;
+           vs->write_pixels(vs, row, w * ds_get_bytes_per_pixel(vs->ds));
+           row += ds_get_linesize(vs->ds);
        }
     }
 }
 
+#undef NAME
 #undef pixel_t
 #undef CONCAT_I
 #undef CONCAT