[PATCH xserver 1/2] render: Store all 16bpc of precision for solid pictures
Adam Jackson
ajax at redhat.com
Fri Feb 23 21:08:10 UTC 2018
Signed-off-by: Adam Jackson <ajax at redhat.com>
---
exa/exa_render.c | 4 +++-
fb/fbpict.c | 16 +++-------------
glamor/glamor_program.c | 7 ++++---
glamor/glamor_render.c | 14 ++++----------
glamor/glamor_utils.h | 9 +++++++++
render/picture.c | 10 +---------
render/picturestr.h | 2 +-
7 files changed, 25 insertions(+), 37 deletions(-)
diff --git a/exa/exa_render.c b/exa/exa_render.c
index b24bec052..2dad795f2 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -291,7 +291,9 @@ exaTryDriverSolidFill(PicturePtr pSrc,
pixel = exaGetPixmapFirstPixel(pSrcPix);
}
else
- pixel = pSrc->pSourcePict->solidFill.color;
+ miRenderColorToPixel(pSrc->pFormat,
+ &pSrc->pSourcePict->solidFill.color,
+ &pixel);
if (!exaGetRGBAFromPixel(pixel, &red, &green, &blue, &alpha,
pSrc->pFormat, pSrc->format) ||
diff --git a/fb/fbpict.c b/fb/fbpict.c
index 7ea0b668f..759f0d5db 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -220,20 +220,10 @@ static pixman_image_t *
create_solid_fill_image(PicturePtr pict)
{
PictSolidFill *solid = &pict->pSourcePict->solidFill;
- pixman_color_t color;
- CARD32 a, r, g, b;
+ /* pixman_color_t and xRenderColor have the same layout */
+ pixman_color_t *color = (pixman_color_t *)&solid->color;
- a = (solid->color & 0xff000000) >> 24;
- r = (solid->color & 0x00ff0000) >> 16;
- g = (solid->color & 0x0000ff00) >> 8;
- b = (solid->color & 0x000000ff) >> 0;
-
- color.alpha = (a << 8) | a;
- color.red = (r << 8) | r;
- color.green = (g << 8) | g;
- color.blue = (b << 8) | b;
-
- return pixman_image_create_solid_fill(&color);
+ return pixman_image_create_solid_fill(color);
}
static pixman_image_t *
diff --git a/glamor/glamor_program.c b/glamor/glamor_program.c
index 23c102bc3..29ffed05c 100644
--- a/glamor/glamor_program.c
+++ b/glamor/glamor_program.c
@@ -508,12 +508,13 @@ glamor_set_blend(CARD8 op, glamor_program_alpha alpha, PicturePtr dst)
static Bool
use_source_solid(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *prog)
{
+ PictSolidFill *solid = &src->pSourcePict->solidFill;
+ float color[4];
+ glamor_get_rgba_from_color(&solid->color, color);
glamor_set_blend(op, prog->alpha, dst);
+ glUniform4fv(prog->fg_uniform, 1, color);
- glamor_set_color_depth(dst->pDrawable->pScreen, 32,
- src->pSourcePict->solidFill.color,
- prog->fg_uniform);
return TRUE;
}
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 7a96c82dd..75f4258d8 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -830,11 +830,8 @@ glamor_composite_choose_shader(CARD8 op,
else if (!source->pDrawable) {
if (source->pSourcePict->type == SourcePictTypeSolidFill) {
key.source = SHADER_SOURCE_SOLID;
- glamor_get_rgba_from_pixel(source->pSourcePict->solidFill.color,
- &source_solid_color[0],
- &source_solid_color[1],
- &source_solid_color[2],
- &source_solid_color[3], PICT_a8r8g8b8);
+ glamor_get_rgba_from_color(&source->pSourcePict->solidFill.color,
+ source_solid_color);
}
else
goto fail;
@@ -850,11 +847,8 @@ glamor_composite_choose_shader(CARD8 op,
if (!mask->pDrawable) {
if (mask->pSourcePict->type == SourcePictTypeSolidFill) {
key.mask = SHADER_MASK_SOLID;
- glamor_get_rgba_from_pixel
- (mask->pSourcePict->solidFill.color,
- &mask_solid_color[0],
- &mask_solid_color[1],
- &mask_solid_color[2], &mask_solid_color[3], PICT_a8r8g8b8);
+ glamor_get_rgba_from_color(&mask->pSourcePict->solidFill.color,
+ mask_solid_color);
}
else
goto fail;
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 7597b92dc..d4f995ab9 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -710,6 +710,15 @@ glamor_get_rgba_from_pixel(CARD32 pixel,
return TRUE;
}
+static inline void
+glamor_get_rgba_from_color(const xRenderColor *color, float rgba[4])
+{
+ rgba[0] = color->red / (float)UINT16_MAX;
+ rgba[1] = color->green / (float)UINT16_MAX;
+ rgba[2] = color->blue / (float)UINT16_MAX;
+ rgba[3] = color->alpha / (float)UINT16_MAX;
+}
+
inline static Bool
glamor_is_large_pixmap(PixmapPtr pixmap)
{
diff --git a/render/picture.c b/render/picture.c
index 9e4036e7d..9907e15d6 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -817,14 +817,6 @@ CreatePicture(Picture pid,
return pPicture;
}
-static CARD32
-xRenderColorToCard32(xRenderColor c)
-{
- return
- (c.alpha >> 8 << 24) |
- (c.red >> 8 << 16) | (c.green & 0xff00) | (c.blue >> 8);
-}
-
static void
initGradient(SourcePictPtr pGradient, int stopCount,
xFixed * stopPoints, xRenderColor * stopColors, int *error)
@@ -898,7 +890,7 @@ CreateSolidPicture(Picture pid, xRenderColor * color, int *error)
return 0;
}
pPicture->pSourcePict->type = SourcePictTypeSolidFill;
- pPicture->pSourcePict->solidFill.color = xRenderColorToCard32(*color);
+ memcpy(&pPicture->pSourcePict->solidFill.color, color, sizeof(*color));
return pPicture;
}
diff --git a/render/picturestr.h b/render/picturestr.h
index 33baef9bf..5d479f18e 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -67,7 +67,7 @@ typedef struct pixman_transform PictTransform, *PictTransformPtr;
typedef struct _PictSolidFill {
unsigned int type;
- CARD32 color;
+ xRenderColor color;
} PictSolidFill, *PictSolidFillPtr;
typedef struct _PictGradientStop {
--
2.14.3
More information about the xorg-devel
mailing list