| /* |
| * DIB conversion routinues for cases where the source |
| * has non-native byte order. |
| * |
| * Copyright (C) 2003 Huw Davies |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include "config.h" |
| |
| #include <stdlib.h> |
| |
| #include "windef.h" |
| #include "x11drv.h" |
| |
| |
| #define FLIP_WORD(x) \ |
| ( *(x) = ( (*(x) & 0xff) << 8) | \ |
| ( (*(x) & 0xff00) >> 8) ) |
| |
| #define FLIP_TWO_WORDS(x) \ |
| ( *(x) = ( (*(x) & 0x00ff00ff) << 8) | \ |
| ( (*(x) & 0xff00ff00) >> 8) ) |
| |
| #define FLIP_DWORD(x) \ |
| ( *(x) = ( (*(x) & 0xff) << 24) | \ |
| ( (*(x) & 0xff00) << 8) | \ |
| ( (*(x) & 0xff0000) >> 8) | \ |
| ( (*(x) & 0xff000000) >> 24) ) |
| |
| |
| |
| /* |
| * 15 bit conversions |
| */ |
| |
| static void convert_5x5_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| int x, y; |
| const DWORD *srcpixel; |
| DWORD *dstpixel; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for(x = 0; x < width/2; x++) { |
| /* Do 2 pixels at a time */ |
| DWORD srcval = *srcpixel++; |
| *dstpixel++=((srcval << 8) & 0xff00ff00) | |
| ((srcval >> 8) & 0x00ff00ff); |
| } |
| if(width&1) { |
| /* And the odd pixel */ |
| WORD srcval = *(const WORD*)srcpixel; |
| *(WORD*)dstpixel = ((srcval << 8) & 0xff00) | |
| ((srcval >> 8) & 0x00ff); |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_555_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/2; x++) { |
| /* Do 2 pixels at a time */ |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 2) & 0x001f001f) | /* h */ |
| ((srcval << 8) & 0x03000300) | /* g - 2 bits */ |
| ((srcval >> 8) & 0x00e000e0) | /* g - 3 bits */ |
| ((srcval << 2) & 0x7c007c00); /* l */ |
| } |
| if (width&1) { |
| /* And then the odd pixel */ |
| WORD srcval; |
| srcval=*((const WORD*)srcpixel); |
| *((WORD*)dstpixel)=((srcval >> 2) & 0x001f) | /* h */ |
| ((srcval << 8) & 0x0300) | /* g - 2 bits */ |
| ((srcval >> 8) & 0x00e0) | /* g - 3 bits */ |
| ((srcval << 2) & 0x7c00); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_555_to_565_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/2; x++) { |
| /* Do 2 pixels at a time */ |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval << 9) & 0xfe00fe00) | /* h, g - 2 bits*/ |
| ((srcval >> 7) & 0x01c001c0) | /* g - 3 bits */ |
| ((srcval << 4) & 0x00200020) | /* g - 1 bit */ |
| ((srcval >> 8) & 0x001f001f); /* l */ |
| } |
| if (width&1) { |
| /* And then the odd pixel */ |
| WORD srcval; |
| srcval=*((const WORD*)srcpixel); |
| *((WORD*)dstpixel)=((srcval << 9) & 0xfe00) | /* h, g - 2bits*/ |
| ((srcval >> 7) & 0x01c0) | /* g - 3 bits */ |
| ((srcval << 4) & 0x0020) | /* g - 1 bit */ |
| ((srcval >> 8) & 0x001f); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_555_to_565_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/2; x++) { |
| /* Do 2 pixels at a time */ |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 2) & 0x001f001f) | /* h */ |
| ((srcval << 9) & 0x06000600) | /* g - 2 bits*/ |
| ((srcval >> 7) & 0x01c001c0) | /* g - 3 bits */ |
| ((srcval << 4) & 0x00200020) | /* g - 1 bits */ |
| ((srcval << 3) & 0xf800f800); /* l */ |
| } |
| if (width&1) { |
| /* And then the odd pixel */ |
| WORD srcval; |
| srcval=*((const WORD*)srcpixel); |
| *((WORD*)dstpixel)=((srcval >> 2) & 0x001f) | /* h */ |
| ((srcval << 9) & 0x0600) | /* g - 2 bits */ |
| ((srcval >> 7) & 0x01c0) | /* g - 3 bits */ |
| ((srcval << 4) & 0x0020) | /* g - 1 bit */ |
| ((srcval << 3) & 0xf800); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_555_to_888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| BYTE* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| dstpixel[0]=((srcval >> 5) & 0xf8) | /* l */ |
| ((srcval >> 10) & 0x07); /* l - 3 bits */ |
| dstpixel[1]=((srcval << 6) & 0xc0) | /* g - 2 bits */ |
| ((srcval >> 10) & 0x38) | /* g - 3 bits */ |
| ((srcval << 1) & 0x06) | /* g - 2 bits */ |
| ((srcval >> 15) & 0x01); /* g - 1 bit */ |
| dstpixel[2]=((srcval << 1) & 0xf8) | /* h */ |
| ((srcval >> 4) & 0x07); /* h - 3 bits */ |
| dstpixel+=3; |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_555_to_888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| BYTE* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| dstpixel[0]=((srcval << 1) & 0xf8) | /* h */ |
| ((srcval >> 4) & 0x07); /* h - 3 bits */ |
| dstpixel[1]=((srcval << 6) & 0xc0) | /* g - 2 bits */ |
| ((srcval >> 10) & 0x38) | /* g - 3 bits */ |
| ((srcval << 1) & 0x06) | /* g - 2 bits */ |
| ((srcval >> 15) & 0x01); /* g - 1 bits */ |
| dstpixel[2]=((srcval >> 5) & 0xf8) | /* l */ |
| ((srcval >> 10) & 0x07); /* l - 3 bits */ |
| dstpixel+=3; |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_555_to_0888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval << 17) & 0xf80000) | /* h */ |
| ((srcval << 12) & 0x070000) | /* h - 3 bits */ |
| ((srcval << 14) & 0x00c000) | /* g - 2 bits */ |
| ((srcval >> 2) & 0x003800) | /* g - 3 bits */ |
| ((srcval << 9) & 0x000600) | /* g - 2 bits */ |
| ((srcval >> 7) & 0x000100) | /* g - 1 bit */ |
| ((srcval >> 5) & 0x0000f8) | /* l */ |
| ((srcval >> 10) & 0x000007); /* l - 3 bits */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_555_to_0888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval << 1) & 0x0000f8) | /* h */ |
| ((srcval >> 4) & 0x000007) | /* h - 3 bits */ |
| ((srcval << 14) & 0x00c000) | /* g - 2 bits */ |
| ((srcval >> 2) & 0x003800) | /* g - 3 bits */ |
| ((srcval << 9) & 0x000600) | /* g - 2 bits */ |
| ((srcval >> 7) & 0x000100) | /* g - 1 bit */ |
| ((srcval << 11) & 0xf80000) | /* l */ |
| ((srcval << 6) & 0x070000); /* l - 3 bits */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_5x5_to_any0888_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| WORD rsrc, WORD gsrc, WORD bsrc, |
| void* dstbits, int dstlinebytes, |
| DWORD rdst, DWORD gdst, DWORD bdst) |
| { |
| int rRightShift1,gRightShift1,bRightShift1; |
| int rRightShift2,gRightShift2,bRightShift2; |
| BYTE gMask1,gMask2; |
| int rLeftShift,gLeftShift,bLeftShift; |
| const WORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| /* Note, the source pixel value is shifted left by 16 bits so that |
| * we know we will always have to shift right to extract the components. |
| */ |
| rRightShift1=16+X11DRV_DIB_MaskToShift(rsrc)-3; |
| gRightShift1=16+X11DRV_DIB_MaskToShift(gsrc)-3; |
| bRightShift1=16+X11DRV_DIB_MaskToShift(bsrc)-3; |
| rRightShift2=rRightShift1+5; |
| gRightShift2=gRightShift1+5; |
| bRightShift2=bRightShift1+5; |
| if (gsrc==0x03e0) { |
| /* Green has 5 bits, like the others */ |
| gMask1=0xf8; |
| gMask2=0x07; |
| } else { |
| /* Green has 6 bits, not 5. Compensate. */ |
| gRightShift1++; |
| gRightShift2+=2; |
| gMask1=0xfc; |
| gMask2=0x03; |
| } |
| |
| rLeftShift=X11DRV_DIB_MaskToShift(rdst); |
| gLeftShift=X11DRV_DIB_MaskToShift(gdst); |
| bLeftShift=X11DRV_DIB_MaskToShift(bdst); |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| BYTE red,green,blue; |
| srcval=*srcpixel++ << 16; |
| FLIP_TWO_WORDS(&srcval); |
| |
| red= ((srcval >> rRightShift1) & 0xf8) | |
| ((srcval >> rRightShift2) & 0x07); |
| green=((srcval >> gRightShift1) & gMask1) | |
| ((srcval >> gRightShift2) & gMask2); |
| blue= ((srcval >> bRightShift1) & 0xf8) | |
| ((srcval >> bRightShift2) & 0x07); |
| *dstpixel++=(red << rLeftShift) | |
| (green << gLeftShift) | |
| (blue << bLeftShift); |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| /* |
| * 16 bits conversions |
| */ |
| |
| static void convert_565_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/2; x++) { |
| /* Do 2 pixels at a time */ |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval << 3) & 0xf800f800) | /* l */ |
| ((srcval << 8) & 0x07000700) | /* g - 3 bits */ |
| ((srcval >> 8) & 0x00e000e0) | /* g - 3 bits */ |
| ((srcval >> 3) & 0x001f001f); /* h */ |
| } |
| if (width&1) { |
| /* And then the odd pixel */ |
| WORD srcval; |
| srcval=*((const WORD*)srcpixel); |
| *((WORD*)dstpixel)=((srcval << 3) & 0xf800) | /* l */ |
| ((srcval << 8) & 0x0700) | /* g - 3 bits */ |
| ((srcval >> 8) & 0x00e0) | /* g - 3 bits */ |
| ((srcval >> 3) & 0x001f); /* h */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_565_to_555_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/2; x++) { |
| /* Do 2 pixels at a time */ |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval << 7) & 0x7f807f80) | /* h, g - 3 bits */ |
| ((srcval >> 9) & 0x00600060) | /* g - 2 bits */ |
| ((srcval >> 8) & 0x001f001f); /* l */ |
| } |
| if (width&1) { |
| /* And then the odd pixel */ |
| WORD srcval; |
| srcval=*((const WORD*)srcpixel); |
| *((WORD*)dstpixel)=((srcval << 7) & 0x7f80) | /* h, g - 3 bits */ |
| ((srcval >> 9) & 0x0060) | /* g - 2 bits */ |
| ((srcval >> 8) & 0x001f); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_565_to_555_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/2; x++) { |
| /* Do 2 pixels at a time */ |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 3) & 0x001f001f) | /* h */ |
| ((srcval >> 9) & 0x00600060) | /* g - 2 bits */ |
| ((srcval << 7) & 0x03800380) | /* g - 3 bits */ |
| ((srcval << 2) & 0x7c007c00); /* l */ |
| } |
| if (width&1) { |
| /* And then the odd pixel */ |
| WORD srcval; |
| srcval=*((const WORD*)srcpixel); |
| *((WORD*)dstpixel)=((srcval >> 3) & 0x001f) | /* h */ |
| ((srcval >> 9) & 0x0060) | /* g - 2 bits */ |
| ((srcval << 7) & 0x0380) | /* g - 3 bits */ |
| ((srcval << 2) & 0x7c00); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_565_to_888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| BYTE* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| dstpixel[0]=((srcval >> 5) & 0xf8) | /* l */ |
| ((srcval >> 10) & 0x07); /* l - 3 bits */ |
| dstpixel[1]=((srcval << 5) & 0xe0) | /* g - 3 bits */ |
| ((srcval >> 11) & 0x1c) | /* g - 3 bits */ |
| ((srcval >> 1) & 0x03); /* g - 2 bits */ |
| dstpixel[2]=((srcval >> 0) & 0xf8) | /* h */ |
| ((srcval >> 5) & 0x07); /* h - 3 bits */ |
| dstpixel+=3; |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_565_to_888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| BYTE* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| dstpixel[0]=((srcval >> 0) & 0xf8) | /* h */ |
| ((srcval >> 5) & 0x07); /* h - 3 bits */ |
| dstpixel[1]=((srcval << 5) & 0xe0) | /* g - 3 bits */ |
| ((srcval >> 11) & 0x1c) | /* g - 3 bits */ |
| ((srcval >> 1) & 0x03); /* g - 2 bits */ |
| dstpixel[2]=((srcval >> 5) & 0xf8) | /* l */ |
| ((srcval >> 10) & 0x07); /* l - 3 bits */ |
| dstpixel+=3; |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_565_to_0888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval << 16) & 0xf80000) | /* h */ |
| ((srcval << 11) & 0x070000) | /* h - 3 bits */ |
| ((srcval << 13) & 0x00e000) | /* g - 3 bits */ |
| ((srcval >> 3) & 0x001c00) | /* g - 3 bits */ |
| ((srcval << 7) & 0x000300) | /* g - 2 bits */ |
| ((srcval >> 5) & 0x0000f8) | /* l */ |
| ((srcval >> 10) & 0x000007); /* l - 3 bits */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_565_to_0888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const WORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| WORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 0) & 0x0000f8) | /* h */ |
| ((srcval >> 5) & 0x000007) | /* h - 3 bits */ |
| ((srcval << 13) & 0x00e000) | /* g - 3 bits */ |
| ((srcval >> 3) & 0x001c00) | /* g - 3 bits */ |
| ((srcval << 7) & 0x000300) | /* g - 2 bits */ |
| ((srcval << 11) & 0xf80000) | /* l */ |
| ((srcval << 6) & 0x070000); /* l - 3 bits */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| /* |
| * 24 bit conversions |
| */ |
| |
| static void convert_888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| int x, y; |
| |
| for (y=0; y<height; y++) { |
| for(x = 0; x < ((width+1)*3/4); x++) { |
| DWORD srcval = *((const DWORD*)srcbits + x); |
| *((DWORD*)dstbits + x) = ((srcval << 24) & 0xff000000) | |
| ((srcval << 8) & 0x00ff0000) | |
| ((srcval >> 8) & 0x0000ff00) | |
| ((srcval >> 24) & 0x000000ff); |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| DWORD srcarray[3]; |
| int x,y; |
| int oddwidth = width & 3; |
| |
| width = width/4; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 3 dwords out */ |
| *dstpixel++= ((srcpixel[0] >> 8) & 0x00ffffff) | /* l1, g1, h1 */ |
| ((srcpixel[1] << 8) & 0xff000000); /* h2 */ |
| *dstpixel++= ((srcpixel[1] >> 24) & 0x000000ff) | /* g2 */ |
| ((srcpixel[0] << 8) & 0x0000ff00) | /* l2 */ |
| ((srcpixel[2] >> 8) & 0x00ff0000) | /* h3 */ |
| ((srcpixel[1] << 24) & 0xff000000); /* g3 */ |
| *dstpixel++= ((srcpixel[1] >> 8) & 0x000000ff) | /* l3 */ |
| ((srcpixel[2] << 8) & 0xffffff00); /* l4, g4, h4 */ |
| srcpixel+=3; |
| } |
| /* And now up to 3 odd pixels */ |
| if(oddwidth) { |
| BYTE *dstbyte, *srcbyte; |
| memcpy(srcarray,srcpixel,oddwidth*sizeof(DWORD)); |
| dstbyte = (LPBYTE)dstpixel; |
| srcbyte = (LPBYTE)srcarray; |
| for (x=0; x<oddwidth; x++) { |
| FLIP_DWORD(srcarray+x); |
| dstbyte[0] = srcbyte[2]; |
| dstbyte[1] = srcbyte[1]; |
| dstbyte[2] = srcbyte[0]; |
| srcbyte+=3; |
| dstbyte+=3; |
| } |
| } |
| |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_888_to_555_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| const BYTE* srcbyte; |
| WORD* dstpixel; |
| DWORD srcarray[3]; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 words out */ |
| DWORD srcval1,srcval2; |
| srcval1=srcpixel[0]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[0]=((srcval1 >> 3) & 0x001f) | /* l1 */ |
| ((srcval1 >> 6) & 0x03e0) | /* g1 */ |
| ((srcval1 >> 9) & 0x7c00); /* h1 */ |
| srcval2=srcpixel[1]; |
| FLIP_DWORD(&srcval2); |
| dstpixel[1]=((srcval1 >> 27) & 0x001f) | /* l2 */ |
| ((srcval2 << 2) & 0x03e0) | /* g2 */ |
| ((srcval2 >> 1) & 0x7c00); /* h2 */ |
| srcval1=srcpixel[2]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[2]=((srcval2 >> 19) & 0x001f) | /* l3 */ |
| ((srcval2 >> 22) & 0x03e0) | /* g3 */ |
| ((srcval1 << 7) & 0x7c00); /* h3 */ |
| dstpixel[3]=((srcval1 >> 11) & 0x001f) | /* l4 */ |
| ((srcval1 >> 14) & 0x03e0) | /* g4 */ |
| ((srcval1 >> 17) & 0x7c00); /* h4 */ |
| srcpixel+=3; |
| dstpixel+=4; |
| } |
| /* And now up to 3 odd pixels */ |
| if(oddwidth) { |
| memcpy(srcarray,srcpixel,oddwidth*sizeof(DWORD)); |
| srcbyte = (LPBYTE)srcarray; |
| for (x=0; x<oddwidth; x++) { |
| WORD dstval; |
| FLIP_DWORD(srcarray+x); |
| |
| dstval =((srcbyte[0] >> 3) & 0x001f); /* l */ |
| dstval|=((srcbyte[1] << 2) & 0x03e0); /* g */ |
| dstval|=((srcbyte[2] << 7) & 0x7c00); /* h */ |
| *dstpixel++=dstval; |
| srcbyte+=3; |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_888_to_555_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| const BYTE* srcbyte; |
| WORD* dstpixel; |
| DWORD srcarray[3]; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 words out */ |
| DWORD srcval1,srcval2; |
| srcval1=srcpixel[0]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[0]=((srcval1 << 7) & 0x7c00) | /* l1 */ |
| ((srcval1 >> 6) & 0x03e0) | /* g1 */ |
| ((srcval1 >> 19) & 0x001f); /* h1 */ |
| srcval2=srcpixel[1]; |
| FLIP_DWORD(&srcval2); |
| dstpixel[1]=((srcval1 >> 17) & 0x7c00) | /* l2 */ |
| ((srcval2 << 2) & 0x03e0) | /* g2 */ |
| ((srcval2 >> 11) & 0x001f); /* h2 */ |
| srcval1=srcpixel[2]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[2]=((srcval2 >> 9) & 0x7c00) | /* l3 */ |
| ((srcval2 >> 22) & 0x03e0) | /* g3 */ |
| ((srcval1 >> 3) & 0x001f); /* h3 */ |
| dstpixel[3]=((srcval1 >> 1) & 0x7c00) | /* l4 */ |
| ((srcval1 >> 14) & 0x03e0) | /* g4 */ |
| ((srcval1 >> 27) & 0x001f); /* h4 */ |
| srcpixel+=3; |
| dstpixel+=4; |
| } |
| /* And now up to 3 odd pixels */ |
| if(oddwidth) { |
| memcpy(srcarray,srcpixel,oddwidth*sizeof(DWORD)); |
| srcbyte = (LPBYTE)srcarray; |
| for (x=0; x<oddwidth; x++) { |
| WORD dstval; |
| FLIP_DWORD(srcarray+x); |
| dstval =((srcbyte[0] << 7) & 0x7c00); /* l */ |
| dstval|=((srcbyte[1] << 2) & 0x03e0); /* g */ |
| dstval|=((srcbyte[2] >> 3) & 0x001f); /* h */ |
| *dstpixel++=dstval; |
| srcbyte+=3; |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_888_to_565_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| const BYTE* srcbyte; |
| WORD* dstpixel; |
| DWORD srcarray[3]; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 words out */ |
| DWORD srcval1,srcval2; |
| srcval1=srcpixel[0]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[0]=((srcval1 >> 3) & 0x001f) | /* l1 */ |
| ((srcval1 >> 5) & 0x07e0) | /* g1 */ |
| ((srcval1 >> 8) & 0xf800); /* h1 */ |
| srcval2=srcpixel[1]; |
| FLIP_DWORD(&srcval2); |
| dstpixel[1]=((srcval1 >> 27) & 0x001f) | /* l2 */ |
| ((srcval2 << 3) & 0x07e0) | /* g2 */ |
| ( srcval2 & 0xf800); /* h2 */ |
| srcval1=srcpixel[2]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[2]=((srcval2 >> 19) & 0x001f) | /* l3 */ |
| ((srcval2 >> 21) & 0x07e0) | /* g3 */ |
| ((srcval1 << 8) & 0xf800); /* h3 */ |
| dstpixel[3]=((srcval1 >> 11) & 0x001f) | /* l4 */ |
| ((srcval1 >> 13) & 0x07e0) | /* g4 */ |
| ((srcval1 >> 16) & 0xf800); /* h4 */ |
| srcpixel+=3; |
| dstpixel+=4; |
| } |
| /* And now up to 3 odd pixels */ |
| if(oddwidth) { |
| memcpy(srcarray,srcpixel,oddwidth*sizeof(DWORD)); |
| srcbyte = (LPBYTE)srcarray; |
| for (x=0; x<oddwidth; x++) { |
| WORD dstval; |
| FLIP_DWORD(srcarray+x); |
| dstval =((srcbyte[0] >> 3) & 0x001f); /* l */ |
| dstval|=((srcbyte[1] << 3) & 0x07e0); /* g */ |
| dstval|=((srcbyte[2] << 8) & 0xf800); /* h */ |
| *dstpixel++=dstval; |
| srcbyte+=3; |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_888_to_565_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| const BYTE* srcbyte; |
| WORD* dstpixel; |
| DWORD srcarray[3]; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 words out */ |
| DWORD srcval1,srcval2; |
| srcval1=srcpixel[0]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[0]=((srcval1 << 8) & 0xf800) | /* l1 */ |
| ((srcval1 >> 5) & 0x07e0) | /* g1 */ |
| ((srcval1 >> 19) & 0x001f); /* h1 */ |
| srcval2=srcpixel[1]; |
| FLIP_DWORD(&srcval2); |
| dstpixel[1]=((srcval1 >> 16) & 0xf800) | /* l2 */ |
| ((srcval2 << 3) & 0x07e0) | /* g2 */ |
| ((srcval2 >> 11) & 0x001f); /* h2 */ |
| srcval1=srcpixel[2]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[2]=((srcval2 >> 8) & 0xf800) | /* l3 */ |
| ((srcval2 >> 21) & 0x07e0) | /* g3 */ |
| ((srcval1 >> 3) & 0x001f); /* h3 */ |
| dstpixel[3]=(srcval1 & 0xf800) | /* l4 */ |
| ((srcval1 >> 13) & 0x07e0) | /* g4 */ |
| ((srcval1 >> 27) & 0x001f); /* h4 */ |
| srcpixel+=3; |
| dstpixel+=4; |
| } |
| /* And now up to 3 odd pixels */ |
| if(oddwidth) { |
| memcpy(srcarray,srcpixel,oddwidth*sizeof(DWORD)); |
| srcbyte = (LPBYTE)srcarray; |
| for (x=0; x<oddwidth; x++) { |
| WORD dstval; |
| FLIP_DWORD(srcarray+x); |
| dstval =((srcbyte[0] << 8) & 0xf800); /* l */ |
| dstval|=((srcbyte[1] << 3) & 0x07e0); /* g */ |
| dstval|=((srcbyte[2] >> 3) & 0x001f); /* h */ |
| *dstpixel++=dstval; |
| srcbyte+=3; |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_888_to_0888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| DWORD srcarray[3]; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 dwords out */ |
| DWORD srcval1,srcval2; |
| srcval1=srcpixel[0]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[0]=( srcval1 & 0x00ffffff); /* h1, g1, l1 */ |
| srcval2=srcpixel[1]; |
| FLIP_DWORD(&srcval2); |
| dstpixel[1]=( srcval1 >> 24) | /* l2 */ |
| ((srcval2 << 8) & 0x00ffff00); /* h2, g2 */ |
| srcval1=srcpixel[2]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[2]=( srcval2 >> 16) | /* g3, l3 */ |
| ((srcval1 << 16) & 0x00ff0000); /* h3 */ |
| dstpixel[3]=( srcval1 >> 8); /* h4, g4, l4 */ |
| srcpixel+=3; |
| dstpixel+=4; |
| } |
| /* And now up to 3 odd pixels */ |
| if(oddwidth) { |
| memcpy(srcarray,srcpixel,oddwidth*sizeof(DWORD)); |
| srcpixel = srcarray; |
| for (x=0; x<oddwidth; x++) { |
| DWORD srcval; |
| FLIP_DWORD(srcarray+x); |
| srcval=*srcpixel; |
| srcpixel=(const DWORD*)(((const char*)srcpixel)+3); |
| *dstpixel++=( srcval & 0x00ffffff); /* h, g, l */ |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_888_to_0888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| DWORD srcarray[3]; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 dwords out */ |
| DWORD srcval1,srcval2; |
| |
| srcval1=srcpixel[0]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[0]=((srcval1 >> 16) & 0x0000ff) | /* h1 */ |
| ( srcval1 & 0x00ff00) | /* g1 */ |
| ((srcval1 << 16) & 0xff0000); /* l1 */ |
| srcval2=srcpixel[1]; |
| FLIP_DWORD(&srcval2); |
| dstpixel[1]=((srcval1 >> 8) & 0xff0000) | /* l2 */ |
| ((srcval2 << 8) & 0x00ff00) | /* g2 */ |
| ((srcval2 >> 8) & 0x0000ff); /* h2 */ |
| srcval1=srcpixel[2]; |
| FLIP_DWORD(&srcval1); |
| dstpixel[2]=( srcval2 & 0xff0000) | /* l3 */ |
| ((srcval2 >> 16) & 0x00ff00) | /* g3 */ |
| ( srcval1 & 0x0000ff); /* h3 */ |
| dstpixel[3]=((srcval1 >> 24) & 0x0000ff) | /* h4 */ |
| ((srcval1 >> 8) & 0x00ff00) | /* g4 */ |
| ((srcval1 << 8) & 0xff0000); /* l4 */ |
| srcpixel+=3; |
| dstpixel+=4; |
| } |
| /* And now up to 3 odd pixels */ |
| if(oddwidth) { |
| memcpy(srcarray,srcpixel,oddwidth*sizeof(DWORD)); |
| srcpixel = srcarray; |
| for (x=0; x<oddwidth; x++) { |
| DWORD srcval; |
| FLIP_DWORD(srcarray+x); |
| srcval=*srcpixel; |
| srcpixel=(const DWORD*)(((const char*)srcpixel)+3); |
| *dstpixel++=((srcval >> 16) & 0x0000ff) | /* h */ |
| ( srcval & 0x00ff00) | /* g */ |
| ((srcval << 16) & 0xff0000); /* l */ |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_rgb888_to_any0888_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes, |
| DWORD rdst, DWORD gdst, DWORD bdst) |
| { |
| int rLeftShift,gLeftShift,bLeftShift; |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| DWORD srcarray[3]; |
| |
| rLeftShift=X11DRV_DIB_MaskToShift(rdst); |
| gLeftShift=X11DRV_DIB_MaskToShift(gdst); |
| bLeftShift=X11DRV_DIB_MaskToShift(bdst); |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/4; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 dwords out */ |
| DWORD srcval1, srcval2; |
| srcval1=*srcpixel++; |
| *dstpixel++=(((srcval1 >> 24) & 0xff) << bLeftShift) | /* b1 */ |
| (((srcval1 >> 16) & 0xff) << gLeftShift) | /* g1 */ |
| (((srcval1 >> 8) & 0xff) << rLeftShift); /* r1 */ |
| srcval2=*srcpixel++; |
| *dstpixel++=(((srcval1 >> 0) & 0xff) << bLeftShift) | /* b2 */ |
| (((srcval2 >> 24) & 0xff) << gLeftShift) | /* g2 */ |
| (((srcval2 >> 16) & 0xff) << rLeftShift); /* r2 */ |
| srcval1=*srcpixel++; |
| *dstpixel++=(((srcval2 >> 8) & 0xff) << bLeftShift) | /* b3 */ |
| (((srcval2 >> 0) & 0xff) << gLeftShift) | /* g3 */ |
| (((srcval1 >> 24) & 0xff) << rLeftShift); /* r3 */ |
| *dstpixel++=(((srcval1 >> 16) & 0xff) << bLeftShift) | /* b4 */ |
| (((srcval1 >> 8) & 0xff) << gLeftShift) | /* g4 */ |
| (((srcval1 >> 0) & 0xff) << rLeftShift); /* r4 */ |
| } |
| /* And now up to 3 odd pixels */ |
| if(width&3) { |
| memcpy(srcarray,srcpixel,width&3*sizeof(DWORD)); |
| srcpixel = srcarray; |
| for (x=0; x < (width&3); x++) { |
| DWORD srcval; |
| FLIP_DWORD(srcarray+x); |
| srcval=*srcpixel; |
| srcpixel=(const DWORD*)(((const char*)srcpixel)+3); |
| *dstpixel++=(((srcval >> 0) & 0xff) << bLeftShift) | /* b */ |
| (((srcval >> 8) & 0xff) << gLeftShift) | /* g */ |
| (((srcval >> 16) & 0xff) << rLeftShift); /* r */ |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_bgr888_to_any0888_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes, |
| DWORD rdst, DWORD gdst, DWORD bdst) |
| { |
| int rLeftShift,gLeftShift,bLeftShift; |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| DWORD srcarray[3]; |
| |
| rLeftShift=X11DRV_DIB_MaskToShift(rdst); |
| gLeftShift=X11DRV_DIB_MaskToShift(gdst); |
| bLeftShift=X11DRV_DIB_MaskToShift(bdst); |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width/4; x++) { |
| /* Do 4 pixels at a time: 3 dwords in and 4 dwords out */ |
| DWORD srcval1, srcval2; |
| srcval1=*srcpixel++; |
| *dstpixel++=(((srcval1 >> 24) & 0xff) << rLeftShift) | /* r1 */ |
| (((srcval1 >> 16) & 0xff) << gLeftShift) | /* g1 */ |
| (((srcval1 >> 8) & 0xff) << bLeftShift); /* b1 */ |
| srcval2=*srcpixel++; |
| *dstpixel++=(((srcval1 >> 0) & 0xff) << rLeftShift) | /* r2 */ |
| (((srcval2 >> 24) & 0xff) << gLeftShift) | /* g2 */ |
| (((srcval2 >> 16) & 0xff) << bLeftShift); /* b2 */ |
| srcval1=*srcpixel++; |
| *dstpixel++=(((srcval2 >> 8) & 0xff) << rLeftShift) | /* r3 */ |
| (((srcval2 >> 0) & 0xff) << gLeftShift) | /* g3 */ |
| (((srcval1 >> 24) & 0xff) << bLeftShift); /* b3 */ |
| *dstpixel++=(((srcval1 >> 16) & 0xff) << rLeftShift) | /* r4 */ |
| (((srcval1 >> 8) & 0xff) << gLeftShift) | /* g4 */ |
| (((srcval1 >> 0) & 0xff) << bLeftShift); /* b4 */ |
| } |
| /* And now up to 3 odd pixels */ |
| if(width&3) { |
| memcpy(srcarray,srcpixel,width&3*sizeof(DWORD)); |
| srcpixel = srcarray; |
| for (x=0; x < (width&3); x++) { |
| DWORD srcval; |
| FLIP_DWORD(srcarray+x); |
| srcval=*srcpixel; |
| srcpixel=(const DWORD*)(((const char*)srcpixel)+3); |
| *dstpixel++=(((srcval >> 0) & 0xff) << rLeftShift) | /* r */ |
| (((srcval >> 8) & 0xff) << gLeftShift) | /* g */ |
| (((srcval >> 16) & 0xff) << bLeftShift); /* b */ |
| } |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| |
| /* |
| * 32 bit conversions |
| */ |
| |
| static void convert_0888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| int x, y; |
| |
| for (y=0; y<height; y++) { |
| for(x = 0; x < width; x++) { |
| DWORD srcval = *((const DWORD*)srcbits + x); |
| *((DWORD*)dstbits + x) = ((srcval << 24) & 0xff000000) | |
| ((srcval << 8) & 0x00ff0000) | |
| ((srcval >> 8) & 0x0000ff00) | |
| ((srcval >> 24) & 0x000000ff); |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 8) & 0x00ffffff); |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_any_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| DWORD rsrc, DWORD gsrc, DWORD bsrc, |
| void* dstbits, int dstlinebytes, |
| DWORD rdst, DWORD gdst, DWORD bdst) |
| { |
| int rRightShift,gRightShift,bRightShift; |
| int rLeftShift,gLeftShift,bLeftShift; |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| int x,y; |
| |
| rRightShift=X11DRV_DIB_MaskToShift(rsrc); |
| gRightShift=X11DRV_DIB_MaskToShift(gsrc); |
| bRightShift=X11DRV_DIB_MaskToShift(bsrc); |
| rLeftShift=X11DRV_DIB_MaskToShift(rdst); |
| gLeftShift=X11DRV_DIB_MaskToShift(gdst); |
| bLeftShift=X11DRV_DIB_MaskToShift(bdst); |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| FLIP_DWORD(&srcval); |
| *dstpixel++=(((srcval >> rRightShift) & 0xff) << rLeftShift) | |
| (((srcval >> gRightShift) & 0xff) << gLeftShift) | |
| (((srcval >> bRightShift) & 0xff) << bLeftShift); |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_to_555_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| WORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 1) & 0x7c00) | /* h */ |
| ((srcval >> 14) & 0x03e0) | /* g */ |
| ((srcval >> 27) & 0x001f); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_to_555_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| WORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 11) & 0x001f) | /* h */ |
| ((srcval >> 14) & 0x03e0) | /* g */ |
| ((srcval >> 17) & 0x7c00); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_to_565_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| WORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 0) & 0xf800) | /* h */ |
| ((srcval >> 13) & 0x07e0) | /* g */ |
| ((srcval >> 27) & 0x001f); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_to_565_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| WORD* dstpixel; |
| int x,y; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *dstpixel++=((srcval >> 11) & 0x001f) | /* h */ |
| ((srcval >> 13) & 0x07e0) | /* g */ |
| ((srcval >> 16) & 0xf800); /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_any0888_to_5x5_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| DWORD rsrc, DWORD gsrc, DWORD bsrc, |
| void* dstbits, int dstlinebytes, |
| WORD rdst, WORD gdst, WORD bdst) |
| { |
| int rRightShift,gRightShift,bRightShift; |
| int rLeftShift,gLeftShift,bLeftShift; |
| const DWORD* srcpixel; |
| WORD* dstpixel; |
| int x,y; |
| |
| /* Here is how we proceed. Assume we have rsrc=0x0000ff00 and our pixel |
| * contains 0x11223344. |
| * - first we shift 0x11223344 right by rRightShift to bring the most |
| * significant bits of the red components in the bottom 5 (or 6) bits |
| * -> 0x4488c |
| * - then we remove non red bits by anding with the modified rdst (0x1f) |
| * -> 0x0c |
| * - finally shift these bits left by rLeftShift so that they end up in |
| * the right place |
| * -> 0x3000 |
| */ |
| rRightShift=X11DRV_DIB_MaskToShift(rsrc)+3; |
| gRightShift=X11DRV_DIB_MaskToShift(gsrc); |
| gRightShift+=(gdst==0x07e0?2:3); |
| bRightShift=X11DRV_DIB_MaskToShift(bsrc)+3; |
| |
| rLeftShift=X11DRV_DIB_MaskToShift(rdst); |
| rdst=rdst >> rLeftShift; |
| gLeftShift=X11DRV_DIB_MaskToShift(gdst); |
| gdst=gdst >> gLeftShift; |
| bLeftShift=X11DRV_DIB_MaskToShift(bdst); |
| bdst=bdst >> bLeftShift; |
| |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| FLIP_DWORD(&srcval); |
| *dstpixel++=(((srcval >> rRightShift) & rdst) << rLeftShift) | |
| (((srcval >> gRightShift) & gdst) << gLeftShift) | |
| (((srcval >> bRightShift) & bdst) << bLeftShift); |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_to_888_asis_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| BYTE* dstbyte; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 4 dwords in and 3 dwords out */ |
| DWORD srcval1, srcval2; |
| srcval1 = *srcpixel++; |
| srcval2 = *srcpixel++; |
| *dstpixel++= ((srcval1 >> 24) & 0x000000ff) | /* l1 */ |
| ((srcval1 >> 8) & 0x0000ff00) | /* g1 */ |
| ((srcval1 << 8) & 0x00ff0000) | /* h1 */ |
| ( srcval2 & 0xff000000); /* l2 */ |
| srcval1 = *srcpixel++; |
| *dstpixel++= ((srcval2 >> 16) & 0x000000ff) | /* g2 */ |
| ( srcval2 & 0x0000ff00) | /* h2 */ |
| ((srcval1 >> 8) & 0x00ff0000) | /* l3 */ |
| ((srcval1 << 8) & 0xff000000); /* g3 */ |
| srcval2 = *srcpixel++; |
| *dstpixel++= ((srcval1 >> 8) & 0x000000ff) | /* h3 */ |
| ((srcval2 >> 16) & 0x0000ff00) | /* l4 */ |
| ( srcval2 & 0x00ff0000) | /* g4 */ |
| ((srcval2 << 16) & 0xff000000); /* h4 */ |
| } |
| /* And now up to 3 odd pixels */ |
| dstbyte=(BYTE*)dstpixel; |
| for (x=0; x<oddwidth; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| FLIP_DWORD(&srcval); |
| *((WORD*)dstbyte)=srcval; /* h, g */ |
| dstbyte+=sizeof(WORD); |
| *dstbyte++=srcval >> 16; /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_0888_to_888_reverse_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| void* dstbits, int dstlinebytes) |
| { |
| const DWORD* srcpixel; |
| DWORD* dstpixel; |
| BYTE* dstbyte; |
| int x,y; |
| int oddwidth; |
| |
| oddwidth=width & 3; |
| width=width/4; |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| /* Do 4 pixels at a time: 4 dwords in and 3 dwords out */ |
| DWORD srcval1,srcval2; |
| srcval1=*srcpixel++; |
| srcval2= ((srcval1 >> 8 ) & 0x00ffffff); /* l1, g1, h1 */ |
| srcval1=*srcpixel++; |
| *dstpixel++=srcval2 | |
| ((srcval1 << 16) & 0xff000000); /* h2 */ |
| srcval2= ((srcval1 >> 16) & 0x0000ffff); /* l2, g2 */ |
| srcval1=*srcpixel++; |
| *dstpixel++=srcval2 | |
| ((srcval1 << 8) & 0xffff0000); /* g3, h3 */ |
| srcval2= ((srcval1 >> 24) & 0x000000ff); /* l3 */ |
| srcval1=*srcpixel++; |
| *dstpixel++=srcval2 | |
| srcval1; /* l4, g4, h4 */ |
| } |
| /* And now up to 3 odd pixels */ |
| dstbyte=(BYTE*)dstpixel; |
| for (x=0; x<oddwidth; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| *((WORD*)dstbyte)=((srcval >> 8) & 0xffff); /* g, h */ |
| dstbyte+=sizeof(WORD); |
| *dstbyte++= srcval >> 24; /* l */ |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_any0888_to_rgb888_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| DWORD rsrc, DWORD gsrc, DWORD bsrc, |
| void* dstbits, int dstlinebytes) |
| { |
| int rRightShift,gRightShift,bRightShift; |
| const DWORD* srcpixel; |
| BYTE* dstpixel; |
| int x,y; |
| |
| rRightShift=X11DRV_DIB_MaskToShift(rsrc); |
| gRightShift=X11DRV_DIB_MaskToShift(gsrc); |
| bRightShift=X11DRV_DIB_MaskToShift(bsrc); |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| FLIP_DWORD(&srcval); |
| dstpixel[0]=(srcval >> bRightShift); /* b */ |
| dstpixel[1]=(srcval >> gRightShift); /* g */ |
| dstpixel[2]=(srcval >> rRightShift); /* r */ |
| dstpixel+=3; |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| static void convert_any0888_to_bgr888_src_byteswap(int width, int height, |
| const void* srcbits, int srclinebytes, |
| DWORD rsrc, DWORD gsrc, DWORD bsrc, |
| void* dstbits, int dstlinebytes) |
| { |
| int rRightShift,gRightShift,bRightShift; |
| const DWORD* srcpixel; |
| BYTE* dstpixel; |
| int x,y; |
| |
| rRightShift=X11DRV_DIB_MaskToShift(rsrc); |
| gRightShift=X11DRV_DIB_MaskToShift(gsrc); |
| bRightShift=X11DRV_DIB_MaskToShift(bsrc); |
| for (y=0; y<height; y++) { |
| srcpixel=srcbits; |
| dstpixel=dstbits; |
| for (x=0; x<width; x++) { |
| DWORD srcval; |
| srcval=*srcpixel++; |
| FLIP_DWORD(&srcval); |
| dstpixel[0]=(srcval >> rRightShift); /* r */ |
| dstpixel[1]=(srcval >> gRightShift); /* g */ |
| dstpixel[2]=(srcval >> bRightShift); /* b */ |
| dstpixel+=3; |
| } |
| srcbits = (const char*)srcbits + srclinebytes; |
| dstbits = (char*)dstbits + dstlinebytes; |
| } |
| } |
| |
| |
| const dib_conversions dib_src_byteswap = { |
| convert_5x5_asis_src_byteswap, |
| convert_555_reverse_src_byteswap, |
| convert_555_to_565_asis_src_byteswap, |
| convert_555_to_565_reverse_src_byteswap, |
| convert_555_to_888_asis_src_byteswap, |
| convert_555_to_888_reverse_src_byteswap, |
| convert_555_to_0888_asis_src_byteswap, |
| convert_555_to_0888_reverse_src_byteswap, |
| convert_5x5_to_any0888_src_byteswap, |
| convert_565_reverse_src_byteswap, |
| convert_565_to_555_asis_src_byteswap, |
| convert_565_to_555_reverse_src_byteswap, |
| convert_565_to_888_asis_src_byteswap, |
| convert_565_to_888_reverse_src_byteswap, |
| convert_565_to_0888_asis_src_byteswap, |
| convert_565_to_0888_reverse_src_byteswap, |
| convert_888_asis_src_byteswap, |
| convert_888_reverse_src_byteswap, |
| convert_888_to_555_asis_src_byteswap, |
| convert_888_to_555_reverse_src_byteswap, |
| convert_888_to_565_asis_src_byteswap, |
| convert_888_to_565_reverse_src_byteswap, |
| convert_888_to_0888_asis_src_byteswap, |
| convert_888_to_0888_reverse_src_byteswap, |
| convert_rgb888_to_any0888_src_byteswap, |
| convert_bgr888_to_any0888_src_byteswap, |
| convert_0888_asis_src_byteswap, |
| convert_0888_reverse_src_byteswap, |
| convert_0888_any_src_byteswap, |
| convert_0888_to_555_asis_src_byteswap, |
| convert_0888_to_555_reverse_src_byteswap, |
| convert_0888_to_565_asis_src_byteswap, |
| convert_0888_to_565_reverse_src_byteswap, |
| convert_any0888_to_5x5_src_byteswap, |
| convert_0888_to_888_asis_src_byteswap, |
| convert_0888_to_888_reverse_src_byteswap, |
| convert_any0888_to_rgb888_src_byteswap, |
| convert_any0888_to_bgr888_src_byteswap |
| }; |