Hey, On Wed, Nov 25, 2015 at 05:14:27PM +0100, Lukas Venhoda wrote: > The newly created surface can be converted, if saved_want_original > equals TRUE. > > On BE machine we want to always convert, in order to properly byteswap > colors from LE order to BE order. > > This is done by first creating BGRA/X surface with LE order data, and > then copying the data into a new A/XRGB surface. The copy process will > automatically byteswap the colors into A/XRGB format. > --- > Changes since v3: > - New file > --- > common/canvas_base.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/common/canvas_base.c b/common/canvas_base.c > index 6747465..30baa22 100644 > --- a/common/canvas_base.c > +++ b/common/canvas_base.c > @@ -1116,7 +1116,9 @@ static pixman_image_t > *canvas_get_image_internal(CanvasBase *canvas, SpiceImage > SpiceImageDescriptor *descriptor = &image->descriptor; > pixman_image_t *surface, *converted; > pixman_format_code_t wanted_format, surface_format; > +#ifndef WORDS_BIGENDIAN > int saved_want_original; > +#endif > > /* When touching, only really allocate if we need to cache, or > * if we're loading a GLZ stream (since those need inter-thread > communication > @@ -1132,7 +1134,9 @@ static pixman_image_t > *canvas_get_image_internal(CanvasBase *canvas, SpiceImage > return NULL; > } > > +#ifndef WORDS_BIGENDIAN > saved_want_original = want_original; > +#endif
Rather than having #ifndef everywhere, I think this bit could be changed
to
+#ifndef WORDS_BIGENDIAN
saved_want_original = want_original;
+#else
+ /* On BE machines, we want to explicitly convert the surface all the
time */
+ saved_want_original = TRUE;
+#endif
I'm wondering if this could cause issues when blitting transparent
surfaces to a 16bpp canvas, as the canvas_get_image_internal documentation
mentions this as a usecase (and the only caller with want_original =
TRUE is canvas_draw_alpha_blend)
(NB: my understanding is that "want_original" really means
"keep_original_image_format")
Christophe
> if (descriptor->flags & SPICE_IMAGE_FLAGS_CACHE_ME
> #ifdef SW_CANVAS_CACHE
> || descriptor->flags & SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME
> @@ -1257,12 +1261,15 @@ static pixman_image_t
> *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
> return NULL;
> }
>
> +#ifndef WORDS_BIGENDIAN
> if (!saved_want_original) {
> /* Conversion to canvas format was requested, but maybe it didn't
> happen above (due to save/load to cache for instance, or
> maybe the reader didn't support conversion).
> If so we convert here. */
> +#endif
>
> + /* On BE machines, we want to explicitly convert the surface all the
> time */
> wanted_format = canvas_get_target_format(canvas,
> surface_format ==
> PIXMAN_a8r8g8b8);
>
> @@ -1285,7 +1292,9 @@ static pixman_image_t
> *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
> pixman_image_unref (surface);
> surface = converted;
> }
> +#ifndef WORDS_BIGENDIAN
> }
> +#endif
>
> return surface;
> }
> --
> 2.5.0
>
> _______________________________________________
> Spice-devel mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/spice-devel
