X-Git-Url: http://git.maemo.org/git/?p=qemu;a=blobdiff_plain;f=vnchextile.h;h=f5b6fcb55e161250d8dceefa97d882ae7569d0f1;hp=7277670a567adbfb0c7311ffd280d8054d7554b6;hb=HEAD;hpb=24236869fbff210b356b6626e6e9e9eadc8a976c diff --git a/vnchextile.h b/vnchextile.h index 7277670..f5b6fcb 100644 --- a/vnchextile.h +++ b/vnchextile.h @@ -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