home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / Kasumi / source / uberblit_swizzle.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-14  |  2.0 KB  |  90 lines

  1. #include "uberblit_swizzle.h"
  2.  
  3. void VDPixmapGen_Swap8In16::Init(IVDPixmapGen *gen, int srcIndex, uint32 w, uint32 h, uint32 bpr) {
  4.     InitSource(gen, srcIndex);
  5.     mRowLength = bpr;
  6.     SetOutputSize(w, h);
  7.     gen->AddWindowRequest(0, 0);
  8. }
  9.  
  10. void VDPixmapGen_Swap8In16::Start() {
  11.     StartWindow(mRowLength);
  12. }
  13.  
  14. uint32 VDPixmapGen_Swap8In16::GetType(uint32 index) const {
  15.     return mpSrc->GetType(mSrcIndex);
  16. }
  17.  
  18. void VDPixmapGen_Swap8In16::Compute(void *dst0, sint32 y) {
  19.     const uint8 *src = (const uint8 *)mpSrc->GetRow(y, mSrcIndex);
  20.     uint8 *dst = (uint8 *)dst0;
  21.     sint32 w = mRowLength;
  22.  
  23.     uint32 n4 = w >> 2;
  24.  
  25.     for(uint32 i=0; i<n4; ++i) {
  26.         uint32 p = *(uint32 *)src;
  27.         src += 4;
  28.  
  29.         uint32 r = ((p & 0xff00ff00) >> 8) + ((p & 0x00ff00ff) << 8);
  30.  
  31.         *(uint32 *)dst = r;
  32.         dst += 4;
  33.     }
  34.  
  35.     if (w & 2) {
  36.         dst[0] = src[1];
  37.         dst[1] = src[0];
  38.         dst += 2;
  39.         src += 2;
  40.     }
  41.  
  42.     if (w & 1) {
  43.         *dst = *src;
  44.     }
  45. }
  46.  
  47. /////////////////////////////////////////////////////////////////////////////
  48.  
  49. void VDPixmapGen_B8x2_To_B8R8::Init(IVDPixmapGen *srcCb, uint32 srcindexCb, IVDPixmapGen *srcCr, uint32 srcindexCr) {
  50.     mpSrcCb = srcCb;
  51.     mSrcIndexCb = srcindexCb;
  52.     mpSrcCr = srcCr;
  53.     mSrcIndexCr = srcindexCr;
  54.     mWidth = srcCb->GetWidth(srcindexCb);
  55.     mHeight = srcCb->GetHeight(srcindexCb);
  56.  
  57.     srcCb->AddWindowRequest(0, 0);
  58.     srcCr->AddWindowRequest(0, 0);
  59. }
  60.  
  61. void VDPixmapGen_B8x2_To_B8R8::Start() {
  62.     mpSrcCb->Start();
  63.     mpSrcCr->Start();
  64.  
  65.     StartWindow(mWidth * 2);
  66. }
  67.  
  68. uint32 VDPixmapGen_B8x2_To_B8R8::GetType(uint32 output) const {
  69.     return (mpSrcCb->GetType(mSrcIndexCb) & ~kVDPixType_Mask) | kVDPixType_B8R8;
  70. }
  71.  
  72. void VDPixmapGen_B8x2_To_B8R8::Compute(void *dst0, sint32 y) {
  73.     uint8 *VDRESTRICT dst = (uint8 *)dst0;
  74.     const uint8 *VDRESTRICT srcCb = (const uint8 *)mpSrcCb->GetRow(y, mSrcIndexCb);
  75.     const uint8 *VDRESTRICT srcCr = (const uint8 *)mpSrcCr->GetRow(y, mSrcIndexCr);
  76.  
  77.     sint32 w = mWidth;
  78.     for(sint32 x=0; x<w; ++x) {
  79.         uint8 cb = srcCb[0];
  80.         uint8 cr = srcCr[0];
  81.  
  82.         dst[0] = cb;
  83.         dst[1] = cr;
  84.  
  85.         ++srcCb;
  86.         ++srcCr;
  87.         dst += 2;
  88.     }
  89. }
  90.