Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # define FILENAME "main.png"
- # define MOD_SHIFT_ 11
- # define MOD_MAPPER_ ( (1 << MOD_SHIFT_))/* MOD_MAPPER is 2^n*/
- # define MOD_SHIFT_MUL_ (MOD_MAPPER_*MOD_MAPPER_)
- DWORD AlphaRGB32_S (DWORD RGB32, DWORD max, DWORD cur) {
- DWORD D0 = RGB32 & 0xFF;
- DWORD D1 = RGB32 & 0xFF00;
- DWORD D2 = RGB32 & 0xFF0000;
- D0 >>= 0;
- D1 >>= 8;
- D2 >>= 16;
- D0 *= cur;
- D1 *= cur;
- D2 *= cur;
- D0 /= max;
- D1 /= max;
- D2 /= max;
- D0 &= 0xFF;
- D1 &= 0xFF;
- D2 &= 0xFF;
- D0 <<= 0;
- D1 <<= 8;
- D2 <<= 16;
- return (D0 | D1 | D2);
- }
- DWORD SuratADD (DWORD U, DWORD V) {
- DWORD U0 = U & 0xFF;
- DWORD U1 = U & 0xFF00;
- DWORD U2 = U & 0xFF0000;
- DWORD V0 = V & 0xFF;
- DWORD V1 = V & 0xFF00;
- DWORD V2 = V & 0xFF0000;
- U0 += V0;
- U1 += V1;
- U2 += V2;
- if (U0 > 0xFF) U0 = 0xFF;
- if (U1 > 0xFF00) U1 = 0xFF00;
- if (U2 > 0xFF0000) U2 = 0xFF0000;
- return (U0 | U1 | U2);
- }
- # if 1
- void Bilinear (DWORD *pDstVPTR, DWORD dwDstPitch,
- DWORD *pSrcVPTR, DWORD dwSrcPitch,
- DWORD dwDstWidth, DWORD dwDstHeight,
- DWORD dwSrcWidth, DWORD dwSrcHeight)
- {
- DWORD dwMapX = (DWORD) ( ((float)MOD_MAPPER_) * (( (float) dwSrcWidth) / ( (float) dwDstWidth) )); // 2->3
- DWORD dwMapY = (DWORD) ( ((float)MOD_MAPPER_) * (( (float) dwSrcHeight) / ( (float) dwDstHeight))); // 2->3
- DWORD dwPosInSrcY = 0;
- DWORD dwPosInSrcX = 0;
- DWORD dwRTInSrcY;
- DWORD dwRTInSrcX;
- DWORD dwsPit = dwSrcPitch >> 2;
- DWORD dwdPit = dwDstPitch >> 2;
- DWORD dwMapTotal_X = 0;
- DWORD dwMapTotal_Y = 0;
- DWORD dwRVADst = dwDstPitch - dwDstWidth *4;
- DWORD dwCahceScanLine_Y = 0;
- DWORD dwCahceScanLine_Y2 = 0;
- for (DWORD dwScanY = 0; dwScanY != dwDstHeight; dwScanY++) {
- dwMapTotal_Y += dwMapY;
- dwPosInSrcY = dwMapTotal_Y >> MOD_SHIFT_;
- dwRTInSrcY = dwMapTotal_Y & (MOD_MAPPER_ - 1);
- dwMapTotal_X = 0;
- dwCahceScanLine_Y = dwsPit*dwPosInSrcY;
- dwCahceScanLine_Y2 = dwdPit*dwScanY;
- for (DWORD dwScanX = 0; dwScanX != dwDstWidth; dwScanX++) {
- // fetch top-left, top-right, botton-left, bottom-right
- // source sample .
- dwMapTotal_X += dwMapX;
- dwPosInSrcX = dwMapTotal_X >> MOD_SHIFT_;
- dwRTInSrcX = dwMapTotal_X & (MOD_MAPPER_ - 1);
- const DWORD temp = dwCahceScanLine_Y+dwPosInSrcX;
- DWORD cpTopLeft = pSrcVPTR[temp];
- DWORD cpTopRight = pSrcVPTR[temp+1];
- DWORD cpBottomLeft = pSrcVPTR[temp+dwsPit];
- DWORD cpBottomRight = pSrcVPTR[temp+dwsPit+1];
- // Get X, Y ratio .
- DWORD apLeft = dwRTInSrcX;
- DWORD apRight = MOD_MAPPER_ - apLeft;
- DWORD apTop = dwRTInSrcY;
- DWORD apBottom = MOD_MAPPER_ - apTop;
- // Get Weighted ratio
- DWORD wtTopLeft = apRight * apBottom;
- DWORD wtTopRight = apLeft * apBottom;
- DWORD wtBottomLeft = apRight * apTop;
- DWORD wtBottomRight = apLeft * apTop;
- // Get RGB percent. Write Into Buffer.
- DWORD dbTopLeft = AlphaRGB32_S (cpTopLeft, MOD_SHIFT_MUL_, wtTopLeft);
- DWORD dbTopRight = AlphaRGB32_S (cpTopRight, MOD_SHIFT_MUL_, wtTopRight);
- DWORD dbBottomLeft = AlphaRGB32_S (cpBottomLeft, MOD_SHIFT_MUL_, wtBottomLeft);
- DWORD dbBottomRight = AlphaRGB32_S (cpBottomRight, MOD_SHIFT_MUL_, wtBottomRight);
- DWORD dbTopMix = SuratADD ( dbTopLeft, dbTopRight);
- DWORD dbBottomMix = SuratADD ( dbBottomLeft, dbBottomRight);
- DWORD dbOutputMix = SuratADD ( dbTopMix, dbBottomMix);
- pDstVPTR[dwCahceScanLine_Y2+dwScanX] = dbOutputMix;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement