Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
biHeight > 0) // od dołu do góry
(
for (y = 0 ; y < cy ; y++)
pdib->ppRow[y] = pBits + (cy - y - 1) * iRowLength ;
else // od góry do dolu
(
for (y = 0 ; y < cy ; y++)
pdib->ppRow[y] = pBits + y * iRowLength ;
1
return pdib ;
)
/*
DibOelete: Zwalnia pamięć dla sekcji DIB
*/
BOOL DibDelete (HDIB hdib)
(
DIBSTRUCT * pdib = hdib ;
if (!DibIsValid (hdib))
return FALSE ;
free (pdib->ppRow) ;
Delete0bject (pdib->hBitmap) ;
free (pdib) ;
return TRUE ;
)
/*
DibCreate: Tworzy HDIB na podstawie argumentów podanych wprost
*/
HDIB DibCreate (int cx, int cy, int cBits, int cColors)
(
BITMAPINFO * pbmi ;
DWORD dwInfoSize ;
HDIB hDib ;
int cEntries ;
if (cx <= 0 ţţ cy <= 0 ţţ
((cBits != i) && (cBits != 4) && (cBits != 8) &&
(cBits != 16) && (cBits != 24) && (cBits != 32)))
(
Rozdział 16: Palette Manager 835
return NULL ;
if (cColors != 0)
cEntries = cColors :
else if (cBits <= S)
cEntries = 1 ® cBits ;
dwInfoSize = sizeof (BITMAPINFOHEADER) + (cEntries - 1) * sizeof (RGBQUAD); `
if (NULL = (pbmi = malloc (dwInfoSize)))
return NULL ;
ZeroMemory (pbmi, dwInfoSize) :
I,: .
pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER) :
pbmi->bmiHeader.biWidth = cx ;
pbmi->bmiHeader.biHeight = cy :
pbmi->bmiHeader.biPlanes = 1 ;
pbmi->bmiHeader.biBitCount = cBits :
pbmi->bmiHeader.biCompression = BIţRGB ;
pbmi->bmiHeader.biSizeImage = 0 ;
pbmi->bmiHeader.biXPelsPerMeter = 0 :
pbmi->bmiHeader.biYPelsPerMeter = 0 :
pbmi->bmiHeader.biClrUsed = cColors ;
pbmi->bmiHeader.biClrImportant = 0 ;
h0ib = DibCreateFromInfo (pbmi) :
free (pbmi) ;
return hDib :
/* ţ.
DibCopyToInfo: Buduje strukturę BITMAPINFO.
Używana przez funkcje DibOopy i DibCopyToDdb '=
*/
static BITMAPINFO * DibCopyToInfo (HDIB hdib)
i
BITMAPINFO * pbmi :
int i, iNumColors ;
. RGBOUAD * prgb :
if (!DibIsllalid (hdib))
return NULL ;
// Zarezerwuj pamięć
if (NULL == (pbmi = malloc (DibInfoSize (hdib))))
return NULL ;
// Skopiuj nagłówek informacyjny
CopyMemory (pbmi, DibInfoHeaderPtr (hdib),
sizeof (BITMAPINFOHEADER));
t
Część II: Grafika
(ciąg dalszy ze strony 835)
// Skopiuj maski koloru
prgb = (RGBOUAD *) ((BYTE *) pbmi + sizeof (BITMAPINFOHEADER)) ;
if (DibMaskSize (hdib))
(
CopyMemory (prgb, DibMaskPtr (hdib), 3 * sizeof (DWORD)) ;
prgb = (RGBOUAD *) ((BYTE *) prgb + 3 * sizeof (DWORD)) ;
)
// Skopiuj tablicę kolorów
iNumColors = DibNumColors (hdib) ;
for (i = 0 ; i < iNumColors ; i++)
DibGetColor (hdib. i, prgb + i) ;
return pbmi ;
)
/*
DibCopy: Tworzy nową sekcję DIB na podstawie istniejącej,
zamieniając miejscami dlugość i szerokość.
*/
HDIB DibCopy (HDIB hdibSrc, BOOL fRotate)
t
BITMAPINFO * pbmi ;
BYTE * pBitsSrc, * pBitsDst ;
HDIB hdibDst ;
if (!DibIsValid (hdibSrc))
return NULL ;
if (NULL = (pbmi = DibCopyToInfo (hdibSrc)))
return NULL ;
if (fRotate)
f
pbmi->bmiHeader.biWidth = DibHeight (hdibSrc) ;
pbmi->bmiHeader.biHeight = DibWidth (hdibSrc) ;
)
hdibDst = DibCreateFromInfo (pbmi) ;
free (pbmi)
if (hdibOst = NULL)
return NULL ;
// Skopiuj bity
if (!fRotate)
f
pBitsSrc = DibBitsPtr (hdibSrc) ;
pBitsDst = DibBitsPtr (hdibDst) ;
Rozdział 16: Palette Manager
CopyMemory (pBitsDst, pBitsSrc, DibBitsSize (hdibSrc)) ;
)
return hdibDst ;
)
/*
GibCopyToPackedDib jest stosowana do zapi'sywania DIB i przesyłania
ich do Schowka. W drugim przypadku. drugi argument powinien przyjmować wartość
TRUE tak, aby można było zarezerwować pamięć za pomocd znacznika GMEM SHARE.
*/
BITMAPINFO * DibCopyToPackedDib (HDIB hdib, BOOL fUseGlobal)
(
BITMAPINFO * pPackedDib ;
BYTE * pBits ;
DWORD dwDibSize ;
HDC hdcMem ;
HGLOBAL hGlobal ;
int iNumColors ;
PDIBSTRUCT pdib = hdib ;
RGBOUAD * prgb ;
if (!DibIsValid (hdib))
return NULL ;
// Zarezerwuj pamięć na upakowand DIB
dwDibSize = DibTotalSize (hdib) ;
if (fUseGlobal)
(
hGlobal = GlobalAlloc (GHND ţ GMEM SHARE, dwDibSize) ;
pPackedDib = GlobalLock (hGlobal) ;
1
else
(
pPackedDib = malloc (dwDibSize) ;
if (pPackedDib = NULL)
return NULL ;
// Skopiuj nagłówek informacyjny
CopyMemory (pPackedDib, &pdib->ds.dsBmih, sizeof (BITMAPINFOHEADER)) ;
prgb = (RGBOUAD *) ((BYTE *) pPackedDib + sizeof (BITMAPINFOHEADER)) ;
// Skopiuj maski koloru
if (pdib->ds.dsBmih.biCompression --- BI BITFIELDS)
(
CopyMemory (prgb, pdib->ds.dsBitfields, 3 * sizeof (DWORD)) ;
prgb = (RGBOUAD *) ((BYTE *) prgb + 3 * sizeof (DWORD)) ;
)
// Skopiuj tablicę kolorów
838 Część II: Grafika
(ciąg dalszy ze strony 837)
if (iNumColors = DibNumColors (hdib))
(
hdcMem = CreateCompatibleDC (NULL) ;
SelectObject (hdcMem, pdib->hBitmap) ;
GetDIBCoIorTable (hdcMem, 0, iNumColors, prgb) ;
DeleteDC (hdcMem) ;
)
pBits = (BYTE *) (prgb + iNumColors) ;
// Skopiuj bity
CopyMemory (pBits, pdib->pBits, DibBitsSize (pdib)) ;
// Jeżeli ostatni argument ma wartość TRUE, odblokuj globalny
// obszar pamięci i przypisz go wskaźnikowi przed wykonaniem
// polecenia return
if (fUseGlobal)
(
GlobalUnlock (hGlobal) ;
pPackedDib = (BITMAPINFO *) hGlobal ;
)
return pPackedDib ;
1
/*
DibCopyFromPackedDib jest stosowana do wklejania DIB pochodzdcej ze Schowka.
*/
HDIB DibCopyFromPackedDib (BITMAPINFO * pPacked0ib)
(
BYTE * pBits ;
DWORD dwInfoSize, dwMaskSize, dwColorSize ;
int iBitCount ;
PDIBSTRUCT pdib ;
// Pobierz rozmiar nagłówka informacyjnego i przeprowadź weryfikację
dwInfoSize = pPackedDib->bmiHeader.biSize ;
if (dwInfoSize != sizeof (BITMAPCOREHEADER) &&
dwInfoSize != sizeof (BITMAPINFOHEADER) &&
dwInfoSize != sizeof (BITMAPV4HEADER) &&
dwInfoSize != sizeof (BITMAPV5HEADER))
(
return NULL ;
)
// Pobierz rozmiary masek koloru
if (dwInfoSize == sizeof (BITMAPINFOHEADER) &&
pPackedDib->bmiHeader.biCompression == BI BITFIELDS)
dwMaskSize = 3 * sizeof (DWORD) ;
)
else
Rozdział 16: Palette Manager 839 '
i
dwMaskSize = 0 ;
// Pobierz rozmiar tablicy kolorów
if (dwInfoSize --- sizeof (BITMAPCOREHEADER))
;,i
iBitCount = ((BITMAPCOREHEADER *) pPackedDib)->bcBitCount ;
if (iBitCount <= 8)
(
dwColorSize = (1 ® iBitCount) * sizeof (RGBTRIPLE) ;
)
else
dwColorSize = 0 ;
1
else // DIB niezgodne z formatem OS/2
{
if (pPackedDib->bmiHeader.biClrUsed > 0)
(
dwColorSize = pPackedDib->bmiHeader.biClrUsed * sizeof (RGBOUAD);
1
else if (pPackedDib->bmiHeader.biBitCount <= 8)
i
dwColorSize = (1 ® pPackedDib->bmiHeader.biBitCount) *
sizeof (RGBQUAD) ;
else
(
dwColorSize = 0 ;
l
J
// Pobierz wskaźnik do bitów upakowanej DIB
pBits = (BYTE *) pPackedDib + dwInfoSize + dwMaskSize + dwColorSize ;
// Utwórz HDIB na podstawie upakowanej DIB
pdib = DibCreateFromInfo (pPackedDib) ;
// Skopiuj bity piksela