#ifndef f_VD2_KASUMI_UBERBLIT_RGB_H #define f_VD2_KASUMI_UBERBLIT_RGB_H #include #include "uberblit_base.h" /////////////////////////////////////////////////////////////////////////////////////////////////// // // 16-bit crossconverters // /////////////////////////////////////////////////////////////////////////////////////////////////// class VDPixmapGen_X1R5G5B5_To_R5G6B5 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 2); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_565_LE; } protected: virtual void Compute(void *dst0, sint32 y) { uint16 *dst = (uint16 *)dst0; const uint16 *src = (const uint16 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; i> 5; dst[i] = (uint16)px; } } }; class VDPixmapGen_R5G6B5_To_X1R5G5B5 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 2); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8888; } protected: void Compute(void *dst0, sint32 y) { uint16 *dst = (uint16 *)dst0; const uint16 *src = (const uint16 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; i> 1; dst[i] = (uint16)px; } } }; /////////////////////////////////////////////////////////////////////////////////////////////////// // // 32-bit upconverters // /////////////////////////////////////////////////////////////////////////////////////////////////// class VDPixmapGen_X1R5G5B5_To_X8R8G8B8 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 4); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8888; } protected: virtual void Compute(void *dst0, sint32 y) { uint32 *dst = (uint32 *)dst0; const uint16 *src = (const uint16 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; i> 5) & 0x070707); } } }; class VDPixmapGen_R5G6B5_To_X8R8G8B8 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 4); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8888; } protected: void Compute(void *dst0, sint32 y) { uint32 *dst = (uint32 *)dst0; const uint16 *src = (const uint16 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; i> 5) + (px_g6 >> 6)) & 0x070307); } } }; class VDPixmapGen_R8G8B8_To_A8R8G8B8 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 4); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8888; } protected: void Compute(void *dst0, sint32 y) { uint8 *dst = (uint8 *)dst0; const uint8 *src = (const uint8 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; iGetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_1555_LE; } protected: void Compute(void *dst0, sint32 y) { uint16 *dst = (uint16 *)dst0; const uint32 *src = (const uint32 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; i> 9) & 0x7c00) + ((px >> 6) & 0x03e0) + ((px >> 3) & 0x001f); } } }; class VDPixmapGen_X8R8G8B8_To_R5G6B5 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 2); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_565_LE; } protected: void Compute(void *dst0, sint32 y) { uint16 *dst = (uint16 *)dst0; const uint32 *src = (const uint32 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; i> 8) & 0xf800) + ((px >> 5) & 0x07e0) + ((px >> 3) & 0x001f); } } }; class VDPixmapGen_X8R8G8B8_To_R8G8B8 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 3); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_888; } protected: void Compute(void *dst0, sint32 y) { uint8 *dst = (uint8 *)dst0; const uint8 *src = (const uint8 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; for(sint32 i=0; iGetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_1555_LE; } protected: void Compute(void *dst0, sint32 y) { uint16 *dst = (uint16 *)dst0; const uint32 *src = (const uint32 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; static const uint32 kDitherMatrix[4][4][2]={ { 0x00000000, 0x00000000, 0x04000400, 0x00040000, 0x01000100, 0x00010000, 0x05000500, 0x00050000 }, { 0x06000600, 0x00060000, 0x02000200, 0x00020000, 0x07000700, 0x00070000, 0x03000300, 0x00030000 }, { 0x01800180, 0x00018000, 0x05800580, 0x00058000, 0x00800080, 0x00008000, 0x04800480, 0x00048000 }, { 0x07800780, 0x00078000, 0x03800380, 0x00038000, 0x06800680, 0x00068000, 0x02800280, 0x00028000 }, }; const uint32 (*drow)[2] = kDitherMatrix[y & 3]; for(sint32 i=0; i> 17) & 0x7c00) + ((g >> 14) & 0x03e0) + ((rb >> 11) & 0x001f); } } }; class VDPixmapGen_X8R8G8B8_To_R5G6B5_Dithered : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 2); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_565_LE; } protected: void Compute(void *dst0, sint32 y) { uint16 *dst = (uint16 *)dst0; const uint32 *src = (const uint32 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; static const uint32 kDitherMatrix[4][4][2]={ { 0x00000000, 0x00000000, 0x04000400, 0x00020000, 0x01000100, 0x00008000, 0x05000500, 0x00028000 }, { 0x06000600, 0x00030000, 0x02000200, 0x00010000, 0x07000700, 0x00038000, 0x03000300, 0x00018000 }, { 0x01800180, 0x0000c000, 0x05800580, 0x0002c000, 0x00800080, 0x00004000, 0x04800480, 0x00024000 }, { 0x07800780, 0x0003c000, 0x03800380, 0x0001c000, 0x06800680, 0x00034000, 0x02800280, 0x00014000 }, }; const uint32 (*drow)[2] = kDitherMatrix[y & 3]; for(sint32 i=0; i> 16) & 0xf800) + ((g >> 13) & 0x07e0) + ((rb >> 11) & 0x001f); } } }; /////////////////////////////////////////////////////////////////////////////////////////////////// // // 32F upconverters // /////////////////////////////////////////////////////////////////////////////////////////////////// class VDPixmapGen_8_To_32F : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 4); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_32F_LE; } protected: void Compute(void *dst0, sint32 y) { float *dst = (float *)dst0; const uint8 *src = (const uint8 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; VDCPUCleanupExtensions(); for(sint32 i=0; iGetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_32Fx4_LE; } protected: void Compute(void *dst0, sint32 y) { float *dst = (float *)dst0; const uint8 *src = (const uint8 *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; VDCPUCleanupExtensions(); for(sint32 i=0; iGetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8; } protected: void Compute(void *dst0, sint32 y) { uint8 *dst = (uint8 *)dst0; const float *src = (const float *)mpSrc->GetRow(y, mSrcIndex); sint32 w = mWidth; VDCPUCleanupExtensions(); for(sint32 i=0; iGetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8; } protected: void Compute(void *dst0, sint32 y) { uint8 *dst = (uint8 *)dst0; const float *src = (const float *)mpSrc->GetRow(y, mSrcIndex); VDCPUCleanupExtensions(); sint32 w = mWidth; #define X(v) ((v) - 0x49400000) static const sint32 kDitherMatrix[4][4]={ { X( 0), X( 8), X( 2), X(10), }, { X(12), X( 4), X(14), X( 6), }, { X( 3), X(11), X( 1), X( 9), }, { X(15), X( 7), X(13), X( 5), }, }; #undef X const sint32 *pDitherRow = kDitherMatrix[y & 3]; for(sint32 i=0; i> 4; if ((uint32)vb >= 0x100) vb = (uint8)(~vb >> 31); dst[i] = (uint8)vb; } } }; class VDPixmapGen_X32B32G32R32F_To_X8R8G8B8 : public VDPixmapGenWindowBasedOneSourceSimple { public: void Start() { StartWindow(mWidth * 4); } uint32 GetType(uint32 output) const { return (mpSrc->GetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8888; } protected: void Compute(void *dst0, sint32 y) { uint32 *dst = (uint32 *)dst0; const float *src = (const float *)mpSrc->GetRow(y, mSrcIndex); VDCPUCleanupExtensions(); sint32 w = mWidth; for(sint32 i=0; iGetType(mSrcIndex) & ~kVDPixType_Mask) | kVDPixType_8888; } protected: void Compute(void *dst0, sint32 y) { uint32 *dst = (uint32 *)dst0; const float *src = (const float *)mpSrc->GetRow(y, mSrcIndex); VDCPUCleanupExtensions(); sint32 w = mWidth; #define X(v) ((v) - 0x49400000) static const sint32 kDitherMatrix[4][4]={ { X( 0), X( 8), X( 2), X(10), }, { X(12), X( 4), X(14), X( 6), }, { X( 3), X(11), X( 1), X( 9), }, { X(15), X( 7), X(13), X( 5), }, }; #undef X const sint32 *pDitherRow = kDitherMatrix[y & 3]; for(sint32 i=0; i> 4; sint32 vg = ((sint32)cg.i + addend) >> 4; sint32 vb = ((sint32)cb.i + addend) >> 4; if ((uint32)vr >= 0x100) vr = (uint8)(~vr >> 31); if ((uint32)vg >= 0x100) vg = (uint8)(~vg >> 31); if ((uint32)vb >= 0x100) vb = (uint8)(~vb >> 31); dst[i] = (vr << 16) + (vg << 8) + vb; } } }; #endif