|  | /* | 
|  | * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 the 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 the 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 the 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 the 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 the 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 the 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 | 
|  | }; |