static gboolean do_color_convert(SpiceDisplay *display, gint x, gint y, gint w, gint h) { SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display); int i, j, maxy, maxx, miny, minx; guint32 *dest = d->data; guint16 *src = d->data_origin; if (!d->convert) return true; g_return_val_if_fail(d->format == SPICE_SURFACE_FMT_16_555 || d->format == SPICE_SURFACE_FMT_16_565, false); miny = MAX(y, 0); minx = MAX(x, 0); maxy = MIN(y + h, d->height); maxx = MIN(x + w, d->width); dest += (d->stride / 4) * miny; src += (d->stride / 2) * miny; if (d->format == SPICE_SURFACE_FMT_16_555) { for (j = miny; j < maxy; j++) { for (i = minx; i < maxx; i++) { dest[i] = CONVERT_0555_TO_0888(src[i]); } dest += d->stride / 4; src += d->stride / 2; } } else if (d->format == SPICE_SURFACE_FMT_16_565) { for (j = miny; j < maxy; j++) { for (i = minx; i < maxx; i++) { dest[i] = CONVERT_0565_TO_0888(src[i]); } dest += d->stride / 4; src += d->stride / 2; } } return true; }
static force_inline uint32_t convert_r5g6b5 (const uint8_t *row, int x) { return CONVERT_0565_TO_0888 (*((uint16_t *)row + x)); }