diff options
author | Brian <brian@i915.localnet.net> | 2007-08-01 16:15:30 -0600 |
---|---|---|
committer | Brian <brian@i915.localnet.net> | 2007-08-01 16:15:30 -0600 |
commit | 1b0e92b91a66c0188a870fb3ed6c20a8466b6ae9 (patch) | |
tree | 5402d89871b317a2d3da6eda94159fc3257ec9c5 | |
parent | 1ecc648398a51f734ef1e3b729595f41cedf29f9 (diff) |
implement masking in sp_region_fill()
-rw-r--r-- | src/mesa/pipe/softpipe/sp_region.c | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/mesa/pipe/softpipe/sp_region.c b/src/mesa/pipe/softpipe/sp_region.c index 34fbcce8ca..1dbd1609e3 100644 --- a/src/mesa/pipe/softpipe/sp_region.c +++ b/src/mesa/pipe/softpipe/sp_region.c @@ -112,29 +112,66 @@ sp_region_fill(struct pipe_context *pipe, case 1: { GLubyte *row = get_pointer(dst, dstx, dsty); - for (i = 0; i < height; i++) { - memset(row, value, width); - row += dst->pitch; + if ((mask & 0xff) == 0xff) { + /* no masking */ + for (i = 0; i < height; i++) { + memset(row, value, width); + row += dst->pitch; + } + } + else { + value &= mask; + mask = ~mask; + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + row[j] = (row[j] & mask) | value; + } + row += dst->pitch; + } } } break; case 2: { GLushort *row = (GLushort *) get_pointer(dst, dstx, dsty); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) - row[j] = value; - row += dst->pitch; + if ((mask & 0xffff) == 0xffff) { + /* no masking */ + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = value; + row += dst->pitch; + } + } + else { + value &= mask; + mask = ~mask; + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = (row[j] & mask) | value; + row += dst->pitch; + } } } break; case 4: { GLuint *row = (GLuint *) get_pointer(dst, dstx, dsty); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) - row[j] = value; - row += dst->pitch; + if (mask == 0xffffffff) { + /* no masking */ + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = value; + row += dst->pitch; + } + } + else { + value &= mask; + mask = ~mask; + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) + row[j] = (row[j] & mask) | value; + row += dst->pitch; + } } } break; |