Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

185 lines
4.5 KiB

#include "precomp.h"
#include "painters.h"
#include <windowsx.h>
#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);
}