pixman: Branch 'master'

Aaron Plattner aplattner at kemper.freedesktop.org
Thu Jun 26 22:39:49 PDT 2008


 pixman/pixman-access.c      |   22 ++++++++++++++++++++--
 pixman/pixman-transformed.c |    2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)

New commits:
commit eb53d111bd8651cd00c1b728b09e8be09b8482f7
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Wed Jun 25 17:55:28 2008 -0700

    Add a lossy 32-bit generic pixel fetch function for wide surfaces.
    
    The transformed fetch path currently only works at 32-bit precision.  Until a
    wide version of that function is added, we need to have a path to perform a
    wide FetchPixel and then contract it down to a8r8g8b8.
    
    Also, use the right format when expanding the result in fbFetchTransformed64.
    fbFetchTransformed returns a8r8g8b8 results.

diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c
index ca9619c..d01f8bd 100644
--- a/pixman/pixman-access.c
+++ b/pixman/pixman-access.c
@@ -1258,6 +1258,24 @@ fbFetchPixel_yv12 (bits_image_t *pict, int offset, int line)
 	(b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0);
 }
 
+/*
+ * XXX: The transformed fetch path only works at 32-bpp so far.  When all paths
+ * have wide versions, this can be removed.
+ *
+ * WARNING: This function loses precision!
+ */
+static FASTCALL uint32_t
+fbFetchPixel32_generic_lossy (bits_image_t *pict, int offset, int line)
+{
+    fetchPixelProc64 fetchPixel64 = ACCESS(pixman_fetchPixelProcForPicture64) (pict);
+    const uint64_t argb16Pixel = fetchPixel64(pict, offset, line);
+    uint32_t argb8Pixel;
+
+    pixman_contract(&argb8Pixel, &argb16Pixel, 1);
+
+    return argb8Pixel;
+}
+
 fetchPixelProc32 ACCESS(pixman_fetchPixelProcForPicture32) (bits_image_t * pict)
 {
     switch(pict->format) {
@@ -1266,8 +1284,8 @@ fetchPixelProc32 ACCESS(pixman_fetchPixelProcForPicture32) (bits_image_t * pict)
     case PIXMAN_a8b8g8r8: return fbFetchPixel_a8b8g8r8;
     case PIXMAN_x8b8g8r8: return fbFetchPixel_x8b8g8r8;
     /* These two require wide compositing */
-    case PIXMAN_a2b10g10r10: return NULL;
-    case PIXMAN_x2b10g10r10: return NULL;
+    case PIXMAN_a2b10g10r10: return fbFetchPixel32_generic_lossy;
+    case PIXMAN_x2b10g10r10: return fbFetchPixel32_generic_lossy;
 
         /* 24bpp formats */
     case PIXMAN_r8g8b8: return fbFetchPixel_r8g8b8;
diff --git a/pixman/pixman-transformed.c b/pixman/pixman-transformed.c
index 9f566bf..8dba26c 100644
--- a/pixman/pixman-transformed.c
+++ b/pixman/pixman-transformed.c
@@ -657,7 +657,7 @@ ACCESS(fbFetchTransformed64)(bits_image_t * pict, int x, int y, int width,
                                maskBits);
 
     // Expand from 32bpp to 64bpp in place.
-    pixman_expand(buffer, (uint32_t*)buffer, pict->format, width);
+    pixman_expand(buffer, (uint32_t*)buffer, PIXMAN_a8r8g8b8, width);
 
     free(mask8);
 }


More information about the xorg-commit mailing list