CScrollController.cpp
上传用户:hhs829
上传日期:2022-06-17
资源大小:586k
文件大小:4k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. //
  2. // CScrollController.cpp
  3. //
  4. #include <streams.h>
  5. #include "COverlayController.h"
  6. #include "CScrollController.h"
  7. ////////////////////////////////////////////////////////////////////////////////////
  8. CScrollController::CScrollController() :
  9. cDefaultStride(10)
  10. {
  11. mIsBottomScrolling = TRUE;
  12. mScrollStride      = cDefaultStride;
  13. SetRectEmpty(&mValidTitleRect);
  14. }
  15. CScrollController::~CScrollController()
  16. {
  17. }
  18. void CScrollController::SetScrollBottomOrTop(BOOL inIsBottom)
  19. {
  20. mIsBottomScrolling = inIsBottom;
  21. }
  22. BOOL CScrollController::StartTitleOverlay(void)
  23. {
  24. BOOL pass = COverlayController::StartTitleOverlay();
  25. if (pass)
  26. {
  27. // After title DIB created successfully, we can calculate the
  28. // start point of Y-axis according to mIsBottomScrolling
  29. mStartPos.x = mImageWidth - 1;
  30. if (mIsBottomScrolling)
  31. {
  32. mStartPos.y = mImageHeight - mTitleSize.cy;
  33. }
  34. else
  35. {
  36. mStartPos.y = 0;
  37. }
  38. CalculateScrollStride();
  39. }
  40. return pass;
  41. }
  42. void CScrollController::SideEffectProgressChanged(void)
  43. {
  44. COverlayController::SideEffectProgressChanged();
  45. CalculateScrollStride();
  46. }
  47. // Calculate the stride according to the title duration
  48. void CScrollController::CalculateScrollStride(void)
  49. {
  50. if (mOverlayEndTime != -1)
  51. {
  52. double scrollingLength = mImageWidth + mTitleSize.cx;
  53. mScrollStride = scrollingLength / (mOverlayEndTime - mOverlayStartTime);
  54. }
  55. else
  56. {
  57. mScrollStride = cDefaultStride;
  58. }
  59. }
  60. BOOL CScrollController::BeforeActualOverlay(void)
  61. {
  62. BOOL pass = COverlayController::BeforeActualOverlay();
  63. if (pass)
  64. {
  65. // Calculate for the next progress
  66. long actualProgress = mOverlayCounter - mOverlayStartTime;
  67. mStartPos.x = long(mImageWidth - 1 - mScrollStride * actualProgress);
  68. if (mStartPos.x < 0)
  69. {
  70. // Moving out of the left side
  71. mValidTitleRect.left = -mStartPos.x;
  72. if (mValidTitleRect.left >= mTitleSize.cx)
  73. {
  74. mValidTitleRect.left = mTitleSize.cx - 1;
  75. }
  76. mStartPos.x = 0;
  77. if (mTitleSize.cx - mValidTitleRect.left <= mImageWidth)
  78. {
  79. mValidTitleRect.right = mTitleSize.cx - 1;
  80. }
  81. else
  82. {
  83. mValidTitleRect.right = mValidTitleRect.left + mImageWidth;
  84. }
  85. }
  86. else
  87. {
  88. // Moving in the image-width range
  89. mValidTitleRect.left = 0;
  90. long currentLength = mImageWidth - mStartPos.x;
  91. if (currentLength >= mTitleSize.cx)
  92. {
  93. mValidTitleRect.right = mTitleSize.cx - 1;
  94. }
  95. else
  96. {
  97. mValidTitleRect.right = currentLength;
  98. }
  99. }
  100. pass = (mValidTitleRect.right > mValidTitleRect.left);
  101. }
  102. return pass;
  103. }
  104. BOOL CScrollController::ActualOverlay(PBYTE inImage)
  105. {
  106. if (mImageHeight > mTitleSize.cy && mTitleSize.cx > 0 && mTitleSize.cy > 0) 
  107. {
  108. // Image may be bottom-up, may be top-down.
  109. // Anyway retrieve the pointer which point to the top line
  110. PBYTE   pTopLine      = NULL;
  111. long    strideInBytes = 0;
  112. if (mIsBottomUpImage)
  113. {
  114. strideInBytes = -mImageWidthInBytes;
  115.     pTopLine      = inImage + mImageWidthInBytes * (mImageHeight - 1);
  116. }
  117. else
  118. {
  119. strideInBytes = mImageWidthInBytes;
  120. pTopLine      = inImage;
  121. }
  122. PBYTE  pStartPos = pTopLine + mStartPos.y * strideInBytes + mStartPos.x * mImageBitCount / 8;
  123. for (DWORD dwY = 0; dwY < (DWORD)mTitleSize.cy; dwY++) 
  124. {
  125. PBYTE pbTitle = mTitleDIBBits + mDIBWidthInBytes * ((DWORD)mTitleSize.cy - dwY - 1);
  126. // Point to the valid start position of title DIB
  127. pbTitle += (mValidTitleRect.left >> 3);
  128. long  startLeft = mValidTitleRect.left % 8;
  129. long  endRight  = startLeft + mValidTitleRect.right - mValidTitleRect.left;
  130. for (long dwX = startLeft; dwX < endRight; dwX++) 
  131. {
  132. if ( !((0x80 >> (dwX & 7)) & pbTitle[dwX >> 3]) ) 
  133. {
  134. PBYTE pbPixel = mPixelConverter->NextNPixel(pStartPos, dwX - startLeft);
  135. if (mIsOverlayByCover)
  136. {
  137. mPixelConverter->ConvertByCover(pbPixel);
  138. }
  139. else
  140. {
  141. mPixelConverter->ConvertByReverse(pbPixel);
  142. }
  143. }
  144. }
  145. pStartPos += strideInBytes;
  146. }
  147. }
  148. return TRUE;
  149. }