comctl32: Switch to a Nx4 tiling.
This commit is contained in:
parent
6772873396
commit
dfb41b35c4
|
@ -84,28 +84,59 @@ static inline BOOL is_valid(HIMAGELIST himl)
|
||||||
return himl && himl->magic == IMAGELIST_MAGIC;
|
return himl && himl->magic == IMAGELIST_MAGIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An imagelist with N images is tiled like this:
|
||||||
|
*
|
||||||
|
* N/4 ->
|
||||||
|
*
|
||||||
|
* 4 048C..
|
||||||
|
* 159D..
|
||||||
|
* | 26AE.N
|
||||||
|
* V 37BF.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define TILE_COUNT 4
|
||||||
|
|
||||||
|
static inline UINT imagelist_width( UINT count )
|
||||||
|
{
|
||||||
|
return ((count + TILE_COUNT - 1)/TILE_COUNT);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void imagelist_point_from_index( HIMAGELIST himl, UINT index, LPPOINT pt )
|
static inline void imagelist_point_from_index( HIMAGELIST himl, UINT index, LPPOINT pt )
|
||||||
{
|
{
|
||||||
pt->x = index * himl->cx;
|
pt->x = (index/TILE_COUNT) * himl->cx;
|
||||||
pt->y = 0;
|
pt->y = (index%TILE_COUNT) * himl->cy;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void imagelist_get_bitmap_size( HIMAGELIST himl, UINT count, UINT cy, SIZE *sz )
|
static inline void imagelist_get_bitmap_size( HIMAGELIST himl, UINT count, UINT cy, SIZE *sz )
|
||||||
{
|
{
|
||||||
sz->cx = count * himl->cx;
|
sz->cx = imagelist_width( count ) * himl->cx;
|
||||||
sz->cy = cy;
|
sz->cy = cy*TILE_COUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* imagelist_copy_images()
|
||||||
|
*
|
||||||
|
* Copies a block of count images from offset src in the list to offset dest.
|
||||||
|
* Images are copied a row at at time. Assumes hdcSrc and hdcDest are different.
|
||||||
|
*/
|
||||||
static inline void imagelist_copy_images( HIMAGELIST himl, HDC hdcSrc, HDC hdcDest,
|
static inline void imagelist_copy_images( HIMAGELIST himl, HDC hdcSrc, HDC hdcDest,
|
||||||
UINT src, UINT count, UINT dest )
|
UINT src, UINT count, UINT dest )
|
||||||
{
|
{
|
||||||
POINT ptSrc, ptDest;
|
POINT ptSrc, ptDest;
|
||||||
SIZE sz;
|
SIZE sz;
|
||||||
|
UINT i;
|
||||||
|
|
||||||
imagelist_point_from_index( himl, src, &ptSrc );
|
for ( i=0; i<TILE_COUNT; i++ )
|
||||||
imagelist_point_from_index( himl, dest, &ptDest );
|
{
|
||||||
imagelist_get_bitmap_size( himl, count, himl->cy, &sz );
|
imagelist_point_from_index( himl, src+i, &ptSrc );
|
||||||
BitBlt (hdcDest, ptSrc.x, ptSrc.y, sz.cx, sz.cy, hdcSrc, ptDest.x, ptDest.y, SRCCOPY);
|
imagelist_point_from_index( himl, dest+i, &ptDest );
|
||||||
|
sz.cx = himl->cx * imagelist_width( count - i );
|
||||||
|
sz.cy = himl->cy;
|
||||||
|
|
||||||
|
BitBlt( hdcDest, ptDest.x, ptDest.y, sz.cx, sz.cy,
|
||||||
|
hdcSrc, ptSrc.x, ptSrc.y, SRCCOPY );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue