Advertisement
xiahanlu

DIrectSUrface用 双线性插值

Aug 28th, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. # define FILENAME "main.png"
  2. # define MOD_SHIFT_ 11
  3. # define MOD_MAPPER_ ( (1 << MOD_SHIFT_))/* MOD_MAPPER is 2^n*/
  4. # define MOD_SHIFT_MUL_ (MOD_MAPPER_*MOD_MAPPER_)
  5.  
  6. DWORD AlphaRGB32_S (DWORD RGB32, DWORD max, DWORD cur) {
  7. DWORD D0 = RGB32 & 0xFF;
  8. DWORD D1 = RGB32 & 0xFF00;
  9. DWORD D2 = RGB32 & 0xFF0000;
  10. D0 >>= 0;
  11. D1 >>= 8;
  12. D2 >>= 16;
  13. D0 *= cur;
  14. D1 *= cur;
  15. D2 *= cur;
  16. D0 /= max;
  17. D1 /= max;
  18. D2 /= max;
  19. D0 &= 0xFF;
  20. D1 &= 0xFF;
  21. D2 &= 0xFF;
  22. D0 <<= 0;
  23. D1 <<= 8;
  24. D2 <<= 16;
  25. return (D0 | D1 | D2);
  26. }
  27.  
  28. DWORD SuratADD (DWORD U, DWORD V) {
  29. DWORD U0 = U & 0xFF;
  30. DWORD U1 = U & 0xFF00;
  31. DWORD U2 = U & 0xFF0000;
  32. DWORD V0 = V & 0xFF;
  33. DWORD V1 = V & 0xFF00;
  34. DWORD V2 = V & 0xFF0000;
  35. U0 += V0;
  36. U1 += V1;
  37. U2 += V2;
  38. if (U0 > 0xFF) U0 = 0xFF;
  39. if (U1 > 0xFF00) U1 = 0xFF00;
  40. if (U2 > 0xFF0000) U2 = 0xFF0000;
  41. return (U0 | U1 | U2);
  42. }
  43.  
  44. # if 1
  45. void Bilinear (DWORD *pDstVPTR, DWORD dwDstPitch,
  46. DWORD *pSrcVPTR, DWORD dwSrcPitch,
  47. DWORD dwDstWidth, DWORD dwDstHeight,
  48. DWORD dwSrcWidth, DWORD dwSrcHeight)
  49. {
  50. DWORD dwMapX = (DWORD) ( ((float)MOD_MAPPER_) * (( (float) dwSrcWidth) / ( (float) dwDstWidth) )); // 2->3
  51. DWORD dwMapY = (DWORD) ( ((float)MOD_MAPPER_) * (( (float) dwSrcHeight) / ( (float) dwDstHeight))); // 2->3
  52. DWORD dwPosInSrcY = 0;
  53. DWORD dwPosInSrcX = 0;
  54. DWORD dwRTInSrcY;
  55. DWORD dwRTInSrcX;
  56. DWORD dwsPit = dwSrcPitch >> 2;
  57. DWORD dwdPit = dwDstPitch >> 2;
  58. DWORD dwMapTotal_X = 0;
  59. DWORD dwMapTotal_Y = 0;
  60. DWORD dwRVADst = dwDstPitch - dwDstWidth *4;
  61. DWORD dwCahceScanLine_Y = 0;
  62. DWORD dwCahceScanLine_Y2 = 0;
  63. for (DWORD dwScanY = 0; dwScanY != dwDstHeight; dwScanY++) {
  64. dwMapTotal_Y += dwMapY;
  65. dwPosInSrcY = dwMapTotal_Y >> MOD_SHIFT_;
  66. dwRTInSrcY = dwMapTotal_Y & (MOD_MAPPER_ - 1);
  67. dwMapTotal_X = 0;
  68. dwCahceScanLine_Y = dwsPit*dwPosInSrcY;
  69. dwCahceScanLine_Y2 = dwdPit*dwScanY;
  70. for (DWORD dwScanX = 0; dwScanX != dwDstWidth; dwScanX++) {
  71. // fetch top-left, top-right, botton-left, bottom-right
  72. // source sample .
  73. dwMapTotal_X += dwMapX;
  74. dwPosInSrcX = dwMapTotal_X >> MOD_SHIFT_;
  75. dwRTInSrcX = dwMapTotal_X & (MOD_MAPPER_ - 1);
  76.  
  77. const DWORD temp = dwCahceScanLine_Y+dwPosInSrcX;
  78.  
  79. DWORD cpTopLeft = pSrcVPTR[temp];
  80. DWORD cpTopRight = pSrcVPTR[temp+1];
  81. DWORD cpBottomLeft = pSrcVPTR[temp+dwsPit];
  82. DWORD cpBottomRight = pSrcVPTR[temp+dwsPit+1];
  83.  
  84. // Get X, Y ratio .
  85. DWORD apLeft = dwRTInSrcX;
  86. DWORD apRight = MOD_MAPPER_ - apLeft;
  87. DWORD apTop = dwRTInSrcY;
  88. DWORD apBottom = MOD_MAPPER_ - apTop;
  89. // Get Weighted ratio
  90. DWORD wtTopLeft = apRight * apBottom;
  91. DWORD wtTopRight = apLeft * apBottom;
  92. DWORD wtBottomLeft = apRight * apTop;
  93. DWORD wtBottomRight = apLeft * apTop;
  94. // Get RGB percent. Write Into Buffer.
  95. DWORD dbTopLeft = AlphaRGB32_S (cpTopLeft, MOD_SHIFT_MUL_, wtTopLeft);
  96. DWORD dbTopRight = AlphaRGB32_S (cpTopRight, MOD_SHIFT_MUL_, wtTopRight);
  97. DWORD dbBottomLeft = AlphaRGB32_S (cpBottomLeft, MOD_SHIFT_MUL_, wtBottomLeft);
  98. DWORD dbBottomRight = AlphaRGB32_S (cpBottomRight, MOD_SHIFT_MUL_, wtBottomRight);
  99. DWORD dbTopMix = SuratADD ( dbTopLeft, dbTopRight);
  100. DWORD dbBottomMix = SuratADD ( dbBottomLeft, dbBottomRight);
  101. DWORD dbOutputMix = SuratADD ( dbTopMix, dbBottomMix);
  102.  
  103. pDstVPTR[dwCahceScanLine_Y2+dwScanX] = dbOutputMix;
  104. }
  105. }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement