Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

403 lines
14 KiB

  1. /*******************************************************************************
  2. *
  3. * (C) COPYRIGHT MICROSOFT CORPORATION, 1998, 1999, 2000
  4. *
  5. * TITLE: PAINTERS.CPP
  6. *
  7. * VERSION: 1.0
  8. *
  9. * AUTHOR: ShaunIv
  10. *
  11. * DATE: 1/13/1999
  12. *
  13. * DESCRIPTION: Image transition base class and derived classes
  14. *
  15. *******************************************************************************/
  16. #include "precomp.h"
  17. #pragma hdrstop
  18. #include "painters.h"
  19. #include <windowsx.h>
  20. #include "ssutil.h"
  21. CImagePainter::CImagePainter( CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcImageArea, const RECT &rcScreen )
  22. : m_pBitmapImage(pBitmapImage),
  23. m_dwInitialTickCount(0),
  24. m_rcScreen(rcScreen),
  25. m_rcImageArea(rcImageArea),
  26. m_bFirstFrame(true),
  27. m_dwDuration(0),
  28. m_bAlreadyPaintedLastFrame(false)
  29. {
  30. if (m_pBitmapImage)
  31. {
  32. m_rcFinal = m_RandomNumberGen.Generate( m_pBitmapImage->ImageSize().cx, m_pBitmapImage->ImageSize().cy, rcImageArea );
  33. WIA_TRACE((TEXT("Image size: (%d, %d)"), m_pBitmapImage->ImageSize().cx, m_pBitmapImage->ImageSize().cy ));
  34. WIA_TRACE((TEXT("Chosen Final Rect = (%d,%d), (%d,%d)"), m_rcFinal.left, m_rcFinal.top, m_rcFinal.right, m_rcFinal.bottom ));
  35. }
  36. }
  37. CImagePainter::~CImagePainter(void)
  38. {
  39. if (m_pBitmapImage)
  40. {
  41. delete m_pBitmapImage;
  42. }
  43. m_pBitmapImage = NULL;
  44. }
  45. DWORD CImagePainter::ElapsedTime(void) const
  46. {
  47. DWORD dwElapsed = GetTickCount() - m_dwInitialTickCount;
  48. if (dwElapsed > m_dwDuration)
  49. dwElapsed = m_dwDuration;
  50. return(dwElapsed);
  51. }
  52. CBitmapImage *CImagePainter::BitmapImage(void)
  53. {
  54. return(m_pBitmapImage);
  55. }
  56. void CImagePainter::Paint( CSimpleDC &PaintDC )
  57. {
  58. if (PaintDC.IsValid() && m_pBitmapImage)
  59. {
  60. ScreenSaverUtil::SelectPalette( PaintDC, m_pBitmapImage->Palette(), FALSE );
  61. CSimpleDC MemoryDC;
  62. if (MemoryDC.CreateCompatibleDC(PaintDC))
  63. {
  64. ScreenSaverUtil::SelectPalette( MemoryDC, m_pBitmapImage->Palette(), FALSE );
  65. Paint( PaintDC, MemoryDC );
  66. }
  67. }
  68. }
  69. void CImagePainter::Paint( CSimpleDC &PaintDC, CSimpleDC &MemoryDC )
  70. {
  71. SelectBitmap( MemoryDC, BitmapImage()->GetBitmap() );
  72. BitBlt( PaintDC, m_rcFinal.left, m_rcFinal.top, RECT_WIDTH(m_rcFinal), RECT_HEIGHT(m_rcFinal), MemoryDC, 0, 0, SRCCOPY );
  73. }
  74. bool CImagePainter::TimerTick( CSimpleDC &ClientDC )
  75. {
  76. bool bStopPainting = false;
  77. if (m_bFirstFrame)
  78. {
  79. m_dwInitialTickCount = GetTickCount();
  80. Erase( ClientDC, m_rcScreen );
  81. }
  82. //
  83. if (m_bFirstFrame || NeedPainting())
  84. {
  85. if (m_pBitmapImage && ClientDC.IsValid())
  86. {
  87. ScreenSaverUtil::SelectPalette( ClientDC, m_pBitmapImage->Palette(), FALSE );
  88. CSimpleDC MemoryDC;
  89. if (MemoryDC.CreateCompatibleDC(ClientDC))
  90. {
  91. ScreenSaverUtil::SelectPalette( MemoryDC, m_pBitmapImage->Palette(), FALSE );
  92. PaintFrame( ClientDC, MemoryDC );
  93. }
  94. }
  95. if (m_bFirstFrame)
  96. m_bFirstFrame = false;
  97. }
  98. else bStopPainting = true;
  99. return bStopPainting;
  100. }
  101. void CImagePainter::Erase( CSimpleDC &ClientDC, RECT &rc )
  102. {
  103. FillRect( ClientDC, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH) );
  104. }
  105. bool CImagePainter::NeedPainting(void)
  106. {
  107. return(false);
  108. }
  109. bool CImagePainter::IsValid(void)
  110. {
  111. return(m_pBitmapImage && m_pBitmapImage->GetBitmap());
  112. }
  113. /****************************************************************************
  114. CSimpleTransitionPainter
  115. *****************************************************************************/
  116. CSimpleTransitionPainter::CSimpleTransitionPainter( CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcImageArea, const RECT &rcScreen )
  117. : CImagePainter( pBitmapImage, ClientDC, rcImageArea, rcScreen )
  118. {
  119. }
  120. CSimpleTransitionPainter::~CSimpleTransitionPainter(void)
  121. {
  122. }
  123. void CSimpleTransitionPainter::PaintFrame( CSimpleDC &ClientDC, CSimpleDC &MemoryDC )
  124. {
  125. SelectBitmap( MemoryDC, BitmapImage()->GetBitmap() );
  126. SIZE sizeImage = BitmapImage()->ImageSize();
  127. BitBlt( ClientDC, m_rcFinal.left, m_rcFinal.top, sizeImage.cx, sizeImage.cy, MemoryDC, 0, 0, SRCCOPY );
  128. }
  129. /****************************************************************************
  130. CSlidingTransitionPainter
  131. *****************************************************************************/
  132. CSlidingTransitionPainter::CSlidingTransitionPainter( CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcImageArea, const RECT &rcScreen )
  133. : CImagePainter( pBitmapImage, ClientDC, rcImageArea, rcScreen )
  134. {
  135. m_dwDuration = 5000;
  136. ZeroMemory(&m_rcPrevious,sizeof(m_rcPrevious));
  137. switch (CRandomNumberGen().Generate(8))
  138. {
  139. case 0:
  140. // left, top
  141. m_rcOriginal.left = rcScreen.left - BitmapImage()->ImageSize().cx;
  142. m_rcOriginal.top = rcScreen.top - BitmapImage()->ImageSize().cy;
  143. m_rcOriginal.right = rcScreen.left;
  144. m_rcOriginal.bottom = rcScreen.top;
  145. break;
  146. case 1:
  147. // top
  148. m_rcOriginal.left = m_rcFinal.left;
  149. m_rcOriginal.top = rcScreen.top - BitmapImage()->ImageSize().cy;
  150. m_rcOriginal.right = m_rcFinal.right;
  151. m_rcOriginal.bottom = rcScreen.top;
  152. break;
  153. case 2:
  154. // right, top
  155. m_rcOriginal.left = rcScreen.right;
  156. m_rcOriginal.top = rcScreen.top - BitmapImage()->ImageSize().cy;
  157. m_rcOriginal.right = rcScreen.right + BitmapImage()->ImageSize().cx;
  158. m_rcOriginal.bottom = rcScreen.top;
  159. break;
  160. case 3:
  161. // right
  162. m_rcOriginal.left = rcScreen.right;
  163. m_rcOriginal.top = m_rcFinal.top;
  164. m_rcOriginal.right = rcScreen.right + BitmapImage()->ImageSize().cx;
  165. m_rcOriginal.bottom = m_rcFinal.bottom;
  166. break;
  167. case 4:
  168. // right, bottom
  169. m_rcOriginal.left = rcScreen.right;
  170. m_rcOriginal.top = rcScreen.bottom;
  171. m_rcOriginal.right = rcScreen.right + BitmapImage()->ImageSize().cx;
  172. m_rcOriginal.bottom = rcScreen.bottom + BitmapImage()->ImageSize().cy;
  173. break;
  174. case 5:
  175. // bottom
  176. m_rcOriginal.left = m_rcFinal.left;
  177. m_rcOriginal.top = rcScreen.bottom;
  178. m_rcOriginal.right = m_rcFinal.right;
  179. m_rcOriginal.bottom = rcScreen.bottom + BitmapImage()->ImageSize().cy;
  180. break;
  181. case 6:
  182. // left,bottom
  183. m_rcOriginal.left = rcScreen.left - BitmapImage()->ImageSize().cx;
  184. m_rcOriginal.top = rcScreen.bottom;
  185. m_rcOriginal.right = rcScreen.left;
  186. m_rcOriginal.bottom = rcScreen.bottom + BitmapImage()->ImageSize().cy;
  187. break;
  188. case 7:
  189. // left
  190. m_rcOriginal.left = rcScreen.left - BitmapImage()->ImageSize().cx;
  191. m_rcOriginal.top = m_rcFinal.top;
  192. m_rcOriginal.right = rcScreen.left;
  193. m_rcOriginal.bottom = m_rcFinal.bottom;
  194. break;
  195. }
  196. }
  197. CSlidingTransitionPainter::~CSlidingTransitionPainter(void)
  198. {
  199. }
  200. bool CSlidingTransitionPainter::NeedPainting(void)
  201. {
  202. if (!memcmp( &m_rcPrevious, &m_rcFinal, sizeof(RECT)))
  203. return false;
  204. return true;
  205. }
  206. void CSlidingTransitionPainter::PaintFrame( CSimpleDC &ClientDC, CSimpleDC &MemoryDC )
  207. {
  208. SelectBitmap( MemoryDC, BitmapImage()->GetBitmap() );
  209. SIZE sizeImage = BitmapImage()->ImageSize();
  210. DWORD dwElapsedTime = ElapsedTime();
  211. SIZE sizeDelta;
  212. sizeDelta.cx = m_rcFinal.left - m_rcOriginal.left;
  213. sizeDelta.cy = m_rcFinal.top - m_rcOriginal.top;
  214. SIZE sizeOffset;
  215. sizeOffset.cx = MulDiv(sizeDelta.cx,dwElapsedTime,m_dwDuration);
  216. sizeOffset.cy = MulDiv(sizeDelta.cy,dwElapsedTime,m_dwDuration);
  217. // Make sure we don't overshoot the final rect
  218. if (WiaUiUtil::Absolute(sizeOffset.cx) > WiaUiUtil::Absolute(m_rcFinal.left - m_rcOriginal.left))
  219. sizeOffset.cx = m_rcFinal.left - m_rcOriginal.left;
  220. if (WiaUiUtil::Absolute(sizeOffset.cy) > WiaUiUtil::Absolute(m_rcFinal.top - m_rcOriginal.top))
  221. sizeOffset.cy = m_rcFinal.top - m_rcOriginal.top;
  222. RECT rcCurr = m_rcOriginal;
  223. ScreenSaverUtil::NormalizeRect(rcCurr);
  224. OffsetRect( &rcCurr, sizeOffset.cx, sizeOffset.cy );
  225. ScreenSaverUtil::EraseDiffRect( ClientDC, m_rcPrevious, rcCurr, (HBRUSH)GetStockObject(BLACK_BRUSH) );
  226. BitBlt( ClientDC, rcCurr.left, rcCurr.top, sizeImage.cx, sizeImage.cy, MemoryDC, 0, 0, SRCCOPY );
  227. m_rcPrevious = rcCurr;
  228. }
  229. /****************************************************************************
  230. CRandomBlockPainter
  231. *****************************************************************************/
  232. CRandomBlockPainter::CRandomBlockPainter( CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcImageArea, const RECT &rcScreen )
  233. : CImagePainter( pBitmapImage, ClientDC, rcImageArea, rcScreen ),m_pBlockAddresses(NULL),m_nBlockSize(10),m_nStartIndex(0)
  234. {
  235. m_dwDuration = 2000;
  236. SIZE sizeImage = BitmapImage()->ImageSize();
  237. m_sizeBlockCount.cx = WiaUiUtil::Align( sizeImage.cx, m_nBlockSize ) / m_nBlockSize;
  238. m_sizeBlockCount.cy = WiaUiUtil::Align( sizeImage.cy, m_nBlockSize ) / m_nBlockSize;
  239. m_pBlockAddresses = new int[m_sizeBlockCount.cx * m_sizeBlockCount.cy];
  240. if (m_pBlockAddresses)
  241. {
  242. int i;
  243. for (i=0;i<m_sizeBlockCount.cx * m_sizeBlockCount.cy;i++)
  244. {
  245. m_pBlockAddresses[i] = i;
  246. }
  247. for (i=0;i<m_sizeBlockCount.cx * m_sizeBlockCount.cy;i++)
  248. {
  249. ScreenSaverUtil::Swap( m_pBlockAddresses[i], m_pBlockAddresses[m_RandomNumberGen.Generate(i,m_sizeBlockCount.cx * m_sizeBlockCount.cy)]);
  250. }
  251. }
  252. }
  253. CRandomBlockPainter::~CRandomBlockPainter(void)
  254. {
  255. if (m_pBlockAddresses)
  256. delete[] m_pBlockAddresses;
  257. m_pBlockAddresses = NULL;
  258. }
  259. bool CRandomBlockPainter::NeedPainting(void)
  260. {
  261. return(m_nStartIndex < m_sizeBlockCount.cx * m_sizeBlockCount.cy);
  262. }
  263. bool CRandomBlockPainter::IsValid(void)
  264. {
  265. return (CImagePainter::IsValid() && m_pBlockAddresses != NULL);
  266. }
  267. void CRandomBlockPainter::PaintFrame( CSimpleDC &ClientDC, CSimpleDC &MemoryDC )
  268. {
  269. if (m_pBlockAddresses)
  270. {
  271. SelectBitmap( MemoryDC, BitmapImage()->GetBitmap() );
  272. int nDoUntilIndex = ((m_sizeBlockCount.cx * m_sizeBlockCount.cy) * ElapsedTime()) / m_dwDuration;
  273. for (int i=m_nStartIndex;i<nDoUntilIndex && i<m_sizeBlockCount.cx * m_sizeBlockCount.cy;i++)
  274. {
  275. int nRow = (m_pBlockAddresses[i] / m_sizeBlockCount.cx) * m_nBlockSize;
  276. int nCol = (m_pBlockAddresses[i] % m_sizeBlockCount.cx) * m_nBlockSize;
  277. BitBlt( ClientDC, m_rcFinal.left+nCol, m_rcFinal.top+nRow, m_nBlockSize, m_nBlockSize, MemoryDC, nCol, nRow, SRCCOPY );
  278. }
  279. m_nStartIndex = nDoUntilIndex;
  280. }
  281. }
  282. /****************************************************************************
  283. CAlphaFadePainter
  284. *****************************************************************************/
  285. CAlphaFadePainter::CAlphaFadePainter( CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcImageArea, const RECT &rcScreen )
  286. : CImagePainter( pBitmapImage, ClientDC, rcImageArea, rcScreen )
  287. {
  288. m_dwDuration = 6000;
  289. if (BitmapImage())
  290. {
  291. ZeroMemory(&m_bfBlendFunction,sizeof(m_bfBlendFunction));
  292. m_bfBlendFunction.BlendOp = AC_SRC_OVER;
  293. m_bfBlendFunction.SourceConstantAlpha = 0;
  294. m_hbmpBuffer = CreateCompatibleBitmap( ClientDC, BitmapImage()->ImageSize().cx, BitmapImage()->ImageSize().cy );
  295. CompatDC.CreateCompatibleDC( ClientDC );
  296. }
  297. }
  298. bool CAlphaFadePainter::IsValid(void)
  299. {
  300. return (CImagePainter::IsValid() && m_hbmpBuffer != NULL && CompatDC.IsValid());
  301. }
  302. CAlphaFadePainter::~CAlphaFadePainter(void)
  303. {
  304. if (m_hbmpBuffer)
  305. DeleteObject(m_hbmpBuffer);
  306. }
  307. bool CAlphaFadePainter::NeedPainting(void)
  308. {
  309. return(m_bfBlendFunction.SourceConstantAlpha < 0xFF);
  310. }
  311. void CAlphaFadePainter::PaintFrame( CSimpleDC &ClientDC, CSimpleDC &MemoryDC )
  312. {
  313. ScreenSaverUtil::SelectPalette( CompatDC, BitmapImage()->Palette(), FALSE );
  314. SelectBitmap( MemoryDC, BitmapImage()->GetBitmap() );
  315. HBITMAP hOldBufferBitmap = SelectBitmap( CompatDC, m_hbmpBuffer );
  316. DWORD dwCurrentIndex = (ElapsedTime() * 0xFF) / m_dwDuration;
  317. m_bfBlendFunction.SourceConstantAlpha = (BYTE)(dwCurrentIndex > 255 ? 255 : dwCurrentIndex);
  318. RECT rcImage;
  319. rcImage.left = rcImage.top = 0;
  320. rcImage.right = BitmapImage()->ImageSize().cx;
  321. rcImage.bottom = BitmapImage()->ImageSize().cy;
  322. FillRect( CompatDC, &rcImage, (HBRUSH)GetStockObject(BLACK_BRUSH) );
  323. AlphaBlend( CompatDC, 0, 0, RECT_WIDTH(m_rcFinal), RECT_HEIGHT(m_rcFinal), MemoryDC, 0, 0, RECT_WIDTH(m_rcFinal), RECT_HEIGHT(m_rcFinal), m_bfBlendFunction );
  324. BitBlt( ClientDC, m_rcFinal.left, m_rcFinal.top, RECT_WIDTH(m_rcFinal), RECT_HEIGHT(m_rcFinal), CompatDC, 0, 0, SRCCOPY );
  325. SelectBitmap( CompatDC, hOldBufferBitmap );
  326. }
  327. /****************************************************************************
  328. COpenCurtainPainter
  329. *****************************************************************************/
  330. COpenCurtainPainter::COpenCurtainPainter( CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcImageArea, const RECT &rcScreen )
  331. : CImagePainter( pBitmapImage, ClientDC, rcImageArea, rcScreen ), m_nCurrentWidth(0)
  332. {
  333. m_dwDuration = 3000;
  334. m_nFinalWidth = WiaUiUtil::Align(BitmapImage()->ImageSize().cx,2)/2;
  335. }
  336. COpenCurtainPainter::~COpenCurtainPainter(void)
  337. {
  338. }
  339. bool COpenCurtainPainter::NeedPainting(void)
  340. {
  341. return (m_nCurrentWidth < m_nFinalWidth);
  342. }
  343. void COpenCurtainPainter::PaintFrame( CSimpleDC &ClientDC, CSimpleDC &MemoryDC )
  344. {
  345. m_nCurrentWidth = WiaUiUtil::MulDivNoRound( m_nFinalWidth, ElapsedTime(), m_dwDuration );
  346. SelectBitmap( MemoryDC, BitmapImage()->GetBitmap() );
  347. BitBlt( ClientDC, m_rcFinal.left, m_rcFinal.top, m_nCurrentWidth, m_rcFinal.bottom-m_rcFinal.top, MemoryDC, 0, 0, SRCCOPY );
  348. BitBlt( ClientDC, m_rcFinal.right-m_nCurrentWidth, m_rcFinal.top, m_nCurrentWidth, RECT_HEIGHT(m_rcFinal), MemoryDC, RECT_WIDTH(m_rcFinal)-m_nCurrentWidth, 0, SRCCOPY );
  349. }