2025-04-27 07:49:33 -04:00

619 lines
18 KiB
C

/******************************Module*Header*******************************\
* Module Name: ftbmtext.c
*
* Tests text to 1,4,8,24,32 BPP bitmaps
*
* Created: 12-Jun-1991 10:12:58
* Author: Patrick Haluptzok patrickh
*
* Copyright (c) 1990 Microsoft Corporation
\**************************************************************************/
#include "precomp.h"
#pragma hdrstop
VOID vBuginText(HDC hdcScreen);
VOID vTestBitmapText(HDC hdcScreen);
VOID vTestDIBPALCOLORS(HDC hdc);
/******************************Public*Routine******************************\
* Test AddFontModule
*
*
* History:
* 29-Mar-1993 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
VOID vTestAddFontResource(HWND hwnd, HDC hdc)
{
ULONG ul;
HFONT hfontP,hfontG,hfontOld;
ul = AddFontResource((LPSTR) "ft.exe");
if (ul != 2)
DbgPrint("GetModuleHandle failed\n");
hfontP = CreateFont(-24, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET,
OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
"patrickh");
if (hfontP == 0)
DbgPrint("AddFontResource failed CreateFont\n");
hfontG = CreateFont(-24, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET,
OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
"gilmanw");
if (hfontG == 0)
DbgPrint("AddFontResource failed CreateFontG\n");
hfontOld = SelectObject(hdc, hfontP);
TextOut(hdc, 500, 0, "AAAAAAPH", 8);
SelectObject(hdc, hfontOld);
hfontOld = SelectObject(hdc, hfontG);
TextOut(hdc, 500, 100, "AAAAAAGW", 8);
SelectObject(hdc, hfontOld);
DeleteObject(hfontP);
DeleteObject(hfontG);
RemoveFontResource((LPSTR) "ft.exe");
hfontP = CreateFont(-24, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET,
OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
"patrickh");
if (hfontP == 0)
DbgPrint("AddFontResource failed CreateFont\n");
hfontOld = SelectObject(hdc, hfontP);
TextOut(hdc, 500, 200, "AAAAAAPH", 8);
SelectObject(hdc, hfontOld);
DeleteObject(hfontP);
}
/******************************Public*Routine******************************\
* vTestAddFontModule
*
* History:
* 01-Apr-1993 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
#if 0
VOID vTestAddFontModule(HWND hwnd, HDC hdc)
{
DWORD ul;
HFONT hfontP,hfontOld;
HINSTANCE hMyInst;
if ((hMyInst = LoadLibrary("patrickh.fon")) == 0)
{
DbgPrint("Load Library failed\n");
return;
}
ul = AddFontModule(hMyInst);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
if (ul != 1)
DbgPrint("ul not 1\n");
hfontP = CreateFont(-24, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET,
OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
"patrickh");
hfontOld = SelectObject(hdc, hfontP);
TextOut(hdc, 600, 300, "AAAAAAPPP", 8);
SelectObject(hdc, hfontOld);
DeleteObject(hfontP);
RemoveFontModule((LPSTR) hMyInst);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
FreeLibrary(hMyInst);
}
#endif
/******************************Public*Routine******************************\
* vTestBMText
*
* Test text.
*
* History:
* Wed 11-Sep-1991 -by- Patrick Haluptzok [patrickh]
* Wrote it.
\**************************************************************************/
VOID vTestBMText(HWND hwnd, HDC hdcScreen, RECT* prcl)
{
ULONG ulTemp;
hwnd;
prcl;
vBuginText(hdcScreen);
vTestBitmapText(hdcScreen);
for (ulTemp = 0; ulTemp < 3; ulTemp++)
vTestAddFontResource(hwnd, hdcScreen);
#if 0
for (ulTemp = 0; ulTemp < 3; ulTemp++)
vTestAddFontModule(hwnd, hdcScreen);
#endif
vTestDIBPALCOLORS(hdcScreen);
}
/******************************Public*Routine******************************\
* vBuginText
*
* Test that text to 1X1 bitmap doesn't gp-fault
*
* History:
* 26-Jul-1991 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
VOID vBuginText(HDC hdcScreen)
{
HDC hdcMono;
hdcMono = CreateCompatibleDC(hdcScreen);
PatBlt(hdcMono, 0, 0, 1000, 1000, BLACKNESS);
BitBlt(hdcMono, 0, 0, 0, 0, hdcScreen, 0, 0, SRCCOPY);
BitBlt(hdcMono, 0, 0, 1, 1, hdcScreen, 1, 1, SRCCOPY);
BitBlt(hdcMono, 0, 0, 100, 100, hdcScreen, 10, 10, SRCCOPY);
BitBlt(hdcMono, 0, 0, 10000, 10000, hdcScreen, 10, 10, SRCCOPY);
ExtTextOut(hdcMono, 0, 0, 0, NULL, "Hello World", 11, NULL);
ExtTextOut(hdcMono, 0, 0, 0, NULL, "Hello WorldabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 37, NULL);
DeleteDC(hdcMono);
}
/******************************Public*Routine******************************\
* vTestBitmapText
*
* Test text out to a bitmap.
*
* History:
* 11-Jul-1991 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
VOID vTestBitmapText(HDC hdcScreen)
{
HBITMAP hbm1,hbm4,hbm8,hbm16,hbm24,hbm32,hbmDefault;
HDC hdc1,hdc4,hdc8,hdc16,hdc24,hdc32;
ULONG ScreenWidth, ScreenHeight;
HFONT hfItalic, hf1,hf4,hf8,hf16,hf24,hf32;
LOGFONT lfItalic;
lfItalic.lfHeight = 16;
lfItalic.lfWidth = 8;
lfItalic.lfEscapement = 0;
lfItalic.lfOrientation = 0;
lfItalic.lfWeight = 700;
lfItalic.lfItalic = 1;
lfItalic.lfUnderline = 0;
lfItalic.lfStrikeOut = 0;
lfItalic.lfCharSet = ANSI_CHARSET;
lfItalic.lfOutPrecision = OUT_DEFAULT_PRECIS;
lfItalic.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lfItalic.lfQuality = DEFAULT_QUALITY;
lfItalic.lfPitchAndFamily = (FIXED_PITCH | FF_DONTCARE);
strcpy(lfItalic.lfFaceName, "System");
hfItalic = CreateFontIndirect(&lfItalic);
if (hfItalic == (HFONT)0)
{
DbgPrint("CreateFontIndirect failed\n");
}
ScreenWidth = GetDeviceCaps(hdcScreen, HORZRES);
ScreenHeight = GetDeviceCaps(hdcScreen, VERTRES);
hdc1 = CreateCompatibleDC(hdcScreen);
hdc4 = CreateCompatibleDC(hdcScreen);
hdc8 = CreateCompatibleDC(hdcScreen);
hdc16 = CreateCompatibleDC(hdcScreen);
hdc24 = CreateCompatibleDC(hdcScreen);
hdc32 = CreateCompatibleDC(hdcScreen);
if ((hdc1 == (HDC) 0) || (hdc4 == (HDC) 0) || (hdc32 == (HDC) 0))
DbgPrint("ERROR hdc creation %lu %lu %lu \n", hdc8, hdc4, hdc1);
// Clear the screen
BitBlt(hdcScreen, 0, 0, ScreenWidth, ScreenHeight,
(HDC) 0, 0, 0, WHITENESS);
// Ok let's throw in some CreateCompatible calls.
hbm1 = hbmCreateDIBitmap(hdcScreen, 500, 100, 1);
hbm4 = hbmCreateDIBitmap(hdcScreen, 500, 100, 4);
hbm8 = hbmCreateDIBitmap(hdcScreen, 500, 100, 8);
hbm16 = hbmCreateDIBitmap(hdcScreen, 500, 100, 16);
hbm24 = hbmCreateDIBitmap(hdcScreen, 500, 100, 24);
hbm32 = hbmCreateDIBitmap(hdcScreen, 500, 100, 32);
hf1 = SelectObject(hdc1, hfItalic);
hf4 = SelectObject(hdc4, hfItalic);
hf8 = SelectObject(hdc8, hfItalic);
hf16 = SelectObject(hdc16, hfItalic);
hf24 = SelectObject(hdc24, hfItalic);
hf32 = SelectObject(hdc32, hfItalic);
hbmDefault = SelectObject(hdc1,hbm1);
if (hbmDefault == (HBITMAP) 0)
DbgPrint("hbmDefault hd1 select bad\n");
if (hbmDefault != SelectObject(hdc4,hbm4))
DbgPrint("hbmDefault hd4 select bad\n");
if (hbmDefault != SelectObject(hdc8,hbm8))
DbgPrint("hbmDefault hd8 select bad\n");
SelectObject(hdc16,hbm16);
SelectObject(hdc24,hbm24);
SelectObject(hdc32,hbm32);
PatBlt(hdc1, 0, 0, 500, 100, WHITENESS);
PatBlt(hdc4, 0, 0, 500, 100, WHITENESS);
PatBlt(hdc8, 0, 0, 500, 100, WHITENESS);
PatBlt(hdc16, 0, 0, 500, 100, WHITENESS);
PatBlt(hdc24, 0, 0, 500, 100, WHITENESS);
PatBlt(hdc32, 0, 0, 500, 100, WHITENESS);
TextOut(hdc1, 5, 5, "abcdefghijklmnopqrstuvwxyz1234567890", 36);
TextOut(hdc1, 5, 30, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()", 36);
if(!BitBlt(hdcScreen, 0, 0, 500, 100, hdc1, 0, 0, SRCCOPY))
DbgPrint("ERROR: BitBlt returned FALSE\n");
TextOut(hdc4, 5, 5, "abcdefghijklmnopqrstuvwxyz1234567890", 36);
TextOut(hdc4, 5, 30, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()", 36);
if(!BitBlt(hdcScreen, 0, 80, 500, 100, hdc4, 0, 0, SRCCOPY))
DbgPrint("ERROR: BitBlt returned FALSE\n");
TextOut(hdc8, 5, 5, "abcdefghijklmnopqrstuvwxyz1234567890", 36);
TextOut(hdc8, 5, 30, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()", 36);
if(!BitBlt(hdcScreen, 0, 160, 500, 100, hdc8, 0, 0, SRCCOPY))
DbgPrint("ERROR: BitBlt returned FALSE\n");
TextOut(hdc16, 5, 5, "abcdefghijklmnopqrstuvwxyz1234567890", 36);
TextOut(hdc16, 5, 30, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()", 36);
if(!BitBlt(hdcScreen, 0, 240, 500, 100, hdc16, 0, 0, SRCCOPY))
DbgPrint("ERROR: BitBlt returned FALSE\n");
TextOut(hdc24, 5, 5, "abcdefghijklmnopqrstuvwxyz1234567890", 36);
TextOut(hdc24, 5, 30, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()", 36);
if(!BitBlt(hdcScreen, 0, 320, 500, 100, hdc24, 0, 0, SRCCOPY))
DbgPrint("ERROR: BitBlt returned FALSE\n");
TextOut(hdc32, 5, 5, "abcdefghijklmnopqrstuvwxyz1234567890", 36);
TextOut(hdc32, 5, 30, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()", 36);
if(!BitBlt(hdcScreen, 0, 400, 500, 100, hdc32, 0, 0, SRCCOPY))
DbgPrint("ERROR: BitBlt returned FALSE\n");
SelectObject(hdc1,hf1);
SelectObject(hdc4,hf4);
SelectObject(hdc8,hf8);
SelectObject(hdc16,hf16);
SelectObject(hdc24,hf24);
SelectObject(hdc32,hf32);
if (!DeleteObject(hfItalic))
DbgPrint("Failed to delete hfItalic \n");
// Delete DC's
if (!DeleteDC(hdc1))
DbgPrint("Failed to delete hdc 11\n");
if (!DeleteDC(hdc4))
DbgPrint("Failed to delete hdc 15\n");
if (!DeleteDC(hdc8))
DbgPrint("Failed to delete hdc 16\n");
if (!DeleteDC(hdc16))
DbgPrint("Failed to delete hdc 166\n");
if (!DeleteDC(hdc24))
DbgPrint("Failed to delete hdc 18\n");
if (!DeleteDC(hdc32))
DbgPrint("Failed to delete hdc 19\n");
// Delete Bitmaps
if (!DeleteObject(hbm1))
DbgPrint("ERROR failed to delete 11\n");
if (!DeleteObject(hbm4))
DbgPrint("ERROR failed to delete 13\n");
if (!DeleteObject(hbm8))
DbgPrint("ERROR failed to delete 14\n");
if (!DeleteObject(hbm16))
DbgPrint("ERROR failed to delete 14\n");
if (!DeleteObject(hbm24))
DbgPrint("ERROR failed to delete 14\n");
if (!DeleteObject(hbm32))
DbgPrint("ERROR failed to delete 14\n");
if (!DeleteObject(hbmDefault))
DbgPrint("ERROR deleted default bitmap\n");
}
typedef struct _BITMAPINFO1
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[2];
} BITMAPINFO1;
typedef struct _BITMAPINFO4
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[16];
} BITMAPINFO4;
typedef struct _BITMAPINFO8
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
} BITMAPINFO8;
typedef struct _BITMAPINFO16
{
BITMAPINFOHEADER bmiHeader;
ULONG bmiColors[3];
} BITMAPINFO16;
typedef struct _BITMAPINFO32
{
BITMAPINFOHEADER bmiHeader;
ULONG bmiColors[3];
} BITMAPINFO32;
/******************************Public*Routine******************************\
* hbmCreateDIBitmap
*
* Returns x X y bitmap of iBitsPixel depth.
*
* History:
* 29-Mar-1993 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
HBITMAP hbmCreateDIBitmap(HDC hdc, ULONG x, ULONG y, ULONG nBitsPixel)
{
HBITMAP hbmReturn;
ULONG ulTemp;
BITMAPINFO *pbmi;
// These are the n-bpp sources.
BITMAPINFO1 bmi1 = {{40,32,32,1,1,BI_RGB,0,0,0,0,0}, {{0,0,0,0}, {0xff,0xff,0xff,0}}};
BITMAPINFO4 bmi4 =
{
{
sizeof(BITMAPINFOHEADER),
64,
64,
1,
4,
BI_RGB,
0,
0,
0,
0,
0
},
{ // B G R
{ 0, 0, 0, 0 }, // 0
{ 0, 0, 0x80,0 }, // 1
{ 0, 0x80,0, 0 }, // 2
{ 0, 0x80,0x80,0 }, // 3
{ 0x80,0, 0, 0 }, // 4
{ 0x80,0, 0x80,0 }, // 5
{ 0x80,0x80,0, 0 }, // 6
{ 0x80,0x80,0x80,0 }, // 7
{ 0xC0,0xC0,0xC0,0 }, // 8
{ 0, 0, 0xFF,0 }, // 9
{ 0, 0xFF,0, 0 }, // 10
{ 0, 0xFF,0xFF,0 }, // 11
{ 0xFF,0, 0, 0 }, // 12
{ 0xFF,0, 0xFF,0 }, // 13
{ 0xFF,0xFF,0, 0 }, // 14
{ 0xFF,0xFF,0xFF,0 } // 15
}
};
BITMAPINFO8 bmi8;
BITMAPINFO16 bmi16 = {{40,32,32,1,16,BI_BITFIELDS,0,0,0,0,0},
{0x00007C00, 0x000003E0, 0x0000001F}};
BITMAPINFOHEADER bmi24 = {40,32,32,1,24,BI_RGB,0,0,0,0,0};
BITMAPINFO32 bmi32 = {{40,32,32,1,32,BI_BITFIELDS,0,0,0,0,0},
{0x00FF0000, 0x0000FF00, 0x000000FF}};
// Initialize the 8BPP DIB.
bmi8.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi8.bmiHeader.biWidth = 32;
bmi8.bmiHeader.biHeight = 32;
bmi8.bmiHeader.biPlanes = 1;
bmi8.bmiHeader.biBitCount = 8;
bmi8.bmiHeader.biCompression = BI_RGB;
bmi8.bmiHeader.biSizeImage = 0;
bmi8.bmiHeader.biXPelsPerMeter = 0;
bmi8.bmiHeader.biYPelsPerMeter = 0;
bmi8.bmiHeader.biClrUsed = 0;
bmi8.bmiHeader.biClrImportant = 0;
// Generate 256 (= 8*8*4) RGB combinations to fill
// in the palette.
{
BYTE red, green, blue, unUsed;
unUsed = red = green = blue = 0;
for (ulTemp = 0; ulTemp < 256; ulTemp++)
{
bmi8.bmiColors[ulTemp].rgbRed = red;
bmi8.bmiColors[ulTemp].rgbGreen = green;
bmi8.bmiColors[ulTemp].rgbBlue = blue;
bmi8.bmiColors[ulTemp].rgbReserved = 0;
if (!(red += 32))
if (!(green += 32))
blue += 64;
}
for (ulTemp = 248; ulTemp < 256; ulTemp++)
{
bmi8.bmiColors[ulTemp].rgbRed = bmi4.bmiColors[ulTemp - 240].rgbRed;
bmi8.bmiColors[ulTemp].rgbGreen = bmi4.bmiColors[ulTemp - 240].rgbGreen;
bmi8.bmiColors[ulTemp].rgbBlue = bmi4.bmiColors[ulTemp - 240].rgbBlue;
bmi8.bmiColors[ulTemp].rgbReserved = 0;
if (!(red += 32))
if (!(green += 32))
blue += 64;
}
}
// Start Drawing
switch (nBitsPixel)
{
case 1:
pbmi = (BITMAPINFO *) &bmi1;
break;
case 4:
pbmi = (BITMAPINFO *) &bmi4;
break;
case 8:
pbmi = (BITMAPINFO *) &bmi8;
break;
case 16:
pbmi = (BITMAPINFO *) &bmi16;
break;
case 24:
pbmi = (BITMAPINFO *) &bmi24;
break;
case 32:
pbmi = (BITMAPINFO *) &bmi32;
break;
default:
DbgPrint("Not a valid format passed to hbmCreateDIB\n");
return(0);
}
pbmi->bmiHeader.biWidth = x;
pbmi->bmiHeader.biHeight = y;
return(CreateDIBitmap(hdc, NULL, CBM_CREATEDIB, NULL, pbmi, DIB_RGB_COLORS));
}
typedef struct _LOGPALETTE256
{
USHORT palVersion;
USHORT palNumEntries;
PALETTEENTRY palPalEntry[256];
} LOGPALETTE256;
/******************************Public*Routine******************************\
* vTestDIBPALCOLORS
*
* Test a couple blts with DIB_PAL_COLORS.
*
* History:
* 15-Apr-1993 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
VOID vTestDIBPALCOLORS(HDC hdc)
{
BITMAPINFO8 bmi8;
LOGPALETTE256 logpal;
BYTE ajBytes[256];
PUSHORT pusIndices;
HPALETTE hpal,hpalOld;
HBITMAP hbm;
ULONG ulTemp;
// Initialize the 8BPP DIB.
bmi8.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi8.bmiHeader.biWidth = 16;
bmi8.bmiHeader.biHeight = 16;
bmi8.bmiHeader.biPlanes = 1;
bmi8.bmiHeader.biBitCount = 8;
bmi8.bmiHeader.biCompression = BI_RGB;
bmi8.bmiHeader.biSizeImage = 0;
bmi8.bmiHeader.biXPelsPerMeter = 0;
bmi8.bmiHeader.biYPelsPerMeter = 0;
bmi8.bmiHeader.biClrUsed = 0;
bmi8.bmiHeader.biClrImportant = 0;
pusIndices = (PUSHORT) (&(bmi8.bmiColors));
logpal.palVersion = 0x300;
logpal.palNumEntries = 256;
for (ulTemp = 0; ulTemp < 256; ulTemp++)
{
logpal.palPalEntry[ulTemp].peRed = (BYTE) ulTemp;
logpal.palPalEntry[ulTemp].peGreen = (BYTE) 0;
logpal.palPalEntry[ulTemp].peBlue = (BYTE) 0;
logpal.palPalEntry[ulTemp].peFlags = (BYTE) 0;
pusIndices[ulTemp] = (USHORT) ulTemp;
ajBytes[ulTemp] = (BYTE) ulTemp;
}
hpal = CreatePalette((LOGPALETTE *) &logpal);
hbm = CreateCompatibleBitmap(hdc, 16, 16);
if ((hpal == 0) || (hbm == 0))
{
DbgPrint("hpal or hbm is 0 vTestDIB\n");
return;
}
hpalOld = SelectPalette(hdc, hpal, 0);
RealizePalette(hdc);
if (16 != StretchDIBits(hdc, 0, 0, 32, 32, 0, 0, 16, 16, ajBytes, (BITMAPINFO *) &bmi8, DIB_PAL_COLORS, 0x00660000))
{
DbgPrint("StretchDIBits failed in DIBPALCOLOR\n");
}
if (16 != SetDIBits(hdc, hbm, 0, 16, ajBytes, (BITMAPINFO *) &bmi8, DIB_PAL_COLORS))
{
DbgPrint("SetDIBits failed in DIBPALCOLOR\n");
}
SelectPalette(hdc, hpalOld, 0);
DeleteObject(hpal);
DeleteObject(hbm);
}