#include "precomp.h" #include "painters.h" #include #include "ssutil.h" CImagePainter::CImagePainter(CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcScreen, bool bToolbarVisible ) : m_pBitmapImage(pBitmapImage), m_dwInitialTickCount(0), m_rcScreen(rcScreen), m_bFirstFrame(true), m_dwDuration(0), m_bAlreadyPaintedLastFrame(false), m_bNeedPainting(false), m_dwLastInput(NULL), m_bToolbarVisible(bToolbarVisible) { ComputeImageLayout(); } CImagePainter::~CImagePainter(void) { if (m_pBitmapImage) { delete m_pBitmapImage; m_pBitmapImage = NULL; } } // sets m_rcFinal void CImagePainter::ComputeImageLayout() { if (m_pBitmapImage) { // always center image m_rcFinal.top = (m_rcScreen.bottom/2)-((m_pBitmapImage->ImageSize().cy)/2); m_rcFinal.left = (m_rcScreen.right/2)-((m_pBitmapImage->ImageSize().cx)/2); m_rcFinal.bottom = 0; m_rcFinal.right = 0; } } void CImagePainter::SetToolbarVisible(bool bVisible) { m_bToolbarVisible = bVisible; } DWORD CImagePainter::ElapsedTime(void) const { DWORD dwElapsed = GetTickCount() - m_dwInitialTickCount; if (dwElapsed > m_dwDuration) { dwElapsed = m_dwDuration; } return(dwElapsed); } CBitmapImage* CImagePainter::BitmapImage(void) const { return(m_pBitmapImage); } void CImagePainter::Paint( CSimpleDC &PaintDC ) { if (PaintDC.IsValid() && m_pBitmapImage) { ScreenSaverUtil::SelectPalette( PaintDC, m_pBitmapImage->Palette(), FALSE ); CSimpleDC MemoryDC; if (MemoryDC.CreateCompatibleDC(PaintDC)) { ScreenSaverUtil::SelectPalette( MemoryDC, m_pBitmapImage->Palette(), FALSE ); Paint( PaintDC, MemoryDC ); } } } void CImagePainter::Paint(CSimpleDC &PaintDC, CSimpleDC &MemoryDC) { SelectBitmap( MemoryDC, BitmapImage()->GetBitmap() ); BitBlt(PaintDC, m_rcFinal.left, m_rcFinal.top, RECTWIDTH(m_rcFinal), RECTHEIGHT(m_rcFinal), MemoryDC, 0, 0, SRCCOPY); } void CImagePainter::OnInput() { m_dwLastInput = GetTickCount(); } bool CImagePainter::TimerTick( CSimpleDC &ClientDC ) { bool bStopPainting = false; if (m_bFirstFrame) { m_dwInitialTickCount = GetTickCount(); Erase( ClientDC, m_rcScreen ); } if (m_bFirstFrame || NeedPainting()) { if (m_pBitmapImage && ClientDC.IsValid()) { ScreenSaverUtil::SelectPalette( ClientDC, m_pBitmapImage->Palette(), FALSE ); CSimpleDC MemoryDC; if (MemoryDC.CreateCompatibleDC(ClientDC)) { ScreenSaverUtil::SelectPalette( MemoryDC, m_pBitmapImage->Palette(), FALSE ); PaintFrame( ClientDC, MemoryDC ); } } if (m_bFirstFrame) { m_bFirstFrame = false; } } else { bStopPainting = true; } m_bNeedPainting = false; return bStopPainting; } //PERF:: should double buffer this void CImagePainter::Erase( CSimpleDC &ClientDC, RECT &rc ) { FillRect( ClientDC, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH) ); m_bNeedPainting = true; } bool CImagePainter::NeedPainting(void) { return(m_bNeedPainting); } bool CImagePainter::IsValid(void) { return(m_pBitmapImage && m_pBitmapImage->GetBitmap()); } /**************************************************************************** CSimpleTransitionPainter *****************************************************************************/ CSimpleTransitionPainter::CSimpleTransitionPainter( CBitmapImage *pBitmapImage, CSimpleDC &ClientDC, const RECT &rcScreen, bool bToolbarVisible ) : CImagePainter( pBitmapImage, ClientDC, rcScreen, bToolbarVisible ) { } CSimpleTransitionPainter::~CSimpleTransitionPainter(void) { } void CSimpleTransitionPainter::PaintFrame(CSimpleDC &ClientDC, CSimpleDC &MemoryDC) { SelectBitmap(MemoryDC, BitmapImage()->GetBitmap()); SIZE sizeImage = BitmapImage()->ImageSize(); BitBlt(ClientDC, m_rcFinal.left, m_rcFinal.top, sizeImage.cx, sizeImage.cy, MemoryDC, 0, 0, SRCCOPY); }