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

7447 lines
189 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name
test.c
Abstract:
Small, independent windows test programs
Author:
Mark Enstrom (marke) 29-Apr-1996
Enviornment:
User Mode
Revision History:
--*/
#include "precomp.h"
#include <stdlib.h>
#include "disp.h"
#include "resource.h"
extern ULONG gAlphaSleep;
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTri(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE Tri[10];
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
HDC hdcmA = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
HBITMAP hdib;
HBITMAP hdibA;
PBYTE pDib;
PBYTE pDibA;
BLENDFUNCTION BlendFunction;
LONG xpos = 10;
LONG ypos = 10;
LONG xposDib = 0;
LONG yposDib = 0;
//
// tile screen
//
{
RECT rect;
HBITMAP hbmCars = LoadBitmap(hInstMain,MAKEINTRESOURCE(CAR_BITMAP));
LOGBRUSH lgBrush;
HBRUSH hbrFill;
lgBrush.lbStyle = BS_PATTERN;
lgBrush.lbColor = 0;
lgBrush.lbHatch = (LONG)hbmCars;
hbrFill = CreateBrushIndirect(&lgBrush);
GetClientRect(pCallData->hwnd,&rect);
FillTransformedRect(hdc,&rect,hbrFill);
DeleteObject(hbrFill);
DeleteObject(hbmCars);
}
//
// init drawing modes
//
SetStretchBltMode(hdc,COLORONCOLOR);
BlendFunction.BlendOp = AC_SRC_OVER;
BlendFunction.BlendFlags = 0;
BlendFunction.SourceConstantAlpha = 255;
BlendFunction.AlphaFormat = AC_SRC_ALPHA;
SetGraphicsMode(hdc,GM_ADVANCED);
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
//
// select and realize palette
//
hpal = CreateHtPalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 3 * sizeof(RGBQUAD));
PBITMAPINFOHEADER pbmih = &pbmi->bmiHeader;
pbmih->biSize = sizeof(BITMAPINFOHEADER);
pbmih->biWidth = rect.right;
pbmih->biHeight = 200;
pbmih->biPlanes = 1;
pbmih->biBitCount = 32;
pbmih->biCompression = BI_RGB;
pbmih->biSizeImage = 0;
pbmih->biXPelsPerMeter = 0;
pbmih->biYPelsPerMeter = 0;
pbmih->biClrUsed = 0;
pbmih->biClrImportant = 0;
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
hdibA = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDibA,NULL,0);
if ((hdib == NULL) && (hdibA != NULL))
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
if (SelectObject(hdcmA,hdibA) == NULL)
{
MessageBox(NULL,"error selecting Alpha DIB","Error",MB_OK);
}
}
vert[0].x = xpos;
vert[0].y = ypos;
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = xpos + 100;
vert[1].y = ypos;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x7000;
vert[1].Alpha = 0x0000;
vert[2].x = xpos + 100;
vert[2].y = ypos + 100;
vert[2].Red = 0x0000;
vert[2].Green = 0x7000;
vert[2].Blue = 0x7000;
vert[2].Alpha = 0x0000;
vert[3].x = xpos;
vert[3].y = ypos;
vert[3].Red = 0xff00;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
vert[4].x = xpos+100;
vert[4].y = ypos+100;
vert[4].Red = 0x0000;
vert[4].Green = 0x7000;
vert[4].Blue = 0x7000;
vert[4].Alpha = 0x0000;
vert[5].x = xpos;
vert[5].y = ypos+100;
vert[5].Red = 0x0000;
vert[5].Green = 0x0000;
vert[5].Blue = 0x7000;
vert[5].Alpha = 0x0000;
Tri[0].Vertex1 = 0;
Tri[0].Vertex2 = 1;
Tri[0].Vertex3 = 2;
Tri[1].Vertex1 = 3;
Tri[1].Vertex2 = 4;
Tri[1].Vertex3 = 5;
xpos += 400;
GradientFill(hdc,vert,6,(PVOID)Tri,2,GRADIENT_FILL_TRIANGLE);
xposDib = 0;
yposDib = 0;
vert[0].x = xposDib; vert[0].y = yposDib;
vert[1].x = xposDib+100; vert[1].y = yposDib;
vert[2].x = xposDib+100; vert[2].y = yposDib+100;
vert[3].x = xposDib; vert[3].y = yposDib;
vert[4].x = xposDib+100; vert[4].y = yposDib+100;
vert[5].x = xposDib; vert[5].y = yposDib+100;
GradientFill(hdcm,vert,6,(PVOID)Tri,2,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,xpos,ypos,100,100,hdcm,0,0,100,100,SRCCOPY);
//
// add alpha
//
vert[0].Alpha = 0xff00;
vert[1].Alpha = 0x7000;
vert[2].Alpha = 0x7000;
vert[3].Alpha = 0xff00;
vert[4].Alpha = 0x7000;
vert[5].Alpha = 0x7000;
xpos += 110;
GradientFill(hdcmA,vert,6,(PVOID)Tri,2,GRADIENT_FILL_TRIANGLE);
AlphaBlend(hdc,xpos,ypos,100,100,hdcmA,0,0,100,100,BlendFunction);
xpos = 10+50;
ypos += (110 + 50);
vert[0].x = xpos; //50,200
vert[0].y = ypos;
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0xff00;
vert[1].x = xpos;
vert[1].y = ypos-50;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0xff00;
vert[2].x = xpos+50;
vert[2].y = ypos-25;
vert[2].Red = 0xff00;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0xff00;
vert[3].x = xpos+50;
vert[3].y = ypos+25;
vert[3].Red = 0xff00;
vert[3].Green = 0x0000;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0xff00;
vert[4].x = xpos;
vert[4].y = ypos+50;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0xff00;
vert[4].Alpha = 0xff00;
vert[5].x = xpos-50;
vert[5].y = ypos+25;
vert[5].Red = 0x0000;
vert[5].Green = 0xff00;
vert[5].Blue = 0xff00;
vert[5].Alpha = 0xff00;
vert[6].x = xpos-50;
vert[6].y = ypos-25;
vert[6].Red = 0x0000;
vert[6].Green = 0xff00;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0xff00;
Tri[0].Vertex1 = 0;
Tri[0].Vertex2 = 1;
Tri[0].Vertex3 = 2;
Tri[1].Vertex1 = 0;
Tri[1].Vertex2 = 2;
Tri[1].Vertex3 = 3;
Tri[2].Vertex1 = 0;
Tri[2].Vertex2 = 3;
Tri[2].Vertex3 = 4;
Tri[3].Vertex1 = 0;
Tri[3].Vertex2 = 4;
Tri[3].Vertex3 = 5;
Tri[4].Vertex1 = 0;
Tri[4].Vertex2 = 5;
Tri[4].Vertex3 = 6;
Tri[5].Vertex1 = 0;
Tri[5].Vertex2 = 6;
Tri[5].Vertex3 = 1;
GradientFill(hdc,vert,7,(PVOID)Tri,6,GRADIENT_FILL_TRIANGLE);
vert[0].x += 110;
vert[1].x += 110;
vert[2].x += 110;
vert[3].x += 110;
vert[4].x += 110;
vert[5].x += 110;
vert[6].x += 110;
Tri[0].Vertex1 = 1;
Tri[0].Vertex2 = 2;
Tri[0].Vertex3 = 0;
Tri[1].Vertex1 = 2;
Tri[1].Vertex2 = 3;
Tri[1].Vertex3 = 0;
Tri[2].Vertex1 = 3;
Tri[2].Vertex2 = 4;
Tri[2].Vertex3 = 0;
Tri[3].Vertex1 = 4;
Tri[3].Vertex2 = 5;
Tri[3].Vertex3 = 0;
Tri[4].Vertex1 = 5;
Tri[4].Vertex2 = 6;
Tri[4].Vertex3 = 0;
Tri[5].Vertex1 = 6;
Tri[5].Vertex2 = 1;
Tri[5].Vertex3 = 0;
GradientFill(hdc,vert,7,(PVOID)Tri,6,GRADIENT_FILL_TRIANGLE);
vert[0].x += 110;
vert[1].x += 110;
vert[2].x += 110;
vert[3].x += 110;
vert[4].x += 110;
vert[5].x += 110;
vert[6].x += 110;
Tri[0].Vertex1 = 2;
Tri[0].Vertex2 = 1;
Tri[0].Vertex3 = 0;
Tri[1].Vertex1 = 3;
Tri[1].Vertex2 = 2;
Tri[1].Vertex3 = 0;
Tri[2].Vertex1 = 4;
Tri[2].Vertex2 = 3;
Tri[2].Vertex3 = 0;
Tri[3].Vertex1 = 5;
Tri[3].Vertex2 = 4;
Tri[3].Vertex3 = 0;
Tri[4].Vertex1 = 6;
Tri[4].Vertex2 = 5;
Tri[4].Vertex3 = 0;
Tri[5].Vertex1 = 1;
Tri[5].Vertex2 = 6;
Tri[5].Vertex3 = 0;
GradientFill(hdc,vert,7,(PVOID)Tri,6,GRADIENT_FILL_TRIANGLE);
vert[0].y = 200 - 150;
vert[1].y = 150 - 150;
vert[2].y = 175 - 150;
vert[3].y = 225 - 150;
vert[4].y = 250 - 150;
vert[5].y = 225 - 150;
vert[6].y = 175 - 150;
//
// draw to DIB
//
xpos = 10;
ypos += (110-50);
xposDib = 50;
yposDib = 50;
vert[0].x = xposDib;
vert[0].y = yposDib;
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0xff00;
vert[1].x = xposDib;
vert[1].y = yposDib-50;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0xff00;
vert[2].x = xposDib+50;
vert[2].y = yposDib-25;
vert[2].Red = 0xff00;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0xff00;
vert[3].x = xposDib+50;
vert[3].y = yposDib+25;
vert[3].Red = 0xff00;
vert[3].Green = 0x0000;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0xff00;
vert[4].x = xposDib;
vert[4].y = yposDib+50;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0xff00;
vert[4].Alpha = 0xff00;
vert[5].x = xposDib-50;
vert[5].y = yposDib+25;
vert[5].Red = 0x0000;
vert[5].Green = 0xff00;
vert[5].Blue = 0xff00;
vert[5].Alpha = 0xff00;
vert[6].x = xposDib-50;
vert[6].y = yposDib-25;
vert[6].Red = 0x0000;
vert[6].Green = 0xff00;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0xff00;
BitBlt(hdcm,0,0,128,128,hdc,xpos,ypos,SRCCOPY);
BitBlt(hdcmA,0,0,128,128,hdc,xpos,ypos,SRCCOPY);
GradientFill(hdcm,vert,7,(PVOID)Tri,6,GRADIENT_FILL_TRIANGLE);
//
// add alpha
//
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0xff00;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0xff00;
vert[2].Red = 0xc000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0xc000;
vert[3].Red = 0x8000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x8000;
vert[3].Alpha = 0x8000;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0xc000;
vert[4].Alpha = 0xc000;
vert[5].Red = 0x0000;
vert[5].Green = 0xf000;
vert[5].Blue = 0xf000;
vert[5].Alpha = 0xf000;
vert[6].Red = 0x0000;
vert[6].Green = 0x8000;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0x8000;
PatBlt(hdcmA,0,0,2000,2000,0);
GradientFill(hdcmA,vert,7,(PVOID)Tri,6,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,xpos,ypos,100,100,hdcm,0,0,100,100,SRCCOPY);
xpos += 110;
AlphaBlend(hdc,xpos,ypos,100,100,hdcmA,0,0,100,100,BlendFunction);
BitBlt (hdc,xpos+200,ypos,100,100,hdcmA,0,0,SRCCOPY);
AlphaBlend(hdc,xpos+400,ypos,50,50,hdcmA,10,10,80,80,BlendFunction);
xpos = 0;
ypos += 110;
vert[0].x = xpos;
vert[0].y = ypos;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x1000;
vert[0].Alpha = 0x2000;
vert[1].x = rect.right;
vert[1].y = ypos;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x8000;
vert[1].Alpha = 0xff00;
vert[2].x = rect.right;
vert[2].y = ypos+16;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x8000;
vert[2].Alpha = 0xff00;
vert[3].x = xpos;
vert[3].y = ypos+16;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x1000;
vert[3].Alpha = 0x2000;
Tri[0].Vertex1 = 0;
Tri[0].Vertex2 = 1;
Tri[0].Vertex3 = 2;
Tri[1].Vertex1 = 0;
Tri[1].Vertex2 = 2;
Tri[1].Vertex3 = 3;
GradientFill(hdc,vert,4,(PVOID)Tri,2,GRADIENT_FILL_TRIANGLE);
vert[0].y = 0;
vert[1].y = 0;
vert[2].y = 16;
vert[3].y = 16;
FillTransformedRect(hdcm,&dibRect,(HBRUSH)GetStockObject(BLACK_BRUSH));
FillTransformedRect(hdcmA,&dibRect,(HBRUSH)GetStockObject(BLACK_BRUSH));
GradientFill(hdcm,vert,4,(PVOID)Tri,2,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcmA,vert,4,(PVOID)Tri,2,GRADIENT_FILL_TRIANGLE);
ypos += 20;
StretchBlt(hdc,xpos,ypos,rect.right,16,hdcm,0,0,rect.right,16,SRCCOPY);
ypos += 20;
AlphaBlend(hdc,xpos,ypos,rect.right,16,hdcmA,0,0,rect.right,16,BlendFunction);
ypos += 20;
//
// rectangular clipped triangle
//
vert[0].x = 300;
vert[0].y = ypos;
vert[0].Red = 0xc000;
vert[0].Green = 0xc000;
vert[0].Blue = 0xc000;
vert[0].Alpha = 0x0000;
vert[1].x = 4000;
vert[1].y = 3000;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = xpos;
vert[2].y = ypos+100;
vert[2].Red = 0x4000;
vert[2].Green = 0x4000;
vert[2].Blue = 0x4000;
vert[2].Alpha = 0x0000;
Tri[0].Vertex1 = 0;
Tri[0].Vertex2 = 1;
Tri[0].Vertex3 = 2;
GradientFill(hdc,vert,3,(PVOID)Tri,1,GRADIENT_FILL_TRIANGLE);
ypos += 110;
//
// complex clipping
//
{
HRGN hrgn1 = CreateEllipticRgn(xpos,ypos,xpos+100,ypos+100);
ExtSelectClipRgn(hdc,hrgn1,RGN_COPY);
vert[0].x = 166;
vert[0].y = ypos;
vert[0].Red = 0xc000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 140;
vert[1].y = ypos+120;
vert[1].Red = 0x8000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 80;
vert[2].y = ypos+50;
vert[2].Red = 0x4000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x4000;
vert[2].Alpha = 0x0000;
Tri[0].Vertex1 = 0;
Tri[0].Vertex2 = 1;
Tri[0].Vertex3 = 2;
GradientFill(hdc,vert,3,(PVOID)Tri,1,GRADIENT_FILL_TRIANGLE);
ExtSelectClipRgn(hdc,NULL,RGN_COPY);
DeleteObject(hrgn1);
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
DeleteDC(hdcm);
DeleteDC(hdcmA);
DeleteObject(hdib);
DeleteObject(hdibA);
bThreadActive = FALSE;
}
/**************************************************************************\
* vRunGradMap
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/17/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradMap(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
CHAR msg[255];
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// grad fill and patblt rects with different map modes and origins
//
ULONG xpos = 10;
ULONG ypos = 10;
ULONG dy = 10;
ULONG dx = 10;
RECT rect;
SelectObject(hdc,hTestFont);
//
// Clear screen
//
SelectObject(hdc,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdc,0,0,2000,2000,PATCOPY);
SelectObject(hdc,hbrFillCars);
SetTextColor(hdc,RGB(255,255,255));
SetBkMode(hdc,TRANSPARENT);
GRADIENT_TRIANGLE gTri[2] ={{0,1,2},{0,2,3}};
GRADIENT_RECT gRect = {0,1};
TRIVERTEX vert[6];
//
// fill screen background
//
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0x4000;
vert[0].Green = 0x8000;
vert[0].Blue = 0xc000;
vert[0].Alpha = 0x0000;
vert[1].x = 80;
vert[1].y = 80;
vert[1].Red = 0xc000;
vert[1].Green = 0x8000;
vert[1].Blue = 0x4000;
vert[1].Alpha = 0x0000;
//
// MM_TEXT
//
LONG ux,uy;
for (uy = -400; uy <= 400;uy += 100)
{
for (ux = -400; ux <= 400;ux += 100)
{
SetWindowOrgEx(hdc,ux,uy,NULL);
GradientFill(hdc,vert,2,(PVOID)&gRect,1,GRADIENT_FILL_RECT_H);
PatBlt(hdc,30,30,20,20,PATCOPY);
wsprintf(msg,"%li,%li",ux,uy);
TextOut(hdc,10,10,msg,strlen(msg));
}
}
SetWindowOrgEx(hdc,0,0,NULL);
Sleep(gAlphaSleep);
//
// isotropic stretch
//
SelectObject(hdc,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdc,0,0,2000,2000,PATCOPY);
SelectObject(hdc,hbrFillCars);
SetMapMode(hdc,MM_ISOTROPIC);
SetViewportExtEx(hdc,1000,1000,NULL);
SetViewportOrgEx(hdc,0,0,NULL);
SetWindowExtEx(hdc,2000,2000,NULL);
SetWindowOrgEx(hdc,0,0,NULL);
for (uy = -400; uy <= 400;uy += 100)
{
for (ux = -400; ux <= 400;ux += 100)
{
SetWindowOrgEx(hdc,ux,uy,NULL);
GradientFill(hdc,vert,2,(PVOID)&gRect,1,GRADIENT_FILL_RECT_H);
PatBlt(hdc,30,30,20,20,PATCOPY);
wsprintf(msg,"%li,%li",ux,uy);
TextOut(hdc,10,10,msg,strlen(msg));
}
}
SetWindowOrgEx(hdc,0,0,NULL);
SetMapMode(hdc,MM_TEXT);
Sleep(gAlphaSleep);
//
// isotropic shrink
//
SelectObject(hdc,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdc,0,0,2000,2000,PATCOPY);
SelectObject(hdc,hbrFillCars);
SetMapMode(hdc,MM_ISOTROPIC);
SetViewportExtEx(hdc,1500,1500,NULL);
SetViewportOrgEx(hdc,0,0,NULL);
SetWindowExtEx(hdc,1000,1000,NULL);
SetWindowOrgEx(hdc,0,0,NULL);
for (uy = -400; uy <= 400;uy += 100)
{
for (ux = -400; ux <= 400;ux += 100)
{
SetWindowOrgEx(hdc,ux,uy,NULL);
GradientFill(hdc,vert,2,(PVOID)&gRect,1,GRADIENT_FILL_RECT_H);
PatBlt(hdc,30,30,20,20,PATCOPY);
wsprintf(msg,"%li,%li",ux,uy);
TextOut(hdc,10,10,msg,strlen(msg));
}
}
SetWindowOrgEx(hdc,0,0,NULL);
SetMapMode(hdc,MM_TEXT);
Sleep(gAlphaSleep);
//
// anisotropic
//
SelectObject(hdc,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdc,0,0,2000,2000,PATCOPY);
SelectObject(hdc,hbrFillCars);
SetMapMode(hdc,MM_ANISOTROPIC);
SetViewportExtEx(hdc,2000,1000,NULL);
SetViewportOrgEx(hdc,0,0,NULL);
SetWindowExtEx(hdc,1000,2000,NULL);
SetWindowOrgEx(hdc,0,0,NULL);
for (uy = -400; uy <= 400;uy += 100)
{
for (ux = -400; ux <= 400;ux += 100)
{
SetWindowOrgEx(hdc,ux,uy,NULL);
GradientFill(hdc,vert,2,(PVOID)&gRect,1,GRADIENT_FILL_RECT_H);
PatBlt(hdc,30,30,20,20,PATCOPY);
wsprintf(msg,"%li,%li",ux,uy);
TextOut(hdc,10,10,msg,strlen(msg));
}
}
SetWindowOrgEx(hdc,0,0,NULL);
SetMapMode(hdc,MM_TEXT);
//
// free objects
//
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestOverflow
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/17/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestOverflow(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
CHAR msg[255];
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// grad fill and patblt rects with different map modes and origins
//
ULONG xpos = 10;
ULONG ypos = 10;
ULONG dx = 120;
ULONG dy = 20;
RECT rect;
SelectObject(hdc,hTestFont);
//
// Clear screen
//
SelectObject(hdc,GetStockObject(LTGRAY_BRUSH));
PatBlt(hdc,0,0,2000,2000,PATCOPY);
SelectObject(hdc,hbrFillCars);
SetTextColor(hdc,RGB(255,255,255));
SetBkMode(hdc,TRANSPARENT);
GRADIENT_TRIANGLE gTri[2] ={{0,1,2},{0,2,3}};
GRADIENT_RECT gRect[]= {{0,1},{2,3},{4,5},{6,7}};
TRIVERTEX vert[6];
vert[0].x = xpos;
vert[0].y = ypos;
vert[0].Red = 0xa000;
vert[0].Green = 0xc000;
vert[0].Blue = 0xc000;
vert[0].Alpha = 0x0000;
vert[1].x = xpos+dx;
vert[1].y = ypos;
vert[1].Red = 0xc000;
vert[1].Green = 0xc000;
vert[1].Blue = 0xc000;
vert[1].Alpha = 0x0000;
vert[2].x = xpos+dx;
vert[2].y = ypos+dy;
vert[2].Red = 0xc000;
vert[2].Green = 0xc000;
vert[2].Blue = 0xc000;
vert[2].Alpha = 0x0000;
vert[3].x = xpos;
vert[3].y = ypos+dy;
vert[3].Red = 0xa000;
vert[3].Green = 0xc000;
vert[3].Blue = 0xc000;
vert[3].Alpha = 0x0000;
GradientFill(hdc,vert,4,&gTri,2,GRADIENT_FILL_TRIANGLE);
vert[0].x = xpos;
vert[0].y = ypos+dy;
vert[0].Red = 0x8000;
vert[0].Green = 0x8000;
vert[0].Blue = 0x8000;
vert[0].Alpha = 0x0000;
vert[1].x = xpos+dx+2;
vert[1].y = ypos+dy+2;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
GradientFill(hdc,vert,8,&gRect,1,GRADIENT_FILL_RECT_V);
vert[0].x = xpos+dx;
vert[0].y = ypos;
vert[0].Red = 0x8000;
vert[0].Green = 0x8000;
vert[0].Blue = 0x8000;
vert[0].Alpha = 0x0000;
vert[1].x = xpos+dx+2;
vert[1].y = ypos+dy;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = xpos;
vert[2].y = ypos;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = xpos+dx+1;
vert[3].y = ypos+1;
vert[3].Red = 0xff00;
vert[3].Green = 0xff00;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0x0000;
vert[4].x = xpos;
vert[4].y = ypos;
vert[4].Red = 0xff00;
vert[4].Green = 0xff00;
vert[4].Blue = 0xff00;
vert[4].Alpha = 0x0000;
vert[5].x = xpos+1;
vert[5].y = ypos+dy+1;
vert[5].Red = 0xff00;
vert[5].Green = 0xff00;
vert[5].Blue = 0xff00;
vert[5].Alpha = 0x0000;
GradientFill(hdc,vert,8,&gRect,3,GRADIENT_FILL_RECT_H);
//
// free objects
//
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestCircle1
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestCircle1(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
CHAR Title[256];
CHAR NewTitle[256];
GetWindowText(pCallData->hwnd,Title,256);
//
// repeat for each src format
//
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
GRADIENT_TRIANGLE gTri[2] ={{0,1,2},{0,2,3}};
GRADIENT_RECT gRect = {0,1};
TRIVERTEX vert[6];
POINT pos = {150,150};
double fr = 300.0;
double fTheta = 0.0;
double fdTheta = 0.01;
PatBlt(hdc,0,0,5000,5000,0);
//
// fade to back at 0,0
//
fTheta = 0.0;
vert[0].x = pos.x;
vert[0].y = pos.y;
vert[0].Red = 0x2000;
vert[0].Green = 0xa000;
vert[0].Blue = 0xe000;
vert[0].Alpha = 0x0000;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
fTheta = 0;
double fLimit = (2.0 * fdTheta) * 4.0;
while (fTheta < (2.0 * 3.14159265))
{
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
GradientFill(hdc,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestCircle2
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestCircle2(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
RECT rcl;
GetClientRect(pCallData->hwnd,&rcl);
//
// repeat for each src format
//
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
GRADIENT_TRIANGLE gTri[2] ={{0,1,2},{0,2,3}};
GRADIENT_RECT gRect = {0,1};
TRIVERTEX vert[6];
POINT pos = {100,100};
double fr = 1000.0;
double fTheta = 0.0;
double fdTheta = 0.001;
PatBlt(hdc,0,0,5000,5000,0);
//
// solid color
//
fr = 100.0;
fTheta = 0.0;
vert[0].x = pos.x;
vert[0].y = pos.y;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].Red = 0x0000;
vert[1].Green = 0xcf00;
vert[1].Blue = 0xcf00;
vert[1].Alpha = 0x0000;
vert[2].Red = 0x0000;
vert[2].Green = 0xcf00;
vert[2].Blue = 0xcf00;
vert[2].Alpha = 0x0000;
while (fTheta < (2.0 * 3.14159265))
{
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
vert[1].Red = 0x8000 + (SHORT)((double)0x7f00 * cos(fTheta));
vert[1].Green = 0x8000 + (SHORT)((double)0x7f00 * sin(fTheta));
vert[1].Blue = 0x8000 + (SHORT)((double)0x3f00 * cos(fTheta)) + (SHORT)((double)0x3f00 * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
vert[2].Red = 0x8000 + (SHORT)((double)0x7f00 * cos(fTheta));
vert[2].Green = 0x8000 + (SHORT)((double)0x7f00 * sin(fTheta));
vert[2].Blue = 0x8000 + (SHORT)((double)0x3f00 * cos(fTheta)) + (SHORT)((double)0x3f00 * sin(fTheta));
GradientFill(hdc,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
//
// separate triangles
//
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
fr = 500.0;
fTheta = 0.0;
fdTheta = 0.02;
pos.x = rcl.right/2;
pos.y = rcl.bottom/2;
while (fTheta < (2.0 * 3.14159265))
{
vert[0].x = (LONG)(pos.x + 20.0 * cos(fTheta));
vert[0].y = (LONG)(pos.y + 20.0 * sin(fTheta));
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
GradientFill(hdc,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestCircle3
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestCircle3(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
RECT rcl;
GetClientRect(pCallData->hwnd,&rcl);
//
// repeat for each src format
//
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
GRADIENT_TRIANGLE gTri[2] ={{0,1,2},{0,2,3}};
GRADIENT_RECT gRect = {0,1};
TRIVERTEX vert[6];
//double fr = 65536.0;
double fr = 200.0;
double fTheta = 0.0;
double fdTheta = 0.01;
POINT pos = {0,0};
//
// separate triangles
//
vert[0].Red = 0xcc00;
vert[0].Green = 0x4400;
vert[0].Blue = 0x6600;
vert[0].Alpha = 0x0000;
vert[1].Red = 0x6600;
vert[1].Green = 0xcc00;
vert[1].Blue = 0x4400;
vert[1].Alpha = 0x0000;
vert[2].Red = 0x4400;
vert[2].Green = 0x6600;
vert[2].Blue = 0xcc00;
vert[2].Alpha = 0x0000;
do
{
PatBlt(hdc,0,0,5000,5000,0);
pos.x = 0;
pos.y = 0;
fTheta = 0.0;
while (fTheta < (2.0 * 3.14159265))
{
vert[0].x = (LONG)(pos.x + 20.0 * cos(fTheta));
vert[0].y = (LONG)(pos.y + 20.0 * sin(fTheta));
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
GradientFill(hdc,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
Sleep(200);
PatBlt(hdc,0,0,5000,5000,0);
pos.x = rcl.right;
pos.y = 0;
fTheta = 0.0;
while (fTheta < (2.0 * 3.14159265))
{
vert[0].x = (LONG)(pos.x + 20.0 * cos(fTheta));
vert[0].y = (LONG)(pos.y + 20.0 * sin(fTheta));
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
GradientFill(hdc,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
Sleep(200);
PatBlt(hdc,0,0,5000,5000,0);
pos.x = rcl.right;
pos.y = rcl.bottom;
fTheta = 0.0;
while (fTheta < (2.0 * 3.14159265))
{
vert[0].x = (LONG)(pos.x + 20.0 * cos(fTheta));
vert[0].y = (LONG)(pos.y + 20.0 * sin(fTheta));
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
GradientFill(hdc,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
Sleep(200);
PatBlt(hdc,0,0,5000,5000,0);
pos.x = 0;
pos.y = rcl.bottom;
fTheta = 0.0;
while (fTheta < (2.0 * 3.14159265))
{
vert[0].x = (LONG)(pos.x + 20.0 * cos(fTheta));
vert[0].y = (LONG)(pos.y + 20.0 * sin(fTheta));
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
GradientFill(hdc,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
Sleep(200);
fr *= 2.0;
} while (fr < 131072.0);
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestMenu
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 5/15/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestMenu(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
LONG xpos = 0;
MENUINFO mi;
{
mi.cbSize = sizeof(mi);
mi.fMask = MIM_BACKGROUND | MIM_APPLYTOSUBMENUS;
mi.hbrBack = CreateHatchBrush(HS_BDIAGONAL, RGB(255, 0, 0));
// mi.hbrBack = CreateSolidBrush(RGB(255, 0, 0));
SetMenuInfo(GetMenu(pCallData->hwnd), &mi);
}
HBRUSH hbr1 = CreateHatchBrush(HS_BDIAGONAL, RGB(255, 0, 0));
HBRUSH hbr2 = CreateHatchBrush(HS_BDIAGONAL, RGB( 0, 255, 0));
HBRUSH hbr3 = CreateHatchBrush(HS_BDIAGONAL, RGB( 0, 0, 255));
HBRUSH hbr4 = CreateSolidBrush(RGB(255,255,0));
PatBlt(hdc,0,0,5000,5000,0);
SetBkColor(hdc,RGB(0,0,0));
SelectObject(hdc,hbr1);
PatBlt(hdc,xpos,0,8,8,PATCOPY);
SelectObject(hdc,hbr2);
PatBlt(hdc,xpos,16,8,8,PATCOPY);
SelectObject(hdc,hbr3);
PatBlt(hdc,xpos,32,8,8,PATCOPY);
SelectObject(hdc,hbr4);
PatBlt(hdc,xpos,48,8,8,PATCOPY);
SetBkColor(hdc,RGB(255,0,0));
xpos += 16;
SelectObject(hdc,hbr1);
PatBlt(hdc,xpos,0,8,8,PATCOPY);
SelectObject(hdc,hbr2);
PatBlt(hdc,xpos,16,8,8,PATCOPY);
SelectObject(hdc,hbr3);
PatBlt(hdc,xpos,32,8,8,PATCOPY);
SelectObject(hdc,hbr4);
PatBlt(hdc,xpos,48,8,8,PATCOPY);
SetBkColor(hdc,RGB(0,255,0));
xpos += 16;
SelectObject(hdc,hbr1);
PatBlt(hdc,xpos,0,8,8,PATCOPY);
SelectObject(hdc,hbr2);
PatBlt(hdc,xpos,16,8,8,PATCOPY);
SelectObject(hdc,hbr3);
PatBlt(hdc,xpos,32,8,8,PATCOPY);
SelectObject(hdc,hbr4);
PatBlt(hdc,xpos,48,8,8,PATCOPY);
SetBkColor(hdc,RGB(0,0,255));
xpos += 16;
SelectObject(hdc,hbr1);
PatBlt(hdc,xpos,0,8,8,PATCOPY);
SelectObject(hdc,hbr2);
PatBlt(hdc,xpos,16,8,8,PATCOPY);
SelectObject(hdc,hbr3);
PatBlt(hdc,xpos,32,8,8,PATCOPY);
SelectObject(hdc,hbr4);
PatBlt(hdc,xpos,48,8,8,PATCOPY);
SetBkColor(hdc,RGB(255,255,255));
xpos += 16;
SelectObject(hdc,hbr1);
PatBlt(hdc,xpos,0,8,8,PATCOPY);
SelectObject(hdc,hbr2);
PatBlt(hdc,xpos,16,8,8,PATCOPY);
SelectObject(hdc,hbr3);
PatBlt(hdc,xpos,32,8,8,PATCOPY);
SelectObject(hdc,hbr4);
PatBlt(hdc,xpos,48,8,8,PATCOPY);
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hbr1);
DeleteObject(hbr2);
DeleteObject(hbr3);
DeleteObject(hbr4);
}
/**************************************************************************\
* vTestDiamond
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 5/15/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestDiamond(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[2] ={{0,1,2},{0,2,3}};
GRADIENT_RECT gRect = {0,1};
TRIVERTEX vert[6];
RECT rcl;
GetClientRect(pCallData->hwnd,&rcl);
//
// background
//
vert[0].x = 0x0;
vert[0].y = 0x0;
vert[0].Red = 0x0000;
vert[0].Green = 0x8000;
vert[0].Blue = 0x8000;
vert[0].Alpha = 0x0000;
vert[1].x = rcl.right;
vert[1].y = 0;
vert[1].Red = 0x0000;
vert[1].Green = 0x4000;
vert[1].Blue = 0x8000;
vert[1].Alpha = 0x0000;
vert[2].x = rcl.right;
vert[2].y = rcl.bottom;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x8000;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = rcl.bottom;
vert[3].Red = 0x0000;
vert[3].Green = 0x4000;
vert[3].Blue = 0x8000;
vert[3].Alpha = 0x0000;
GradientFill(hdc,vert,4,&gTri,2,GRADIENT_FILL_TRIANGLE);
//
// Diamond
//
vert[0].x = 70;
vert[0].y = 150;
vert[0].Red = 0xff00;
vert[0].Green = 0xa000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 100;
vert[1].y = 100;
vert[1].Red = 0xff00;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 130;
vert[2].y = 150;
vert[2].Red = 0xff00;
vert[2].Green = 0x6000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
vert[3].x = 100;
vert[3].y = 200;
vert[3].Red = 0xff00;
vert[3].Green = 0xff00;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
GradientFill(hdc,vert,4,&gTri,2,GRADIENT_FILL_TRIANGLE);
//
// circle with alpha
//
BITMAPINFO bmi;
PBITMAPINFOHEADER pbmih = &bmi.bmiHeader;
pbmih->biSize = sizeof(BITMAPINFOHEADER);
pbmih->biWidth = 128;
pbmih->biHeight = 128;
pbmih->biPlanes = 1;
pbmih->biBitCount = 32;
pbmih->biCompression = BI_RGB;
pbmih->biSizeImage = 0;
pbmih->biXPelsPerMeter = 0;
pbmih->biYPelsPerMeter = 0;
pbmih->biClrUsed = 0;
pbmih->biClrImportant = 0;
PULONG pDib32RGB;
HBITMAP hdib32RGB = CreateDIBSection(hdc,&bmi,DIB_RGB_COLORS,(VOID **)&pDib32RGB,NULL,0);
HDC hdcm = CreateCompatibleDC(hdc);
SelectObject(hdcm,hdib32RGB);
PatBlt(hdcm,0,0,5000,5000,0);
POINT pos = {64,64};
double fr = 32.0;
double fTheta = 0.0;
double fdTheta = 0.1;
//
// fade to back at 0,0
//
fTheta = 0.0;
vert[0].x = pos.x;
vert[0].y = pos.y;
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0xff00;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
fTheta = 0;
double fLimit = (2.0 * fdTheta) * 4.0;
while (fTheta < (2.0 * 3.14159265))
{
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
GradientFill(hdcm,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
BLENDFUNCTION BlendFunction;
BlendFunction.BlendOp = AC_SRC_OVER;
BlendFunction.BlendFlags = 0;
BlendFunction.SourceConstantAlpha = 0xfe;
BlendFunction.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(hdc,100-64,100-64,128,128,hdcm,0,0,128,128,BlendFunction);
DeleteDC(hdcm);
DeleteObject(hdib32RGB);
ReleaseDC(pCallData->hwnd,hdc);
}
/**************************************************************************\
* vTestBitBlt
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 5/15/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestBitBlt(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
//
// tile screen
//
{
RECT rect;
GetClientRect(pCallData->hwnd,&rect);
FillTransformedRect(hdc,&rect,hbrFillCars);
}
BitBlt(hdc,100,100,200,200,hdc,0,0,NOTSRCCOPY);
BitBlt(hdc,400,100,200,200,hdc,500,0,NOTSRCCOPY);
BitBlt(hdc,100,400,200,200,hdc,0,500,NOTSRCCOPY);
BitBlt(hdc,400,400,200,200,hdc,500,500,NOTSRCCOPY);
ReleaseDC(pCallData->hwnd,hdc);
}
VOID
vTestBitBlt2(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
//
// tile screen
//
{
RECT rect;
GetClientRect(pCallData->hwnd,&rect);
FillTransformedRect(hdc,&rect,hbrFillCars);
}
BitBlt(hdc,100,100,200,200,hdc,0,0,NOTSRCCOPY);
BitBlt(hdc,200,000,200,200,hdc,100,100,NOTSRCCOPY);
ReleaseDC(pCallData->hwnd,hdc);
}
VOID
vTestBitBlt3(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GdiSetBatchLimit(1);
//
// tile screen
//
ULONG ulIndex = 0;
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[ulIndex],ulFor[ulIndex],350,350);
HDC hdcm = CreateCompatibleDC(hdc);
SelectObject(hdcm,hdib);
PatBlt(hdc ,0,0,5000,5000,0);
PatBlt(hdcm,0,0,5000,5000,0);
HBRUSH hBrush = (HBRUSH)SelectObject(hdcm,CreateSolidBrush(RGB(255, 255, 255 )));
Rectangle(hdcm, 0, 0, 200, 200);
hBrush = (HBRUSH)SelectObject(hdcm,CreateSolidBrush(RGB(255, 0,0 )));
Ellipse(hdcm, 50, 50, 350, 350);
BitBlt( hdcm, 100, 100, 200, 200, hdcm, 0, 0, NOTSRCCOPY );
BitBlt( hdc,0,0, 350, 350, hdcm, 0, 0, SRCCOPY );
GdiSetBatchLimit(0);
ReleaseDC(pCallData->hwnd,hdc);
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradRectH(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_RECT gRect[10];
GRADIENT_TRIANGLE gTri[10];
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
HDC hdcmA = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
PBITMAPINFOHEADER pbmih;
HBITMAP hdib;
HBITMAP hdibA;
PBYTE pDib;
PBYTE pDibA;
BLENDFUNCTION BlendFunction;
//
// tile screen
//
{
RECT rect;
HBITMAP hbmCars = LoadBitmap(hInstMain,MAKEINTRESOURCE(CAR_BITMAP));
LOGBRUSH lgBrush;
HBRUSH hbrFill;
lgBrush.lbStyle = BS_PATTERN;
lgBrush.lbColor = 0;
lgBrush.lbHatch = (LONG)hbmCars;
hbrFill = CreateBrushIndirect(&lgBrush);
GetClientRect(pCallData->hwnd,&rect);
FillTransformedRect(hdc,&rect,hbrFill);
DeleteObject(hbrFill);
DeleteObject(hbmCars);
}
//
// init drawing modes
//
SetStretchBltMode(hdc,HALFTONE);
BlendFunction.BlendOp = AC_SRC_OVER;
BlendFunction.BlendFlags = 0;
BlendFunction.SourceConstantAlpha = 255;
SetGraphicsMode(hdc,GM_ADVANCED);
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
//
// select and realize palette
//
hpal = CreateHtPalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
pbmih = (PBITMAPINFOHEADER)&pbmi->bmiHeader;
pbmih->biSize = sizeof(BITMAPINFOHEADER);
pbmih->biWidth = rect.right;
pbmih->biHeight = 200;
pbmih->biPlanes = 1;
pbmih->biBitCount = 32;
pbmih->biCompression = BI_RGB;
pbmih->biSizeImage = 0;
pbmih->biXPelsPerMeter = 0;
pbmih->biYPelsPerMeter = 0;
pbmih->biClrUsed = 0;
pbmih->biClrImportant = 0;
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
PULONG pulMask = (PULONG)&pbmi->bmiColors[0];
pulMask[0] = 0x00ff0000;
pulMask[1] = 0x0000ff00;
pulMask[2] = 0x000000ff;
pbmih->biCompression = BI_BITFIELDS;
hdibA = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDibA,NULL,0);
if ((hdib == NULL) && (hdibA != NULL))
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
if (SelectObject(hdcmA,hdibA) == NULL)
{
MessageBox(NULL,"error selecting Alpha DIB","Error",MB_OK);
}
}
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0xff00;
vert[1].x = 100;
vert[1].y = 100;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0xff00;
gRect[0].UpperLeft = 0;
gRect[0].LowerRight = 1;
GradientFill(hdc,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_H);
GradientFill(hdcm,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_H);
SetStretchBltMode(hdc,COLORONCOLOR);
StretchBlt(hdc,120, 0,100,100,hdcm,0,0,100,100,SRCCOPY);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,240, 0,100,100,hdcm,0,0,100,100,SRCCOPY);
//
// add alpha
//
vert[0].Red = 0x8400;
vert[0].Alpha = 0x8400;
vert[1].Green = 0x4000;
vert[1].Alpha = 0x4000;
GradientFill(hdcmA,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_H);
AlphaBlend(hdc,360,0,100,100,hdcmA,0,0,100,100,BlendFunction);
BitBlt(hdc,480,0,100,100,hdcmA,0,0,SRCCOPY);
vert[0].x = 0;
vert[0].y = 110;
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 100;
vert[1].y = 110;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 100;
vert[2].y = 210;
vert[2].Red = 0x0000;
vert[2].Green = 0xff00;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = 210;
vert[3].Red = 0xff00;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
gTri[0].Vertex1 = 0;
gTri[0].Vertex2 = 1;
gTri[0].Vertex3 = 2;
gTri[1].Vertex1 = 0;
gTri[1].Vertex2 = 2;
gTri[1].Vertex3 = 3;
GradientFill(hdc,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
//
// zero offset
//
vert[0].y = 0;
vert[1].y = 0;
vert[2].y = 100;
vert[3].y = 100;
GradientFill(hdcm,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
SetStretchBltMode(hdc,COLORONCOLOR);
StretchBlt(hdc,120,110,100,100,hdcm,0,0,100,100,SRCCOPY);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,240,110,100,100,hdcm,0,0,100,100,SRCCOPY);
//
// add alpha
//
vert[0].Red = 0x8400;
vert[0].Alpha = 0x8400;
vert[1].Green = 0x4000;
vert[1].Alpha = 0x4000;
vert[2].Green = 0x4000;
vert[2].Alpha = 0x4000;
vert[3].Red = 0x8400;
vert[3].Alpha = 0x8400;
GradientFill(hdcmA,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
AlphaBlend(hdc,360,110,100,100,hdcmA,0,0,100,100,BlendFunction);
BitBlt(hdc,480,110,100,100,hdcmA,0,0,SRCCOPY);
//
// banners
//
vert[0].x = 0;
vert[0].y = 300;
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 600;
vert[1].y = 330;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 0;
vert[2].y = 332;
vert[2].Red = 0x0000;
vert[2].Green = 0xff00;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
vert[3].x = 600;
vert[3].y = 362;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
vert[4].x = 0;
vert[4].y = 364;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0xff00;
vert[4].Alpha = 0x0000;
vert[5].x = 600;
vert[5].y = 395;
vert[5].Red = 0x0000;
vert[5].Green = 0x0000;
vert[5].Blue = 0x0000;
vert[5].Alpha = 0x0000;
vert[6].x = 0;
vert[6].y = 400;
vert[6].Red = 0x0000;
vert[6].Green = 0x0000;
vert[6].Blue = 0xff00;
vert[6].Alpha = 0x0000;
vert[7].x = 600;
vert[7].y = 430;
vert[7].Red = 0xff00;
vert[7].Green = 0xff00;
vert[7].Blue = 0x0000;
vert[7].Alpha = 0x0000;
gRect[0].UpperLeft = 0;
gRect[0].LowerRight = 1;
gRect[1].UpperLeft = 2;
gRect[1].LowerRight = 3;
gRect[2].UpperLeft = 4;
gRect[2].LowerRight = 5;
gRect[3].UpperLeft = 6;
gRect[3].LowerRight = 7;
GradientFill(hdc,vert,8,(PVOID)gRect,4,GRADIENT_FILL_RECT_H);
//
// banner triangles
//
vert[0].x = 0;
vert[0].y = 432;
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 600;
vert[1].y = 432;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 600;
vert[2].y = 463;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = 463;
vert[3].Red = 0xff00;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
gTri[0].Vertex1 = 0;
gTri[0].Vertex2 = 1;
gTri[0].Vertex3 = 2;
gTri[1].Vertex1 = 0;
gTri[1].Vertex2 = 2;
gTri[1].Vertex3 = 3;
GradientFill(hdc,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
vert[0].x = 0;
vert[0].y = 464;
vert[0].Red = 0x0000;
vert[0].Green = 0xff00;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 600;
vert[1].y = 464;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 600;
vert[2].y = 495;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = 495;
vert[3].Red = 0x0000;
vert[3].Green = 0xff00;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
GradientFill(hdc,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
vert[0].x = 0;
vert[0].y = 500;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0x0000;
vert[1].x = 600;
vert[1].y = 500;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 600;
vert[2].y = 530;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = 530;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0x0000;
GradientFill(hdc,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
vert[0].x = 0;
vert[0].y = 532;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0x0000;
vert[1].x = 600;
vert[1].y = 532;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 600;
vert[2].y = 563;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = 563;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0x0000;
GradientFill(hdc,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
DeleteDC(hdcm);
DeleteDC(hdcmA);
DeleteObject(hdib);
DeleteObject(hdibA);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradRectV(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_RECT gRect[10];
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
HDC hdcmA = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
PBITMAPINFOHEADER pbmih;
HBITMAP hdib;
HBITMAP hdibA;
PBYTE pDib;
PBYTE pDibA;
BLENDFUNCTION BlendFunction;
LONG xAlign;
LONG xpos = 0;
LONG ypos = 0;
//
// tile screen
//
{
RECT rect;
HBITMAP hbmCars = LoadBitmap(hInstMain,MAKEINTRESOURCE(CAR_BITMAP));
LOGBRUSH lgBrush;
HBRUSH hbrFill;
lgBrush.lbStyle = BS_PATTERN;
lgBrush.lbColor = 0;
lgBrush.lbHatch = (LONG)hbmCars;
hbrFill = CreateBrushIndirect(&lgBrush);
GetClientRect(pCallData->hwnd,&rect);
FillTransformedRect(hdc,&rect,hbrFill);
DeleteObject(hbrFill);
DeleteObject(hbmCars);
}
//
// init drawing modes
//
SetStretchBltMode(hdc,HALFTONE);
BlendFunction.BlendOp = AC_SRC_OVER;
BlendFunction.BlendFlags = 0;
BlendFunction.SourceConstantAlpha = 255;
SetGraphicsMode(hdc,GM_ADVANCED);
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
//
// select and realize palette
//
hpal = CreateHtPalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
pbmih = (PBITMAPINFOHEADER)&pbmi->bmiHeader;
pbmih->biSize = sizeof(BITMAPINFOHEADER);
pbmih->biWidth = rect.right;
pbmih->biHeight = 200;
pbmih->biPlanes = 1;
pbmih->biBitCount = 32;
pbmih->biCompression = BI_RGB;
pbmih->biSizeImage = 0;
pbmih->biXPelsPerMeter = 0;
pbmih->biYPelsPerMeter = 0;
pbmih->biClrUsed = 0;
pbmih->biClrImportant = 0;
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
PULONG pulMask = (PULONG)&pbmi->bmiColors[0];
pulMask[0] = 0x00ff0000;
pulMask[1] = 0x0000ff00;
pulMask[2] = 0x000000ff;
pbmih->biCompression = BI_BITFIELDS;
hdibA = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDibA,NULL,0);
if ((hdib == NULL) && (hdibA != NULL))
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
if (SelectObject(hdcmA,hdibA) == NULL)
{
MessageBox(NULL,"error selecting Alpha DIB","Error",MB_OK);
}
}
vert[0].x = -100;
vert[0].y = -100;
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0xff00;
vert[1].x = 1300;
vert[1].y = 100;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0xff00;
gRect[0].UpperLeft = 0;
gRect[0].LowerRight = 1;
GradientFill(hdc,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_V);
xpos = 0;
ypos = 110;
for (xAlign=0;xAlign<8;xAlign++)
{
vert[0].x = xAlign;
vert[0].y = ypos;
vert[0].Red = 0x8000;
vert[0].Green = 0xc000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0xff00;
ypos += 30;
vert[1].x = vert[0].x + 31;
vert[1].y = ypos+2;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0xff00;
ypos += 5;
vert[2].x = vert[0].x + 7;
vert[2].y = ypos;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0xff00;
ypos += 30;
vert[3].x = vert[2].x + 32;
vert[3].y = ypos+3;
vert[3].Red = 0x0000;
vert[3].Green = 0xff00;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0xff00;
gRect[0].UpperLeft = 0;
gRect[0].LowerRight = 1;
gRect[1].UpperLeft = 2;
gRect[1].LowerRight = 3;
GradientFill(hdc,vert,4,(PVOID)gRect,2,GRADIENT_FILL_RECT_V);
ypos += 5;
}
ypos = 110;
xpos = 100;
{
LONG xAlign;
for (xAlign=0;xAlign<8;xAlign++)
{
LONG ix,iy;
LONG width = 1;
for (ix=xpos+xAlign;ix<2000;ix+=32)
{
vert[0].x = ix;
vert[0].y = ypos;
vert[0].Red = 0x4000;
vert[0].Green = 0x4000;
vert[0].Blue = 0x4000;
vert[0].Alpha = 0xff00;
vert[1].x = ix + width;
vert[1].y = ypos+32;
vert[1].Red = 0xc000;
vert[1].Green = 0xc000;
vert[1].Blue = 0xc000;
vert[1].Alpha = 0xff00;
GradientFill(hdc,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_V);
width++;
}
ypos += 40;
}
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
DeleteDC(hdcm);
DeleteDC(hdcmA);
DeleteObject(hdibA);
DeleteObject(hdib);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradRect4(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_RECT gRect[2] = {{0,1},{2,3}};
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{3,4,5}};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm4 = CreateCompatibleDC(hdc);
HBITMAP hdib4;
PBYTE pDib4;
PBITMAPINFO pbmi;
PBITMAPINFOHEADER pbih;
ULONG ux,uy;
PULONG pulColors;
ULONG ulVGA[] = {
0x00000000,
0x00800000,
0x00008000,
0x00808000,
0x00000080,
0x00800080,
0x00008080,
0x00C0C0C0,
0x00808080,
0x00FF0000,
0x0000FF00,
0x00FFFF00,
0x000000FF,
0x00FF00FF,
0x0000FFFF,
0x00ffffff
};
//
// tile screen
//
{
RECT rect;
HBITMAP hbmCars = LoadBitmap(hInstMain,MAKEINTRESOURCE(CAR_BITMAP));
LOGBRUSH lgBrush;
HBRUSH hbrFill;
lgBrush.lbStyle = BS_PATTERN;
lgBrush.lbColor = 0;
lgBrush.lbHatch = (LONG)hbmCars;
hbrFill = CreateBrushIndirect(&lgBrush);
GetClientRect(pCallData->hwnd,&rect);
FillTransformedRect(hdc,&rect,hbrFill);
DeleteObject(hbrFill);
DeleteObject(hbmCars);
}
//
// init drawing modes
//
SetStretchBltMode(hdc,HALFTONE);
SetGraphicsMode(hdc,GM_ADVANCED);
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
//
// select and realize palette
//
hpal = CreateHtPalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pbih = (PBITMAPINFOHEADER)&pbmi->bmiHeader;
pulColors = (PULONG)&pbmi->bmiColors[0];
pbih->biSize = sizeof(BITMAPINFOHEADER);
pbih->biWidth = 512;
pbih->biHeight = 256;
pbih->biPlanes = 1;
pbih->biBitCount = 4;
pbih->biCompression = BI_RGB;
pbih->biSizeImage = 0;
pbih->biXPelsPerMeter = 0;
pbih->biYPelsPerMeter = 0;
pbih->biClrUsed = 0;
pbih->biClrImportant = 0;
memcpy(pulColors,&ulVGA[0],16*4);
hdib4 = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib4,NULL,0);
SelectObject(hdcm4,hdib4);
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0xff00;
vert[1].x = 100;
vert[1].y = 100;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0xff00;
PatBlt(hdcm4,0,0,128,128,BLACKNESS);
GradientFill(hdcm4,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_H);
BitBlt(hdc,0,0,128,128,hdcm4,0,0,SRCCOPY);
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0xff00;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0xff00;
vert[1].x = 100;
vert[1].y = 100;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0xff00;
PatBlt(hdcm4,0,0,128,128,BLACKNESS);
GradientFill(hdcm4,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_H);
BitBlt(hdc,0,128+10,128,128,hdcm4,0,0,SRCCOPY);
//
// triangle
//
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0x0000;
vert[1].x = 100;
vert[1].y = 0;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = 100;
vert[2].y = 100;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = 100;
vert[3].y = 10;
vert[3].Red = 0x0000;
vert[3].Green = 0xff00;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
vert[4].x = 100;
vert[4].y = 110;
vert[4].Red = 0x0000;
vert[4].Green = 0xff00;
vert[4].Blue = 0x0000;
vert[4].Alpha = 0x0000;
vert[5].x = 0;
vert[5].y = 110;
vert[5].Red = 0x0000;
vert[5].Green = 0xff00;
vert[5].Blue = 0x0000;
vert[5].Alpha = 0x0000;
PatBlt(hdcm4,0,0,128,128,BLACKNESS);
GradientFill(hdcm4,vert,6,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
BitBlt(hdc,200,0,128,128,hdcm4,0,0,SRCCOPY);
//
// r,g,b,grey gradient
//
{
GRADIENT_TRIANGLE gradTri[8] = {
{ 0, 1, 2},{ 1, 2, 3},
{ 4, 5, 6},{ 5, 6, 7},
{ 8, 9,10},{ 9,10,11},
{12,13,14},{13,14,15}
};
int dy = 64;
// clear
PatBlt(hdcm4,0,0,1000,1000,BLACKNESS);
// Blue
vert[0].x = 0;
vert[0].y = dy * 0;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0x0000;
vert[1].x = 512;
vert[1].y = dy * 0;0;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 0;
vert[2].y = dy * 0 + (dy-4);
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = 512;
vert[3].y = dy * 0 + (dy-4);
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
// red
vert[4].x = 0;
vert[4].y = dy * 1;
vert[4].Red = 0xff00;
vert[4].Green = 0x0000;
vert[4].Blue = 0x0000;
vert[4].Alpha = 0x0000;
vert[5].x = 512;
vert[5].y = dy * 1;
vert[5].Red = 0x0000;
vert[5].Green = 0x0000;
vert[5].Blue = 0x0000;
vert[5].Alpha = 0x0000;
vert[6].x = 0;
vert[6].y = dy * 1 + (dy-4);
vert[6].Red = 0xff00;
vert[6].Green = 0x0000;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0x0000;
vert[7].x = 512;
vert[7].y = dy * 1 + (dy-4);
vert[7].Red = 0x0000;
vert[7].Green = 0x0000;
vert[7].Blue = 0x0000;
vert[7].Alpha = 0x0000;
// green
vert[8].x = 0;
vert[8].y = dy * 2;
vert[8].Red = 0x0000;
vert[8].Green = 0xff00;
vert[8].Blue = 0x0000;
vert[8].Alpha = 0x0000;
vert[9].x = 512;
vert[9].y = dy * 2;
vert[9].Red = 0x0000;
vert[9].Green = 0x0000;
vert[9].Blue = 0x0000;
vert[9].Alpha = 0x0000;
vert[10].x = 0;
vert[10].y = dy * 2 + (dy-4);
vert[10].Red = 0x0000;
vert[10].Green = 0xff00;
vert[10].Blue = 0x0000;
vert[10].Alpha = 0x0000;
vert[11].x = 512;
vert[11].y = dy * 2 + (dy-4);
vert[11].Red = 0x0000;
vert[11].Green = 0x0000;
vert[11].Blue = 0x0000;
vert[11].Alpha = 0x0000;
// grey
vert[12].x = 0;
vert[12].y = dy * 3;
vert[12].Red = 0xff00;
vert[12].Green = 0xff00;
vert[12].Blue = 0xff00;
vert[12].Alpha = 0x0000;
vert[13].x = 512;
vert[13].y = dy * 3;
vert[13].Red = 0x0000;
vert[13].Green = 0x0000;
vert[13].Blue = 0x0000;
vert[13].Alpha = 0x0000;
vert[14].x = 0;
vert[14].y = dy * 3 + (dy-4);
vert[14].Red = 0xff00;
vert[14].Green = 0xff00;
vert[14].Blue = 0xff00;
vert[14].Alpha = 0x0000;
vert[15].x = 512;
vert[15].y = dy * 3 + (dy-4);
vert[15].Red = 0x0000;
vert[15].Green = 0x0000;
vert[15].Blue = 0x0000;
vert[15].Alpha = 0x0000;
GradientFill(hdcm4,vert,16,(PVOID)gradTri,8,GRADIENT_FILL_TRIANGLE);
BitBlt(hdc,200,128+10,512,256,hdcm4,0,0,SRCCOPY);
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
DeleteDC(hdcm4);
DeleteObject(hdib4);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradRect1(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_RECT gRect[2] = {{0,1},{2,3}};
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{3,4,5}};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm1 = CreateCompatibleDC(hdc);
HBITMAP hdib1;
PBYTE pDib1;
PBITMAPINFO pbmi;
PBITMAPINFOHEADER pbih;
ULONG ux,uy;
PULONG pulColors;
ULONG ulVGA[] = {
0x00000000,
0x00ffffff,
0x00008000,
0x00808000,
0x00000080,
0x00800080,
0x00008080,
0x00C0C0C0,
0x00808080,
0x00FF0000,
0x0000FF00,
0x00FFFF00,
0x000000FF,
0x00FF00FF,
0x0000FFFF,
0x00ffffff
};
//
// tile screen
//
{
RECT rect;
HBITMAP hbmCars = LoadBitmap(hInstMain,MAKEINTRESOURCE(CAR_BITMAP));
LOGBRUSH lgBrush;
HBRUSH hbrFill;
lgBrush.lbStyle = BS_PATTERN;
lgBrush.lbColor = 0;
lgBrush.lbHatch = (LONG)hbmCars;
hbrFill = CreateBrushIndirect(&lgBrush);
GetClientRect(pCallData->hwnd,&rect);
FillTransformedRect(hdc,&rect,hbrFill);
DeleteObject(hbrFill);
DeleteObject(hbmCars);
}
//
// init drawing modes
//
SetStretchBltMode(hdc,HALFTONE);
SetGraphicsMode(hdc,GM_ADVANCED);
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
//
// select and realize palette
//
hpal = CreateHtPalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pbih = (PBITMAPINFOHEADER)&pbmi->bmiHeader;
pulColors = (PULONG)&pbmi->bmiColors[0];
pbih->biSize = sizeof(BITMAPINFOHEADER);
pbih->biWidth = 128;
pbih->biHeight = 128;
pbih->biPlanes = 1;
pbih->biBitCount = 1;
pbih->biCompression = BI_RGB;
pbih->biSizeImage = 0;
pbih->biXPelsPerMeter = 0;
pbih->biYPelsPerMeter = 0;
pbih->biClrUsed = 0;
pbih->biClrImportant = 0;
memcpy(pulColors,&ulVGA[0],2*4);
hdib1 = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib1,NULL,0);
SelectObject(hdcm1,hdib1);
PatBlt(hdcm1,0,0,128,128,BLACKNESS);
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0xff00;
vert[1].x = 100;
vert[1].y = 100;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0xff00;
GradientFill(hdcm1,vert,2,(PVOID)gRect,1,GRADIENT_FILL_RECT_H);
BitBlt(hdc,0,0,128,128,hdcm1,0,0,SRCCOPY);
PatBlt(hdcm1,0,0,128,128,BLACKNESS);
//
// triangle
//
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0xff00;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0x0000;
vert[1].x = 100;
vert[1].y = 0;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = 100;
vert[2].y = 100;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
GradientFill(hdcm1,vert,3,(PVOID)gTri,1,GRADIENT_FILL_TRIANGLE);
BitBlt(hdc,200,0,128,128,hdcm1,0,0,SRCCOPY);
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
DeleteDC(hdcm1);
DeleteObject(hdib1);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
LONG
GEN_RAND_VERT(
LONG Limit
)
{
LONG l1 = rand() & 0xffff;
LONG l2 = rand() & 0xffff;
l1 = (l1 << 16) | l2;
l1 = l1 % Limit;
return(l1);
}
VOID
vTestRandTri(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[4] = {{0,1,2},{0,2,3},{0,3,4},{0,4,5}};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
HBITMAP hdib;
PBYTE pDib;
SetStretchBltMode(hdc,HALFTONE);
SetGraphicsMode(hdc,GM_ADVANCED);
//
// clear screen
//
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
FillTransformedRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
//
// select and realize palette
//
hpal = CreateHalftonePalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = rect.right;
pbmi->bmiHeader.biHeight = -200;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 32;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
if (hdib == NULL)
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
}
srand(11);
LONG MaxVert1 = 0xffffffff;
LONG MaxVert2 = 0x000007ff;
LONG vIndex = 0;
LONG MaxVert = MaxVert2;
//#define GEN_RAND_VERT(v) ((((rand() & 0xffff) << 16) | (rand() & 0xffff)) & v - (v/2))
do
{
vIndex++;
if (vIndex > 100)
{
vIndex = 0;
if (MaxVert == MaxVert1)
{
MaxVert = MaxVert2;
}
else
{
MaxVert = MaxVert1;
}
}
vert[0].x = GEN_RAND_VERT(MaxVert);
vert[0].y = GEN_RAND_VERT(MaxVert);
vert[0].Red = rand() & 0xffff;
vert[0].Green = rand() & 0xffff;
vert[0].Blue = rand() & 0xffff;
vert[0].Alpha = rand() & 0xffff;
vert[1].x = -vert[0].x;
vert[1].y = -vert[0].y;
vert[1].Red = rand() & 0xffff;
vert[1].Green = rand() & 0xffff;
vert[1].Blue = rand() & 0xffff;
vert[1].Alpha = rand() & 0xffff;
vert[2].x = GEN_RAND_VERT(MaxVert);
vert[2].y = GEN_RAND_VERT(MaxVert);
vert[2].Red = rand() & 0xffff;
vert[2].Green = rand() & 0xffff;
vert[2].Blue = rand() & 0xffff;
vert[2].Alpha = rand() & 0xffff;
vert[3].x = GEN_RAND_VERT(MaxVert);
vert[3].y = GEN_RAND_VERT(MaxVert);
vert[3].Red = rand() & 0xffff;
vert[3].Green = rand() & 0xffff;
vert[3].Blue = rand() & 0xffff;
vert[3].Alpha = rand() & 0xffff;
vert[4].x = GEN_RAND_VERT(MaxVert);
vert[4].y = GEN_RAND_VERT(MaxVert);
vert[4].Red = rand() & 0xffff;
vert[4].Green = rand() & 0xffff;
vert[4].Blue = rand() & 0xffff;
vert[4].Alpha = rand() & 0xffff;
vert[5].x = GEN_RAND_VERT(MaxVert);
vert[5].y = GEN_RAND_VERT(MaxVert);
vert[5].Red = rand() & 0xffff;
vert[5].Green = rand() & 0xffff;
vert[5].Blue = rand() & 0xffff;
vert[5].Alpha = rand() & 0xffff;
GradientFill(hdc,vert,6,(PVOID)gTri,4,GRADIENT_FILL_TRIANGLE);
#if 0
DbgPrint("vTestRandTri:\n\n");
DbgPrint("vTestRandTri:vert[0].x = %li \n",vert[0].x);
DbgPrint("vTestRandTri:vert[0].y = %li \n",vert[0].y);
DbgPrint("vTestRandTri:vert[0].Red = %li \n",vert[0].Red);
DbgPrint("vTestRandTri:vert[0].Green = %li \n",vert[0].Green);
DbgPrint("vTestRandTri:vert[0].Blue = %li \n",vert[0].Blue);
DbgPrint("vTestRandTri:vert[0].Alpha = %li \n",vert[0].Alpha);
DbgPrint("vTestRandTri:vert[1].x = %li \n",vert[1].x);
DbgPrint("vTestRandTri:vert[1].y = %li \n",vert[1].y);
DbgPrint("vTestRandTri:vert[1].Red = %li \n",vert[1].Red);
DbgPrint("vTestRandTri:vert[1].Green = %li \n",vert[1].Green);
DbgPrint("vTestRandTri:vert[1].Blue = %li \n",vert[1].Blue);
DbgPrint("vTestRandTri:vert[1].Alpha = %li \n",vert[1].Alpha);
DbgPrint("vTestRandTri:vert[2].x = %li \n",vert[2].x);
DbgPrint("vTestRandTri:vert[2].y = %li \n",vert[2].y);
DbgPrint("vTestRandTri:vert[2].Red = %li \n",vert[2].Red);
DbgPrint("vTestRandTri:vert[2].Green = %li \n",vert[2].Green);
DbgPrint("vTestRandTri:vert[2].Blue = %li \n",vert[2].Blue);
DbgPrint("vTestRandTri:vert[2].Alpha = %li \n",vert[2].Alpha);
#endif
} while (TRUE);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteObject(hpal);
DeleteObject(hdib);
bThreadActive = FALSE;
}
TRIVERTEX gvert[3] = {
{
10,
10,
0,
0,
0,
0
},
{
1100,
10,
0xff00,
0,
0,
0
},
{
100,
100,
0,
0,
0,
0
}
};
BOOL
APIENTRY GetOptionDlgProc(
HWND hDlg,
unsigned message,
DWORD wParam,
LONG lParam
)
/*++
Routine Description:
Process message for about box, show a dialog box that says what the
name of the program is.
Arguments:
hDlg - window handle of the dialog box
message - type of message
wParam - message-specific information
lParam - message-specific information
Return Value:
status of operation
Revision History:
03-21-91 Initial code
--*/
{
CHAR msg[255];
CHAR EditTextInput[255];
ULONG i;
ULONG TmpInput;
switch (message) {
case WM_INITDIALOG:
wsprintf(msg,"%i",gvert[0].x);
SetDlgItemText(hDlg,IDD_TRI1_X,msg);
wsprintf(msg,"%i",gvert[0].y);
SetDlgItemText(hDlg,IDD_TRI1_Y,msg);
wsprintf(msg,"%i",gvert[0].Red/256);
SetDlgItemText(hDlg,IDD_TRI1_R,msg);
wsprintf(msg,"%i",gvert[0].Green/256);
SetDlgItemText(hDlg,IDD_TRI1_G,msg);
wsprintf(msg,"%i",gvert[0].Blue/256);
SetDlgItemText(hDlg,IDD_TRI1_B,msg);
wsprintf(msg,"%i",gvert[1].x);
SetDlgItemText(hDlg,IDD_TRI2_X,msg);
wsprintf(msg,"%i",gvert[1].y);
SetDlgItemText(hDlg,IDD_TRI2_Y,msg);
wsprintf(msg,"%i",gvert[1].Red/256);
SetDlgItemText(hDlg,IDD_TRI2_R,msg);
wsprintf(msg,"%i",gvert[1].Green/256);
SetDlgItemText(hDlg,IDD_TRI2_G,msg);
wsprintf(msg,"%i",gvert[1].Blue/256);
SetDlgItemText(hDlg,IDD_TRI2_B,msg);
wsprintf(msg,"%i",gvert[2].x);
SetDlgItemText(hDlg,IDD_TRI3_X,msg);
wsprintf(msg,"%i",gvert[2].y);
SetDlgItemText(hDlg,IDD_TRI3_Y,msg);
wsprintf(msg,"%i",gvert[2].Red/256);
SetDlgItemText(hDlg,IDD_TRI3_R,msg);
wsprintf(msg,"%i",gvert[2].Green/256);
SetDlgItemText(hDlg,IDD_TRI3_G,msg);
wsprintf(msg,"%i",gvert[2].Blue/256);
SetDlgItemText(hDlg,IDD_TRI3_B,msg);
return (TRUE);
case WM_COMMAND:
switch(wParam) {
//
// end function
//
case IDOK:
{
ULONG ix;
for (ix = IDD_TRI1_X;ix <= IDD_TRI3_B;ix++)
{
GetDlgItemText(hDlg,ix,EditTextInput,20);
i = sscanf(EditTextInput,"%i",&TmpInput);
if (i == 1)
{
switch (ix)
{
case IDD_TRI1_X:
gvert[0].x = TmpInput;
break;
case IDD_TRI1_Y:
gvert[0].y = TmpInput;
break;
case IDD_TRI1_R:
gvert[0].Red = TmpInput * 256;
break;
case IDD_TRI1_G:
gvert[0].Green = TmpInput * 256;
break;
case IDD_TRI1_B:
gvert[0].Blue = TmpInput * 256;
break;
case IDD_TRI2_X:
gvert[1].x = TmpInput;
break;
case IDD_TRI2_Y:
gvert[1].y = TmpInput;
break;
case IDD_TRI2_R:
gvert[1].Red = TmpInput * 256;
break;
case IDD_TRI2_G:
gvert[1].Green = TmpInput * 256;
break;
case IDD_TRI2_B:
gvert[1].Blue = TmpInput * 256;
break;
case IDD_TRI3_X:
gvert[2].x = TmpInput;
break;
case IDD_TRI3_Y:
gvert[2].y = TmpInput;
break;
case IDD_TRI3_R:
gvert[2].Red = TmpInput * 256;
break;
case IDD_TRI3_G:
gvert[2].Green = TmpInput * 256;
break;
case IDD_TRI3_B:
gvert[2].Blue = TmpInput * 256;
break;
}
}
}
}
EndDialog(hDlg, TRUE);
return (TRUE);
case IDCANCEL:
EndDialog(hDlg, FALSE);
return (TRUE);
//
// change text
//
case IDD_TRI1_X:
case IDD_TRI1_Y:
case IDD_TRI1_R:
case IDD_TRI1_G:
case IDD_TRI1_B:
case IDD_TRI2_X:
case IDD_TRI2_Y:
case IDD_TRI2_R:
case IDD_TRI2_G:
case IDD_TRI2_B:
case IDD_TRI3_X:
case IDD_TRI3_Y:
case IDD_TRI3_R:
case IDD_TRI3_G:
case IDD_TRI3_B:
if (HIWORD(lParam) == EN_CHANGE)
{
EnableWindow(GetDlgItem(hDlg,IDOK),
(BOOL)SendMessage((HWND)(LOWORD(lParam)),
WM_GETTEXTLENGTH,
0,
0L));
}
return(TRUE);
}
break;
}
return (FALSE);
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestInputTri(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{3,4,5}};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
HBITMAP hdib;
PBYTE pDib;
SetStretchBltMode(hdc,HALFTONE);
SetGraphicsMode(hdc,GM_ADVANCED);
//
// clear screen
//
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
FillTransformedRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
DialogBox(hInstMain, (LPSTR)IDD_TRIANGLE_DLG, pCallData->hwnd, (DLGPROC)GetOptionDlgProc);
//
// select and realize palette
//
hpal = CreateHalftonePalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = rect.right;
pbmi->bmiHeader.biHeight = -200;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 32;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
if (hdib == NULL)
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
}
#if 0
vert[0].x = 174 ;
vert[0].y = 10023 ;
vert[0].Red = 4365 ;
vert[0].Green = 18055 ;
vert[0].Blue = 21674 ;
vert[0].Alpha = 12218 ;
vert[1].x = 5802 ;
vert[1].y = -835 ;
vert[1].Red = 19082 ;
vert[1].Green = 26799 ;
vert[1].Blue = 2609 ;
vert[1].Alpha = 9098 ;
vert[2].x = 17644 ;
vert[2].y = 60 ;
vert[2].Red = 4890 ;
vert[2].Green = 7222 ;
vert[2].Blue = 13531 ;
vert[2].Alpha = 7987 ;
vert[0].x = -16777216;
vert[0].y = 10;
vert[0].Red = 0;
vert[0].Green = 0;
vert[0].Blue = 0;
vert[0].Alpha = 0;
vert[1].x = 16777216;
vert[1].y = 10;
vert[1].Red = 0xff00;
vert[1].Green = 0;
vert[1].Blue = 0;
vert[1].Alpha = 0;
vert[2].x = -16777216;
vert[2].y = 20;
vert[2].Red = 0;
vert[2].Green = 0;
vert[2].Blue = 0;
vert[2].Alpha = 0;
#endif
GradientFill(hdc,gvert,3,(PVOID)gTri,1,GRADIENT_FILL_TRIANGLE);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteObject(hpal);
DeleteObject(hdib);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTriDIB32(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{0,2,3}};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
HBITMAP hdib;
PBYTE pDib;
SetStretchBltMode(hdc,COLORONCOLOR);
//
// clear screen
//
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
FillTransformedRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
//
// select and realize palette
//
hpal = CreateHalftonePalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = rect.right;
pbmi->bmiHeader.biHeight = -200;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 32;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
if (hdib == NULL)
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
}
vert[0].x = 10;
vert[0].y = 10;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = 10;
vert[1].Red = 0xc000;
vert[1].Green = 0xc000;
vert[1].Blue = 0xc000;
vert[1].Alpha = 0xc000;
vert[2].x = rect.right-10;
vert[2].y = 30;
vert[2].Red = 0xc000;
vert[2].Green = 0xc000;
vert[2].Blue = 0xc000;
vert[2].Alpha = 0xc000;
vert[3].x = 10;
vert[3].y = 30;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
vert[0].x = 10;
vert[0].y = 40;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x6000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = 40;
vert[1].Red = 0x0000;
vert[1].Green = 0x6000;
vert[1].Blue = 0xf000;
vert[1].Alpha = 0x0000;
vert[2].x = rect.right-10;
vert[2].y = 200-10;
vert[2].Red = 0x0000;
vert[2].Green = 0x6000;
vert[2].Blue = 0xf000;
vert[2].Alpha = 0xf000;
vert[3].x = 10;
vert[3].y = 200-10;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x6000;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,0,0,rect.right,200,hdcm,0,0,rect.right,200,SRCCOPY);
LocalFree(pbmi);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteObject(hpal);
DeleteObject(hdib);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTriDIB8Halftone(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[8] = {{0,1,2},{0,2,3},
{4,5,6},{4,6,7},
{8,9,10},{8,10,11},
{12,13,14},{12,14,15}
};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
HDC hdcm32 = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
PULONG pulColors;
LPPALETTEENTRY pePalette;
HBITMAP hdib,hdib32;
PBYTE pDib,pDib32;
ULONG ulIndex;
HBRUSH hbr = CreateSolidBrush(PALETTERGB(128,128,128));
SetStretchBltMode(hdc,COLORONCOLOR);
//
// get screen dimensions
//
GetClientRect(pCallData->hwnd,&rect);
//
// dib dimensions are screen in x and 1/2 screen in y
//
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom/2;
//
// select and realize palette
//
hpal = CreateHalftonePalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
SelectPalette(hdcm,hpal,TRUE);
RealizePalette(hdcm);
SelectPalette(hdcm32,hpal,TRUE);
RealizePalette(hdcm32);
//
// fill background
//
FillTransformedRect(hdc,&rect,hbr);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pulColors = (PULONG)&pbmi->bmiColors[0];
pePalette = (LPPALETTEENTRY)pulColors;
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = dibRect.right;
pbmi->bmiHeader.biHeight = -dibRect.bottom;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 8;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
GetPaletteEntries(hpal,0,256,pePalette);
for (ulIndex=0;ulIndex<256;ulIndex++)
{
BYTE temp = pePalette[ulIndex].peRed;
pePalette[ulIndex].peRed = pePalette[ulIndex].peBlue;
pePalette[ulIndex].peBlue = temp;
}
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
pbmi->bmiHeader.biBitCount = 32;
hdib32 = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib32,NULL,0);
if ((hdib == NULL) || (hdib32 == NULL))
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
if (SelectObject(hdcm32,hdib32) == NULL)
{
MessageBox(NULL,"error selecting 32 bpp DIB","Error",MB_OK);
}
}
//
// init DIBs
//
FillTransformedRect(hdcm,&dibRect,hbr);
FillTransformedRect(hdcm32,&dibRect,hbr);
//
// draw grey scale and r,g and b scales
//
{
LONG ScaleHeight = (dibRect.bottom -50)/4;
LONG ypos = 10;
//
// grey
//
vert[0].x = 10;
vert[0].y = ypos;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = ypos;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = rect.right-10;
vert[2].y = ypos + ScaleHeight;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = 10;
vert[3].y = ypos + ScaleHeight;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
//
// red
//
vert[4].x = 10;
vert[4].y = ypos;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0x0000;
vert[4].Alpha = 0x0000;
vert[5].x = rect.right-10;
vert[5].y = ypos;
vert[5].Red = 0xff00;
vert[5].Green = 0x0000;
vert[5].Blue = 0x0000;
vert[5].Alpha = 0x0000;
vert[6].x = rect.right-10;
vert[6].y = ypos + ScaleHeight;
vert[6].Red = 0xff00;
vert[6].Green = 0x0000;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0x0000;
vert[7].x = 10;
vert[7].y = ypos + ScaleHeight;
vert[7].Red = 0x0000;
vert[7].Green = 0x0000;
vert[7].Blue = 0x0000;
vert[7].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[8].x = 10;
vert[8].y = ypos;
vert[8].Red = 0x0000;
vert[8].Green = 0x0000;
vert[8].Blue = 0x0000;
vert[8].Alpha = 0x0000;
vert[9].x = rect.right-10;
vert[9].y = ypos;
vert[9].Red = 0x0000;
vert[9].Green = 0xff00;
vert[9].Blue = 0x0000;
vert[9].Alpha = 0x0000;
vert[10].x = rect.right-10;
vert[10].y = ypos + ScaleHeight;
vert[10].Red = 0x0000;
vert[10].Green = 0xff00;
vert[10].Blue = 0x0000;
vert[10].Alpha = 0x0000;
vert[11].x = 10;
vert[11].y = ypos + ScaleHeight;
vert[11].Red = 0x0000;
vert[11].Green = 0x0000;
vert[11].Blue = 0x0000;
vert[11].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[12].x = 10;
vert[12].y = ypos;
vert[12].Red = 0x0000;
vert[12].Green = 0x0000;
vert[12].Blue = 0x0000;
vert[12].Alpha = 0x0000;
vert[13].x = rect.right-10;
vert[13].y = ypos;
vert[13].Red = 0x0000;
vert[13].Green = 0x0000;
vert[13].Blue = 0xff00;
vert[13].Alpha = 0x0000;
vert[14].x = rect.right-10;
vert[14].y = ypos + ScaleHeight;
vert[14].Red = 0x0000;
vert[14].Green = 0x0000;
vert[14].Blue = 0xff00;
vert[14].Alpha = 0x0000;
vert[15].x = 10;
vert[15].y = ypos + ScaleHeight;
vert[15].Red = 0x0000;
vert[15].Green = 0x0000;
vert[15].Blue = 0x0000;
vert[15].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
GradientFill(hdcm ,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcm32,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,0,0,rect.right,dibRect.bottom,hdcm,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,0,dibRect.bottom,rect.right,dibRect.bottom,hdcm32,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,COLORONCOLOR);
}
DeleteObject(hbr);
LocalFree(pbmi);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteDC(hdcm32);
DeleteObject(hpal);
DeleteObject(hdib);
DeleteObject(hdib32);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTriDIB8DefPal(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[8] = {{0,1,2},{0,2,3},
{4,5,6},{4,6,7},
{8,9,10},{8,10,11},
{12,13,14},{12,14,15}
};
TRIVERTEX vert[32];
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
HDC hdcm32 = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
PULONG pulColors;
LPPALETTEENTRY pePalette;
HBITMAP hdib,hdib32;
PBYTE pDib,pDib32;
ULONG ulIndex;
HBRUSH hbr = CreateSolidBrush(PALETTERGB(128,128,128));
SetStretchBltMode(hdc,COLORONCOLOR);
//
// get screen dimensions
//
GetClientRect(pCallData->hwnd,&rect);
//
// dib dimensions are screen in x and 1/2 screen in y
//
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom/2;
//
// fill background
//
FillTransformedRect(hdc,&rect,hbr);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
if (pbmi)
{
pulColors = (PULONG)&pbmi->bmiColors[0];
pePalette = (LPPALETTEENTRY)pulColors;
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = dibRect.right;
pbmi->bmiHeader.biHeight = -dibRect.bottom;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 8;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 16;
pbmi->bmiHeader.biClrImportant = 0;
UINT uiRet = GetPaletteEntries((HPALETTE)GetStockObject(DEFAULT_PALETTE),0,16,pePalette);
if (uiRet == 16)
{
for (ulIndex=0;ulIndex<16;ulIndex++)
{
BYTE temp = pePalette[ulIndex].peRed;
pePalette[ulIndex].peRed = pePalette[ulIndex].peBlue;
pePalette[ulIndex].peBlue = temp;
}
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
pbmi->bmiHeader.biBitCount = 32;
hdib32 = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib32,NULL,0);
if ((hdib == NULL) || (hdib32 == NULL))
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
if (SelectObject(hdcm32,hdib32) == NULL)
{
MessageBox(NULL,"error selecting 32 bpp DIB","Error",MB_OK);
}
}
//
// init DIBs
//
FillTransformedRect(hdcm,&dibRect,hbr);
FillTransformedRect(hdcm32,&dibRect,hbr);
//
// draw grey scale and r,g and b scales
//
{
LONG ScaleHeight = (dibRect.bottom -50)/4;
LONG ypos = 10;
//
// grey
//
vert[0].x = 10;
vert[0].y = ypos;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = ypos;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = rect.right-10;
vert[2].y = ypos + ScaleHeight;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = 10;
vert[3].y = ypos + ScaleHeight;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
//
// red
//
vert[4].x = 10;
vert[4].y = ypos;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0x0000;
vert[4].Alpha = 0x0000;
vert[5].x = rect.right-10;
vert[5].y = ypos;
vert[5].Red = 0xff00;
vert[5].Green = 0x0000;
vert[5].Blue = 0x0000;
vert[5].Alpha = 0x0000;
vert[6].x = rect.right-10;
vert[6].y = ypos + ScaleHeight;
vert[6].Red = 0xff00;
vert[6].Green = 0x0000;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0x0000;
vert[7].x = 10;
vert[7].y = ypos + ScaleHeight;
vert[7].Red = 0x0000;
vert[7].Green = 0x0000;
vert[7].Blue = 0x0000;
vert[7].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[8].x = 10;
vert[8].y = ypos;
vert[8].Red = 0x0000;
vert[8].Green = 0x0000;
vert[8].Blue = 0x0000;
vert[8].Alpha = 0x0000;
vert[9].x = rect.right-10;
vert[9].y = ypos;
vert[9].Red = 0x0000;
vert[9].Green = 0xff00;
vert[9].Blue = 0x0000;
vert[9].Alpha = 0x0000;
vert[10].x = rect.right-10;
vert[10].y = ypos + ScaleHeight;
vert[10].Red = 0x0000;
vert[10].Green = 0xff00;
vert[10].Blue = 0x0000;
vert[10].Alpha = 0x0000;
vert[11].x = 10;
vert[11].y = ypos + ScaleHeight;
vert[11].Red = 0x0000;
vert[11].Green = 0x0000;
vert[11].Blue = 0x0000;
vert[11].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[12].x = 10;
vert[12].y = ypos;
vert[12].Red = 0x0000;
vert[12].Green = 0x0000;
vert[12].Blue = 0x0000;
vert[12].Alpha = 0x0000;
vert[13].x = rect.right-10;
vert[13].y = ypos;
vert[13].Red = 0x0000;
vert[13].Green = 0x0000;
vert[13].Blue = 0xff00;
vert[13].Alpha = 0x0000;
vert[14].x = rect.right-10;
vert[14].y = ypos + ScaleHeight;
vert[14].Red = 0x0000;
vert[14].Green = 0x0000;
vert[14].Blue = 0xff00;
vert[14].Alpha = 0x0000;
vert[15].x = 10;
vert[15].y = ypos + ScaleHeight;
vert[15].Red = 0x0000;
vert[15].Green = 0x0000;
vert[15].Blue = 0x0000;
vert[15].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
GradientFill(hdcm ,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcm32,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,0,0,rect.right,dibRect.bottom,hdcm,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,0,dibRect.bottom,rect.right,dibRect.bottom,hdcm32,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,COLORONCOLOR);
}
}
LocalFree(pbmi);
}
DeleteObject(hbr);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteDC(hdcm32);
DeleteObject(hdib);
DeleteObject(hdib32);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTriDIB4(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[8] = {{0,1,2},{0,2,3},
{4,5,6},{4,6,7},
{8,9,10},{8,10,11},
{12,13,14},{12,14,15}
};
TRIVERTEX vert[32];
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
HDC hdcm32 = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
PULONG pulColors;
LPPALETTEENTRY pePalette;
HBITMAP hdib,hdib32;
PBYTE pDib,pDib32;
ULONG ulIndex;
HBRUSH hbr = CreateSolidBrush(PALETTERGB(128,128,128));
SetStretchBltMode(hdc,COLORONCOLOR);
//
// get screen dimensions
//
GetClientRect(pCallData->hwnd,&rect);
//
// dib dimensions are screen in x and 1/2 screen in y
//
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom/2;
//
// fill background
//
FillTransformedRect(hdc,&rect,hbr);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pulColors = (PULONG)&pbmi->bmiColors[0];
pePalette = (LPPALETTEENTRY)pulColors;
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = dibRect.right;
pbmi->bmiHeader.biHeight = -dibRect.bottom;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 4;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
GetSystemPaletteEntries(hdc,0,256,pePalette);
for (ulIndex=0;ulIndex<8;ulIndex++)
{
BYTE temp = pePalette[ulIndex].peRed;
pePalette[ulIndex].peRed = pePalette[ulIndex].peBlue;
pePalette[ulIndex].peBlue = temp;
pePalette[8 + ulIndex].peGreen = pePalette[255-ulIndex].peGreen;
pePalette[8 + ulIndex].peRed = pePalette[255-ulIndex].peBlue;
pePalette[8 + ulIndex].peBlue = pePalette[255-ulIndex].peRed;
}
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
pbmi->bmiHeader.biBitCount = 32;
hdib32 = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib32,NULL,0);
if ((hdib == NULL) || (hdib32 == NULL))
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
if (SelectObject(hdcm32,hdib32) == NULL)
{
MessageBox(NULL,"error selecting 32 bpp DIB","Error",MB_OK);
}
}
//
// init DIBs
//
FillTransformedRect(hdcm,&dibRect,hbr);
FillTransformedRect(hdcm32,&dibRect,hbr);
//
// draw grey scale and r,g and b scales
//
{
LONG ScaleHeight = (dibRect.bottom -50)/4;
LONG ypos = 10;
//
// grey
//
vert[0].x = 10;
vert[0].y = ypos;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = ypos;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = rect.right-10;
vert[2].y = ypos + ScaleHeight;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = 10;
vert[3].y = ypos + ScaleHeight;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
//
// red
//
vert[4].x = 10;
vert[4].y = ypos;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0x0000;
vert[4].Alpha = 0x0000;
vert[5].x = rect.right-10;
vert[5].y = ypos;
vert[5].Red = 0xff00;
vert[5].Green = 0x0000;
vert[5].Blue = 0x0000;
vert[5].Alpha = 0x0000;
vert[6].x = rect.right-10;
vert[6].y = ypos + ScaleHeight;
vert[6].Red = 0xff00;
vert[6].Green = 0x0000;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0x0000;
vert[7].x = 10;
vert[7].y = ypos + ScaleHeight;
vert[7].Red = 0x0000;
vert[7].Green = 0x0000;
vert[7].Blue = 0x0000;
vert[7].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[8].x = 10;
vert[8].y = ypos;
vert[8].Red = 0x0000;
vert[8].Green = 0x0000;
vert[8].Blue = 0x0000;
vert[8].Alpha = 0x0000;
vert[9].x = rect.right-10;
vert[9].y = ypos;
vert[9].Red = 0x0000;
vert[9].Green = 0xff00;
vert[9].Blue = 0x0000;
vert[9].Alpha = 0x0000;
vert[10].x = rect.right-10;
vert[10].y = ypos + ScaleHeight;
vert[10].Red = 0x0000;
vert[10].Green = 0xff00;
vert[10].Blue = 0x0000;
vert[10].Alpha = 0x0000;
vert[11].x = 10;
vert[11].y = ypos + ScaleHeight;
vert[11].Red = 0x0000;
vert[11].Green = 0x0000;
vert[11].Blue = 0x0000;
vert[11].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[12].x = 10;
vert[12].y = ypos;
vert[12].Red = 0x0000;
vert[12].Green = 0x0000;
vert[12].Blue = 0x0000;
vert[12].Alpha = 0x0000;
vert[13].x = rect.right-10;
vert[13].y = ypos;
vert[13].Red = 0x0000;
vert[13].Green = 0x0000;
vert[13].Blue = 0xff00;
vert[13].Alpha = 0x0000;
vert[14].x = rect.right-10;
vert[14].y = ypos + ScaleHeight;
vert[14].Red = 0x0000;
vert[14].Green = 0x0000;
vert[14].Blue = 0xff00;
vert[14].Alpha = 0x0000;
vert[15].x = 10;
vert[15].y = ypos + ScaleHeight;
vert[15].Red = 0x0000;
vert[15].Green = 0x0000;
vert[15].Blue = 0x0000;
vert[15].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
GradientFill(hdcm ,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcm32,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,0,0,rect.right,dibRect.bottom,hdcm,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,0,dibRect.bottom,rect.right,dibRect.bottom,hdcm32,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,COLORONCOLOR);
}
DeleteObject(hbr);
LocalFree(pbmi);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteDC(hdcm32);
DeleteObject(hdib);
DeleteObject(hdib32);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTriDIB1(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[8] = {{0,1,2},{0,2,3},
{4,5,6},{4,6,7},
{8,9,10},{8,10,11},
{12,13,14},{12,14,15}
};
TRIVERTEX vert[32];
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
HDC hdcm32 = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
PULONG pulColors;
LPPALETTEENTRY pePalette;
HBITMAP hdib,hdib32;
PBYTE pDib,pDib32;
ULONG ulIndex;
HBRUSH hbr = CreateSolidBrush(PALETTERGB(128,128,128));
SetStretchBltMode(hdc,COLORONCOLOR);
//
// get screen dimensions
//
GetClientRect(pCallData->hwnd,&rect);
//
// dib dimensions are screen in x and 1/2 screen in y
//
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom/2;
//
// fill background
//
FillTransformedRect(hdc,&rect,hbr);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pulColors = (PULONG)&pbmi->bmiColors[0];
pePalette = (LPPALETTEENTRY)pulColors;
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = dibRect.right;
pbmi->bmiHeader.biHeight = -dibRect.bottom;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 1;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
pePalette[0].peGreen = 0x00;
pePalette[0].peRed = 0x00;
pePalette[0].peBlue = 0x00;
pePalette[0].peFlags = 0x00;
pePalette[1].peGreen = 0xff;
pePalette[1].peRed = 0xff;
pePalette[1].peBlue = 0xff;
pePalette[1].peFlags = 0x00;
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
pbmi->bmiHeader.biBitCount = 32;
hdib32 = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib32,NULL,0);
if ((hdib == NULL) || (hdib32 == NULL))
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
if (SelectObject(hdcm32,hdib32) == NULL)
{
MessageBox(NULL,"error selecting 32 bpp DIB","Error",MB_OK);
}
}
//
// init DIBs
//
FillTransformedRect(hdcm,&dibRect,hbr);
FillTransformedRect(hdcm32,&dibRect,hbr);
//
// draw grey scale and r,g and b scales
//
{
LONG ScaleHeight = (dibRect.bottom -50)/4;
LONG ypos = 10;
//
// grey
//
vert[0].x = 10;
vert[0].y = ypos;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = ypos;
vert[1].Red = 0xff00;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = rect.right-10;
vert[2].y = ypos + ScaleHeight;
vert[2].Red = 0xff00;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = 10;
vert[3].y = ypos + ScaleHeight;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
//
// red
//
vert[4].x = 10;
vert[4].y = ypos;
vert[4].Red = 0x0000;
vert[4].Green = 0x0000;
vert[4].Blue = 0x0000;
vert[4].Alpha = 0x0000;
vert[5].x = rect.right-10;
vert[5].y = ypos;
vert[5].Red = 0xff00;
vert[5].Green = 0xff00;
vert[5].Blue = 0x0000;
vert[5].Alpha = 0x0000;
vert[6].x = rect.right-10;
vert[6].y = ypos + ScaleHeight;
vert[6].Red = 0xff00;
vert[6].Green = 0xff00;
vert[6].Blue = 0x0000;
vert[6].Alpha = 0x0000;
vert[7].x = 10;
vert[7].y = ypos + ScaleHeight;
vert[7].Red = 0x0000;
vert[7].Green = 0x0000;
vert[7].Blue = 0x0000;
vert[7].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[8].x = 10;
vert[8].y = ypos;
vert[8].Red = 0x0000;
vert[8].Green = 0x0000;
vert[8].Blue = 0x0000;
vert[8].Alpha = 0x0000;
vert[9].x = rect.right-10;
vert[9].y = ypos;
vert[9].Red = 0x0000;
vert[9].Green = 0xff00;
vert[9].Blue = 0x0000;
vert[9].Alpha = 0x0000;
vert[10].x = rect.right-10;
vert[10].y = ypos + ScaleHeight;
vert[10].Red = 0x0000;
vert[10].Green = 0xff00;
vert[10].Blue = 0x0000;
vert[10].Alpha = 0x0000;
vert[11].x = 10;
vert[11].y = ypos + ScaleHeight;
vert[11].Red = 0x0000;
vert[11].Green = 0x0000;
vert[11].Blue = 0x0000;
vert[11].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
vert[12].x = 10;
vert[12].y = ypos;
vert[12].Red = 0x0000;
vert[12].Green = 0x0000;
vert[12].Blue = 0x0000;
vert[12].Alpha = 0x0000;
vert[13].x = rect.right-10;
vert[13].y = ypos;
vert[13].Red = 0x0000;
vert[13].Green = 0x0000;
vert[13].Blue = 0xff00;
vert[13].Alpha = 0x0000;
vert[14].x = rect.right-10;
vert[14].y = ypos + ScaleHeight;
vert[14].Red = 0x0000;
vert[14].Green = 0x0000;
vert[14].Blue = 0xff00;
vert[14].Alpha = 0x0000;
vert[15].x = 10;
vert[15].y = ypos + ScaleHeight;
vert[15].Red = 0x0000;
vert[15].Green = 0x0000;
vert[15].Blue = 0x0000;
vert[15].Alpha = 0x0000;
ypos += (10 + ScaleHeight);
GradientFill(hdcm ,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcm32,vert,16,(PVOID)gTri,8,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,0,0,rect.right,dibRect.bottom,hdcm,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,0,dibRect.bottom,rect.right,dibRect.bottom,hdcm32,0,0,rect.right,dibRect.bottom,SRCCOPY);
SetStretchBltMode(hdc,COLORONCOLOR);
}
DeleteObject(hbr);
LocalFree(pbmi);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteDC(hdcm32);
DeleteObject(hdib);
DeleteObject(hdib32);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTriDIB16565(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{0,2,3}};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
HBITMAP hdib;
PBYTE pDib;
SetStretchBltMode(hdc,COLORONCOLOR);
//
// clear screen
//
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
FillTransformedRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
//
// select and realize palette
//
hpal = CreateHalftonePalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 3 * sizeof(ULONG));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = rect.right;
pbmi->bmiHeader.biHeight = -200;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 16;
pbmi->bmiHeader.biCompression = BI_BITFIELDS;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
{
PULONG pbitfields = (PULONG)&pbmi->bmiColors[0];
pbitfields[0] = 0xf800;
pbitfields[1] = 0x07e0;
pbitfields[2] = 0x001f;
}
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
if (hdib == NULL)
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
}
vert[0].x = 10;
vert[0].y = 10;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = 10;
vert[1].Red = 0xc000;
vert[1].Green = 0xc000;
vert[1].Blue = 0xc000;
vert[1].Alpha = 0xc000;
vert[2].x = rect.right-10;
vert[2].y = 30;
vert[2].Red = 0xc000;
vert[2].Green = 0xc000;
vert[2].Blue = 0xc000;
vert[2].Alpha = 0xc000;
vert[3].x = 10;
vert[3].y = 30;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
vert[0].x = 10;
vert[0].y = 40;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x6000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = 40;
vert[1].Red = 0x0000;
vert[1].Green = 0x6000;
vert[1].Blue = 0xf000;
vert[1].Alpha = 0x0000;
vert[2].x = rect.right-10;
vert[2].y = 200-10;
vert[2].Red = 0x0000;
vert[2].Green = 0x6000;
vert[2].Blue = 0xf000;
vert[2].Alpha = 0xf000;
vert[3].x = 10;
vert[3].y = 200-10;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x6000;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,0,0,rect.right,200,hdcm,0,0,rect.right,200,SRCCOPY);
LocalFree(pbmi);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteObject(hpal);
DeleteObject(hdib);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 18-Jul-1996 -by- Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestTriDIB16555(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{0,2,3}};
TRIVERTEX vert[32];
HPALETTE hpal;
RECT rect;
RECT dibRect;
HDC hdcm = CreateCompatibleDC(hdc);
PBITMAPINFO pbmi;
HBITMAP hdib;
PBYTE pDib;
SetStretchBltMode(hdc,COLORONCOLOR);
SetGraphicsMode(hdc,GM_ADVANCED);
//
// clear screen
//
GetClientRect(pCallData->hwnd,&rect);
dibRect.left = 0;
dibRect.right = rect.right;
dibRect.top = 0;
dibRect.bottom = rect.bottom;
FillTransformedRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
//
// select and realize palette
//
hpal = CreateHalftonePalette(hdc);
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// create temp DIB
//
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 3 * sizeof(ULONG));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = rect.right;
pbmi->bmiHeader.biHeight = -200;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 16;
pbmi->bmiHeader.biCompression = BI_BITFIELDS;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
{
PULONG pbitfields = (PULONG)&pbmi->bmiColors[0];
pbitfields[0] = 0x7c00;
pbitfields[1] = 0x03e0;
pbitfields[2] = 0x001f;
}
hdib = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDib,NULL,0);
if (hdib == NULL)
{
MessageBox(NULL,"error Creating DIB","Error",MB_OK);
}
else
{
if (SelectObject(hdcm,hdib) == NULL)
{
MessageBox(NULL,"error selecting DIB","Error",MB_OK);
}
}
vert[0].x = 10;
vert[0].y = 10;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = 10;
vert[1].Red = 0xc000;
vert[1].Green = 0xc000;
vert[1].Blue = 0xc000;
vert[1].Alpha = 0xc000;
vert[2].x = rect.right-10;
vert[2].y = 30;
vert[2].Red = 0xc000;
vert[2].Green = 0xc000;
vert[2].Blue = 0xc000;
vert[2].Alpha = 0xc000;
vert[3].x = 10;
vert[3].y = 30;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
vert[0].x = 10;
vert[0].y = 40;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x6000;
vert[0].Alpha = 0x0000;
vert[1].x = rect.right-10;
vert[1].y = 40;
vert[1].Red = 0x0000;
vert[1].Green = 0x6000;
vert[1].Blue = 0xf000;
vert[1].Alpha = 0x0000;
vert[2].x = rect.right-10;
vert[2].y = 200-10;
vert[2].Red = 0x0000;
vert[2].Green = 0x6000;
vert[2].Blue = 0xf000;
vert[2].Alpha = 0xf000;
vert[3].x = 10;
vert[3].y = 200-10;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0x6000;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
StretchBlt(hdc,0,0,rect.right,200,hdcm,0,0,rect.right,200,SRCCOPY);
LocalFree(pbmi);
ReleaseDC(pCallData->hwnd,hdc);
DeleteDC(hdcm);
DeleteObject(hpal);
DeleteObject(hdib);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
* vDrawMetafile
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 9/19/1996 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vDrawMetafile(
HDC hdc,
HDC hdcm
)
{
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{0,2,3}};
TRIVERTEX vert[4];
//
// draw using alpha and shading APIs
//
vert[0].x = 10;
vert[0].y = 10;
vert[0].Red = 0x4000;
vert[0].Green = 0x8000;
vert[0].Blue = 0xc000;
vert[0].Alpha = 0xff00;
vert[1].x = 390;
vert[1].y = 10;
vert[1].Red = 0xc000;
vert[1].Green = 0x8000;
vert[1].Blue = 0x4000;
vert[1].Alpha = 0xff00;
vert[2].x = 390;
vert[2].y = 390;
vert[2].Red = 0x0000;
vert[2].Green = 0x0000;
vert[2].Blue = 0x0000;
vert[2].Alpha = 0xff00;
vert[3].x = 10;
vert[3].y = 390;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0xff00;
PatBlt(hdcm,000,000,400,400,BLACKNESS);
GradientFill(hdcm,vert,6,(PVOID)gTri,2,GRADIENT_FILL_TRIANGLE);
//
// alpha blending
//
{
PBITMAPINFO pbmi;
HBITMAP hdibA;
HDC hdcA = CreateCompatibleDC(hdc);
PULONG pDibA;
BLENDFUNCTION BlendFunction;
pbmi = (PBITMAPINFO)LocalAlloc(0,sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = 128;
pbmi->bmiHeader.biHeight = -128;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 32;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
pbmi->bmiHeader.biYPelsPerMeter = 0;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
hdibA = CreateDIBSection(hdc,pbmi,DIB_RGB_COLORS,(VOID **)&pDibA,NULL,0);
BlendFunction.BlendOp = AC_SRC_OVER;
BlendFunction.BlendFlags = 0;
BlendFunction.SourceConstantAlpha = 128;
//
// init 32 bpp dib
//
{
PULONG ptmp = pDibA;
ULONG ux,uy;
for (uy=0;uy<128;uy++)
{
for (ux=0;ux<128;ux++)
{
BYTE blue = (ux*2);
BYTE green = (uy*2);
BYTE red = 0;
BYTE alpha = 0xff;
*ptmp++ = (alpha << 24) | (red << 16) | (green << 8) | (blue);
}
}
*((PULONG)pDibA) = 0x80800000;
ptmp = (PULONG)((PBYTE)pDibA + 32 * (128 *4));
for (uy=32;uy<42;uy++)
{
for (ux=0;ux<128;ux++)
{
*ptmp++ = 0x80800000;
}
}
}
HPALETTE hpal = CreateHalftonePalette(hdc);
SelectObject(hdcA,hdibA);
HPALETTE hpalOld = SelectPalette(hdcm,hpal,FALSE);
SelectPalette(hdcA,hpal,FALSE);
RealizePalette(hdcm);
RealizePalette(hdcA);
AlphaBlend(hdcm,100,100,128,128,hdcA, 0,0,128,128,BlendFunction);
BitBlt(hdcm,100,250,128,128,hdcA,0,0,SRCCOPY);
AlphaBlend(hdcm,250,250,128,128,hdcA, 0,0,128,128,BlendFunction);
{
RECT rcl = {10,60,100,100};
DrawTextExW(hdcm,L"Fred",4,&rcl,0,NULL);
}
DeleteDC(hdcA);
DeleteObject(hdibA);
SelectPalette(hdcm,hpalOld,TRUE);
DeleteObject(hpal);
LocalFree(pbmi);
}
}
/******************************Public*Routine******************************\
* vCreateMetaFile
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 9/19/1996 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vCreateMetaFile(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HDC hdcm;
RECT rcl;
ULONG ypos = 0;
ULONG xpos = 0;
LPCTSTR lpFilename = "MetaBlend.EMF";
LPCTSTR lpDescription = "Alpha Blending test metafile";
GetClientRect(pCallData->hwnd,&rcl);
FillTransformedRect(hdc,&rcl,(HBRUSH)GetStockObject(GRAY_BRUSH));
SetTextColor(hdc,0);
SetBkMode(hdc,TRANSPARENT);
//
// Create metafile DC
//
hdcm = CreateEnhMetaFile(hdc,lpFilename,NULL,lpDescription);
if (hdcm != NULL)
{
vDrawMetafile(hdc,hdcm);
vDrawMetafile(hdc,hdc);
{
HENHMETAFILE hemf = CloseEnhMetaFile(hdcm);
if (hemf)
{
PCHAR pstr = "Metafile creation successful";
DeleteEnhMetaFile(hemf);
TextOut(hdc,10,10,pstr,strlen(pstr));
}
else
{
MessageBox(NULL,"Error closing metafile","Error",MB_OK);
}
}
}
else
{
MessageBox(NULL,"Error creating metafile","Error",MB_OK);
}
ReleaseDC(pCallData->hwnd,hdc);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
* vPlayMetaFile
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 12/4/1996 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vPlayMetaFile(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
RECT rcl;
ULONG ypos = 0;
ULONG xpos = 0;
LPCTSTR lpFilename = "MetaBlend.EMF";
LPCTSTR lpDescription = "Alpha Blending test metafile";
HENHMETAFILE hemf;
GetClientRect(pCallData->hwnd,&rcl);
FillTransformedRect(hdc,&rcl,(HBRUSH)GetStockObject(GRAY_BRUSH));
SetTextColor(hdc,0);
SetBkMode(hdc,TRANSPARENT);
hemf = GetEnhMetaFile(lpFilename);
if (hemf)
{
rcl.left = 0;
rcl.top = 0;
rcl.right = 16;
rcl.bottom = 16;
PlayEnhMetaFile(hdc,hemf,&rcl);
rcl.left = 16;
rcl.top = 16;
rcl.right = 80;
rcl.bottom = 80;
PlayEnhMetaFile(hdc,hemf,&rcl);
rcl.left = 100;
rcl.top = 0;
rcl.right = 500;
rcl.bottom = 400;
PlayEnhMetaFile(hdc,hemf,&rcl);
DeleteEnhMetaFile(hemf);
}
ReleaseDC(pCallData->hwnd,hdc);
bThreadActive = FALSE;
}
/******************************Public*Routine******************************\
* vTestRASDD
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 9/19/1996 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestRASDD(
TEST_CALL_DATA *pCallData
)
{
HDC hdcScreen = GetDCAndTransform(pCallData->hwnd);
HDC hdcPrn;
RECT rcl;
ULONG ypos = 0;
ULONG xpos = 0;
LPCTSTR lpPrinterName = "HP Color";
DOCINFO docInfo = {sizeof(DOCINFO),
"Doc1",
NULL
};
hdcPrn = CreateDC(NULL,lpPrinterName,NULL,NULL);
if (hdcPrn == NULL)
{
MessageBox(NULL,"Couldn't create DC",lpPrinterName,MB_OK);
}
else
{
LONG iJobID = StartDoc(hdcPrn,&docInfo);
if (iJobID == SP_ERROR)
{
MessageBox(NULL,"StartDoc fails","error",MB_OK);
}
else
{
LONG iRet = StartPage(hdcPrn);
if (iRet == SP_ERROR)
{
MessageBox(NULL,"StartPage fails","error",MB_OK);
}
else
{
ULONG ulIndex = 0;
HBITMAP hbmPrn1 = hCreateAlphaStretchBitmap(hdcPrn,ulBpp[ulIndex],ulFor[ulIndex],600,600);
HDC hdcPrnMem1 = CreateCompatibleDC(hdcPrn);
HBITMAP hbmPrn2 = hCreateAlphaStretchBitmap(hdcPrn,ulBpp[ulIndex],ulFor[ulIndex],600,600);
HDC hdcPrnMem2 = CreateCompatibleDC(hdcPrn);
HBITMAP hbm1 = CreateCompatibleBitmap(hdcScreen,600,600);
HDC hdcScreenMem = CreateCompatibleDC(hdcScreen);
GRADIENT_TRIANGLE gTri[2] = {{0,1,2},{3,4,5}};
GRADIENT_RECT gRect[2] = {{0,1},{2,3}};
TRIVERTEX vert[6];
//
// draw using alpha and shading APIs
//
POINT pos = {300,300};
double fr = 300.0;
double fTheta = 0.0;
double fdTheta = 0.05;
SelectObject(hdcPrnMem1,hbmPrn1);
SelectObject(hdcPrnMem2,hbmPrn2);
SelectObject(hdcScreenMem,hbm1);
PatBlt(hdcPrnMem1,0,0,5000,5000,0xff0000);
PatBlt(hdcPrnMem2,0,0,5000,5000,0xff0000);
PatBlt(hdcScreenMem,0,0,5000,5000,0xff0000);
PatBlt(hdcScreen,0,0,5000,5000,0xff0000);
PatBlt(hdcPrn,0,0,5000,5000,0xff0000);
//
// fill visible area with gradient
//
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0x8000;
vert[0].Green = 0x8000;
vert[0].Blue = 0x8000;
vert[0].Alpha = 0x0000;
vert[1].x = 900;
vert[1].y = 900;
vert[1].Red = 0xc000;
vert[1].Green = 0xc000;
vert[1].Blue = 0xc000;
vert[1].Alpha = 0x0000;
GradientFill(hdcScreen ,vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
GradientFill(hdcPrn ,vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
GradientFill(hdcPrnMem1 ,vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
GradientFill(hdcPrnMem2 ,vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
GradientFill(hdcScreenMem,vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
vert[0].x = 200;
vert[0].y = 200;
vert[0].Red = 0x1000;
vert[0].Green = 0x1000;
vert[0].Blue = 0x1000;
vert[0].Alpha = 0x0000;
vert[1].x = 300;
vert[1].y = 700;
vert[1].Red = 0x2000;
vert[1].Green = 0x2000;
vert[1].Blue = 0x2000;
vert[1].Alpha = 0x0000;
vert[2].x = 140;
vert[2].y = 420;
vert[2].Red = 0x1500;
vert[2].Green = 0x1500;
vert[2].Blue = 0x1500;
vert[2].Alpha = 0x0000;
vert[3].x = 200;
vert[3].y = 200;
vert[3].Red = 0x1000;
vert[3].Green = 0x1000;
vert[3].Blue = 0x1000;
vert[3].Alpha = 0x0000;
vert[4].x = 100;
vert[4].y = 700;
vert[4].Red = 0x2000;
vert[4].Green = 0x2000;
vert[4].Blue = 0x2000;
vert[4].Alpha = 0x0000;
vert[5].x = 260;
vert[5].y = 420;
vert[5].Red = 0x1500;
vert[5].Green = 0x1500;
vert[5].Blue = 0x1500;
vert[5].Alpha = 0x0000;
GradientFill(hdcScreen,vert,6,&gTri,2,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcPrn,vert,6,&gTri,2,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcPrnMem1,vert,6,&gTri,2,GRADIENT_FILL_TRIANGLE);
Sleep(2000);
//
// draw gradient circle in memory
//
vert[0].x = pos.x;
vert[0].y = pos.y;
vert[0].Red = 0x6000;
vert[0].Green = 0x6000;
vert[0].Blue = 0x6000;
vert[0].Alpha = 0x0000;
vert[1].Red = 0xcf00;
vert[1].Green = 0xcf00;
vert[1].Blue = 0xcf00;
vert[1].Alpha = 0x0000;
vert[2].Red = 0xcf00;
vert[2].Green = 0xcf00;
vert[2].Blue = 0xcf00;
vert[2].Alpha = 0x0000;
fTheta = 0;
double fLimit = (2.0 * fdTheta) * 4.0;
while (fTheta < (2.0 * 3.14159265))
{
vert[0].x = pos.x;
vert[0].y = pos.y;
vert[1].x = (LONG)(pos.x + fr * cos(fTheta));
vert[1].y = (LONG)(pos.y + fr * sin(fTheta));
fTheta += fdTheta;
vert[2].x = (LONG)(pos.x + fr * cos(fTheta));
vert[2].y = (LONG)(pos.y + fr * sin(fTheta));
GradientFill(hdcPrnMem2 ,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
GradientFill(hdcScreenMem,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
vert[0].x *= 2;
vert[0].y = 2 * vert[0].y + 2000;
vert[1].x *= 2;
vert[1].y = 2 * vert[1].y + 2000;
vert[2].x *= 2;
vert[2].y = 2 * vert[2].y + 2000;
GradientFill(hdcPrn,vert,3,&gTri,1,GRADIENT_FILL_TRIANGLE);
}
//
// blend alpha over data (0/1 in 1bpp)
//
{
BLENDFUNCTION BlendFunction;
BlendFunction.BlendOp = AC_SRC_OVER;
BlendFunction.BlendFlags = 0;
BlendFunction.AlphaFormat = 0;
//
// blend printer data
//
SetStretchBltMode(hdcScreen,HALFTONE);
SetStretchBltMode(hdcPrn,HALFTONE);
BlendFunction.SourceConstantAlpha = 0x10;
AlphaBlend(hdcPrnMem1,0,0,600,600,hdcPrnMem2,0,0,600,600,BlendFunction);
StretchBlt(hdcPrn,1000,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
Sleep(1000);
BlendFunction.SourceConstantAlpha = 0x40;
AlphaBlend(hdcPrnMem1,0,0,600,600,hdcPrnMem2,0,0,600,600,BlendFunction);
StretchBlt(hdcPrn,2000,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
Sleep(1000);
BlendFunction.SourceConstantAlpha = 0x70;
AlphaBlend(hdcPrnMem1,0,0,600,600,hdcPrnMem2,0,0,600,600,BlendFunction);
StretchBlt(hdcPrn,3000,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
Sleep(1000);
BlendFunction.SourceConstantAlpha = 0xa0;
AlphaBlend(hdcPrnMem1,0,0,600,600,hdcPrnMem2,0,0,600,600,BlendFunction);
StretchBlt(hdcPrn,4000,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
Sleep(1000);
BlendFunction.SourceConstantAlpha = 0xc0;
AlphaBlend(hdcPrnMem1,0,0,600,600,hdcPrnMem2,0,0,600,600,BlendFunction);
StretchBlt(hdcPrn,0000,1000,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
Sleep(1000);
BlendFunction.SourceConstantAlpha = 0xe0;
AlphaBlend(hdcPrnMem1,0,0,600,600,hdcPrnMem2,0,0,600,600,BlendFunction);
StretchBlt(hdcPrn,1000,1000,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
Sleep(1000);
BlendFunction.SourceConstantAlpha = 0xfe;
AlphaBlend(hdcPrnMem1,0,0,600,600,hdcPrnMem2,0,0,600,600,BlendFunction);
StretchBlt(hdcPrn,2000,1000,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem1,0,0,900,900,SRCCOPY);
Sleep(1000);
StretchBlt(hdcPrn,30000,1000,900,900,hdcPrnMem2,0,0,900,900,SRCCOPY);
StretchBlt(hdcScreen,0,0,900,900,hdcPrnMem2,0,0,900,900,SRCCOPY);
}
DeleteDC(hdcPrnMem1);
DeleteDC(hdcPrnMem2);
DeleteObject(hbmPrn1);
DeleteObject(hbmPrn2);
DeleteDC(hdcScreenMem);
DeleteObject(hbm1);
EndPage(hdcPrn);
}
EndDoc(hdcPrn);
}
DeleteDC(hdcPrn);
}
ReleaseDC(pCallData->hwnd,hdcScreen);
bThreadActive = FALSE;
}
VOID
vTestTranPrint(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HDC hdcm;
RECT rcl;
ULONG ypos = 0;
ULONG xpos = 0;
LPCTSTR lpPrinterName = "HP Color";
DOCINFO docInfo = {sizeof(DOCINFO),
"Doc1",
NULL
};
hdcm = CreateDC(NULL,lpPrinterName,NULL,NULL);
if (hdcm == NULL)
{
MessageBox(NULL,"Couldn't create DC",lpPrinterName,MB_OK);
}
else
{
LONG iJobID = StartDoc(hdcm,&docInfo);
if (iJobID == SP_ERROR)
{
MessageBox(NULL,"StartDoc fails","error",MB_OK);
}
else
{
LONG iRet = StartPage(hdcm);
if (iRet == SP_ERROR)
{
MessageBox(NULL,"StartPage fails","error",MB_OK);
}
else
{
HBITMAP hbm = LoadBitmap (hInstMain, MAKEINTRESOURCE(MONITOR_BITMAP));
HDC hdcPrnMem2 = CreateCompatibleDC(hdcm);
BitBlt (hdcm, 0, 0, 184, 170, hdcPrnMem2, 0, 0, SRCCOPY);
SelectObject(hdcPrnMem2,hbm);
DeleteDC(hdcPrnMem2);
DeleteObject(hbm);
EndPage(hdcm);
}
EndDoc(hdcm);
}
DeleteDC(hdcm);
}
ReleaseDC(pCallData->hwnd,hdc);
bThreadActive = FALSE;
}
/**************************************************************************\
* vRunGradHorz
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/17/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vRunGradRectHorz(
HDC hdc,
HBITMAP hdib,
ULONG ulRectMode
)
{
ULONG xpos = 10;
ULONG ypos = 10;
ULONG dy = 10;
ULONG dx = 10;
HPALETTE hpal;
RECT rect;
SelectObject(hdc,hTestFont);
//
// Clear screen
//
SelectObject(hdc,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdc,0,0,2000,2000,PATCOPY);
SelectObject(hdc,hbrFillCars);
//
// create mem dc, select test DIBSection
//
ULONG ux,uy;
ULONG dibx,diby;
PULONG pDib;
HDC hdcm = CreateCompatibleDC(hdc);
//
// display over black
//
hpal = CreateHtPalette(hdc);
SelectObject(hdcm,hdib);
SelectObject(hdcm,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
HPALETTE hpalOld = SelectPalette(hdc,hpal,FALSE);
SelectPalette(hdcm,hpal,FALSE);
RealizePalette(hdc);
RealizePalette(hdcm);
SetTextColor(hdc,RGB(255,255,255));
SetBkMode(hdc,TRANSPARENT);
GRADIENT_RECT gRect = {0,1};
TRIVERTEX vert[6];
//
// fill screen background
//
vert[0].x = -101;
vert[0].y = -102;
vert[0].Red = 0x4000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x8000;
vert[0].Alpha = 0x0000;
vert[1].x = 2000;
vert[1].y = 3004;
vert[1].Red = 0xff00;
vert[1].Green = 0x0000;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
GradientFill(hdc,vert,2,(PVOID)&gRect,1,ulRectMode);
//
// test widths and heights
//
diby = 16;
for (uy=0;uy<16;uy++)
{
dibx = 16;
for (ux=1;ux<17;ux++)
{
vert[0].x = dibx;
vert[0].y = diby;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = dibx + ux;
vert[1].y = diby + ux;
vert[1].Red = 0xff00;
vert[1].Green = 0x0000;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
GradientFill(hdcm,vert,2,(PVOID)&gRect,1,ulRectMode);
dibx = dibx + 17;
}
diby += 20;
}
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
//
// test Solid Widths and heights
//
xpos = xpos + (256 + 16);
diby = 16;
for (uy=1;uy<16;uy++)
{
dibx = 16;
for (ux=1;ux<17;ux++)
{
vert[0].x = dibx;
vert[0].y = diby;
vert[0].Red = 0x0000;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0x0000;
vert[1].x = dibx + uy;
vert[1].y = diby + uy;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
GradientFill(hdcm,vert,2,(PVOID)&gRect,1,ulRectMode);
dibx = dibx + 17;
}
diby += 20;
}
//
// display
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// xor copy
//
xpos += (256+16);
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// Draw same thing with solid brush and xor
//
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
HBRUSH hbrCyan = CreateSolidBrush(RGB(0,255,255));
SelectObject(hdcm,hbrCyan);
diby = 16;
for (uy=1;uy<16;uy++)
{
dibx = 16;
for (ux=1;ux<17;ux++)
{
PatBlt(hdcm,dibx,diby,uy,uy,PATCOPY);
dibx = dibx + 17;
}
diby += 20;
}
SelectObject(hdcm,GetStockObject(DKGRAY_BRUSH));
DeleteObject(hbrCyan);
//
// display
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// XOR
//
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,0x660000);
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
xpos = 16;
ypos += (16+256);
//
// draw a single rectangle, then draw same rectangle by drawing
// smaller rectangles inside each other. XOR to compare
//
//
//
//
//
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0x8000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 256;
vert[1].y = 256;
vert[1].Red = 0x8000;
vert[1].Green = 0x8000;
vert[1].Blue = 0x8000;
vert[1].Alpha = 0x0000;
GradientFill(hdcm,vert,2,(PVOID)&gRect,1,ulRectMode);
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// draw rectangles inside rectangles to test dither org
//
LONG OffsetX = 0;
LONG OffsetY = 0;
//
// range in x = 256, range in color = 0xfe00 (256 * 128)
//
while (OffsetX < 128)
{
vert[0].x = OffsetX;
vert[0].y = OffsetY;
vert[0].Red = 0x8000;
vert[0].Green = 0x0000 + (128 * OffsetX);
vert[0].Blue = 0x0000 + (128 * OffsetX);
vert[0].Alpha = 0x0000;
vert[1].x = 256-OffsetX;
vert[1].y = 256-OffsetY;
vert[1].Red = 0x8000;
vert[1].Green = 0x8000 - (128 * OffsetX);
vert[1].Blue = 0x8000 - (128 * OffsetX);
vert[1].Alpha = 0x0000;
GradientFill(hdcm,vert,2,(PVOID)&gRect,1,ulRectMode);
OffsetX += 9;
OffsetY += 9;
}
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,0x660000);
xpos = 16;
ypos += (16+256);
//
// draw a single rectangle, then draw same rectangle by drawing
// smaller rectangles inside each other. XOR to compare
//
//
// Use Complex Clip
//
//
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
HRGN hrgn1 = CreateEllipticRgn(10,10,246,246);
ExtSelectClipRgn(hdcm,hrgn1,RGN_COPY);
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0x8000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 256;
vert[1].y = 256;
vert[1].Red = 0x8000;
vert[1].Green = 0x8000;
vert[1].Blue = 0x8000;
vert[1].Alpha = 0x0000;
GradientFill(hdcm,vert,2,(PVOID)&gRect,1,ulRectMode);
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// draw rectangles inside rectangles to test dither org
//
OffsetX = 0;
OffsetY = 0;
//
// range in x = 256, range in color = 0xfe00 (256 * 128)
//
while (OffsetX < 128)
{
vert[0].x = OffsetX;
vert[0].y = OffsetY;
vert[0].Red = 0x8000;
vert[0].Green = 0x0000 + (128 * OffsetX);
vert[0].Blue = 0x0000 + (128 * OffsetX);
vert[0].Alpha = 0x0000;
vert[1].x = 256-OffsetX;
vert[1].y = 256-OffsetY;
vert[1].Red = 0x8000;
vert[1].Green = 0x8000 - (128 * OffsetX);
vert[1].Blue = 0x8000 - (128 * OffsetX);
vert[1].Alpha = 0x0000;
GradientFill(hdcm,vert,2,(PVOID)&gRect,1,ulRectMode);
OffsetX += 9;
OffsetY += 9;
}
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,0x660000);
ExtSelectClipRgn(hdcm,NULL,RGN_COPY);
DeleteObject(hrgn1);
xpos = 16;
ypos += (256+16);
SelectPalette(hdc,hpalOld,TRUE);
DeleteObject(hdcm);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestGradHorz
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradRectHorz(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
CHAR Title[256];
CHAR NewTitle[256];
GetWindowText(pCallData->hwnd,Title,256);
//
// repeat for each src format
//
ULONG ulIndex = 0;
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
if (pCallData->Param != -1)
{
ulIndex = pCallData->Param;
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[ulIndex],ulFor[ulIndex],256,256);
if (hdib != NULL)
{
lstrcpy(NewTitle,Title);
lstrcat(NewTitle,pFormatStr[ulIndex]);
SetWindowText(pCallData->hwnd,NewTitle);
vRunGradRectHorz(hdc,hdib,GRADIENT_FILL_RECT_H);
DeleteObject(hdib);
}
}
else
{
while (ulBpp[ulIndex] != 0)
{
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[ulIndex],ulFor[ulIndex],256,256);
if (hdib != NULL)
{
lstrcpy(NewTitle,Title);
lstrcat(NewTitle,pFormatStr[ulIndex]);
SetWindowText(pCallData->hwnd,NewTitle);
vRunGradRectHorz(hdc,hdib,GRADIENT_FILL_RECT_H);
DeleteObject(hdib);
}
Sleep(gAlphaSleep);
ulIndex++;
}
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestGradVert
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradRectVert(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
CHAR Title[256];
CHAR NewTitle[256];
GetWindowText(pCallData->hwnd,Title,256);
ULONG ulIndex = 0;
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
//
// repeat for each src format
//
if (pCallData->Param != -1)
{
ulIndex = pCallData->Param;
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[ulIndex],ulFor[ulIndex],256,256);
if (hdib != NULL)
{
lstrcpy(NewTitle,Title);
lstrcat(NewTitle,pFormatStr[ulIndex]);
SetWindowText(pCallData->hwnd,NewTitle);
vRunGradRectHorz(hdc,hdib,GRADIENT_FILL_RECT_V);
DeleteObject(hdib);
}
}
else
{
while (ulBpp[ulIndex] != 0)
{
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[ulIndex],ulFor[ulIndex],256,256);
if (hdib != NULL)
{
lstrcpy(NewTitle,Title);
lstrcat(NewTitle,pFormatStr[ulIndex]);
SetWindowText(pCallData->hwnd,NewTitle);
vRunGradRectHorz(hdc,hdib,GRADIENT_FILL_RECT_V);
DeleteObject(hdib);
}
Sleep(gAlphaSleep);
ulIndex++;
}
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vRunGradTriangle
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/17/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vRunGradTriangle(
HDC hdc,
HBITMAP hdib
)
{
ULONG xpos = 10;
ULONG ypos = 10;
ULONG dy = 10;
ULONG dx = 10;
HPALETTE hpal;
RECT rect;
SelectObject(hdc,hTestFont);
//
// Clear screen
//
SelectObject(hdc,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdc,0,0,2000,2000,PATCOPY);
SelectObject(hdc,hbrFillCars);
//
// create mem dc, select test DIBSection
//
ULONG ux,uy;
ULONG dibx,diby;
PULONG pDib;
HDC hdcm = CreateCompatibleDC(hdc);
//
// display over black
//
hpal = CreateHtPalette(hdc);
SelectObject(hdcm,hdib);
SelectObject(hdcm,GetStockObject(DKGRAY_BRUSH));
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
HPALETTE hpalOld = SelectPalette(hdc,hpal,FALSE);
SelectPalette(hdcm,hpal,FALSE);
RealizePalette(hdc);
RealizePalette(hdcm);
SetTextColor(hdc,RGB(255,255,255));
SetBkMode(hdc,TRANSPARENT);
GRADIENT_TRIANGLE gTri[2] ={{0,1,2},{0,2,3}};
TRIVERTEX vert[6];
//
// fill screen background
//
vert[0].x = -101;
vert[0].y = -102;
vert[0].Red = 0x4000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x8000;
vert[0].Alpha = 0x0000;
vert[1].x = 2000;
vert[1].y = -102;
vert[1].Red = 0x4400;
vert[1].Green = 0x4400;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = 2000;
vert[2].y = 1000;
vert[2].Red = 0xff00;
vert[2].Green = 0x0000;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = -101;
vert[3].y = 1000;
vert[3].Red = 0x0000;
vert[3].Green = 0x4300;
vert[3].Blue = 0x0000;
vert[3].Alpha = 0x0000;
GradientFill(hdc,vert,4,(PVOID)&gTri,2,GRADIENT_FILL_TRIANGLE);
//
// test widths and heights
//
diby = 16;
for (uy=0;uy<16;uy++)
{
dibx = 16;
for (ux=1;ux<17;ux++)
{
vert[0].x = dibx;
vert[0].y = diby;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = dibx + ux;
vert[1].y = diby;
vert[1].Red = 0xff00;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = dibx + ux;
vert[2].y = diby + ux;
vert[2].Red = 0xff00;
vert[2].Green = 0x0000;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = dibx;
vert[3].y = diby + ux;
vert[3].Red = 0x0000;
vert[3].Green = 0x0000;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)&gTri,2,GRADIENT_FILL_TRIANGLE);
dibx = dibx + 17;
}
diby += 20;
}
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
//
// test Solid Widths and heights
//
xpos = xpos + (256 + 16);
diby = 16;
for (uy=1;uy<16;uy++)
{
dibx = 16;
for (ux=1;ux<17;ux++)
{
vert[0].x = dibx;
vert[0].y = diby;
vert[0].Red = 0x0000;
vert[0].Green = 0xff00;
vert[0].Blue = 0xff00;
vert[0].Alpha = 0x0000;
vert[1].x = dibx + uy;
vert[1].y = diby;
vert[1].Red = 0x0000;
vert[1].Green = 0xff00;
vert[1].Blue = 0xff00;
vert[1].Alpha = 0x0000;
vert[2].x = dibx + uy;
vert[2].y = diby + uy;
vert[2].Red = 0x0000;
vert[2].Green = 0xff00;
vert[2].Blue = 0xff00;
vert[2].Alpha = 0x0000;
vert[3].x = dibx;
vert[3].y = diby + uy;
vert[3].Red = 0x0000;
vert[3].Green = 0xff00;
vert[3].Blue = 0xff00;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)&gTri,2,GRADIENT_FILL_TRIANGLE);
dibx = dibx + 17;
}
diby += 20;
}
//
// display
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// xor copy
//
xpos += (256+16);
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// Draw same thing with solid brush and xor
//
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
HBRUSH hbrCyan = CreateSolidBrush(RGB(0,255,255));
SelectObject(hdcm,hbrCyan);
diby = 16;
for (uy=1;uy<16;uy++)
{
dibx = 16;
for (ux=1;ux<17;ux++)
{
PatBlt(hdcm,dibx,diby,uy,uy,PATCOPY);
dibx = dibx + 17;
}
diby += 20;
}
SelectObject(hdcm,GetStockObject(DKGRAY_BRUSH));
DeleteObject(hbrCyan);
//
// display
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// XOR
//
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,0x660000);
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
xpos = 16;
ypos += (16+256);
//
// draw a single rectangle, then draw same rectangle by drawing
// smaller rectangles inside each other. XOR to compare
//
//
//
//
//
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 256;
vert[1].y = 0;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 256;
vert[2].y = 256;
vert[2].Red = 0xfe00;
vert[2].Green = 0xfe00;
vert[2].Blue = 0xfe00;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = 256;
vert[3].Red = 0xfe00;
vert[3].Green = 0xfe00;
vert[3].Blue = 0xfe00;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)&gTri,2,GRADIENT_FILL_TRIANGLE);
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// draw rectangles inside rectangles to test dither org
//
LONG OffsetX = 0;
LONG OffsetY = 0;
//
// range in x = 256, range in color = 0xfe00 (256 * 128)
//
while ((OffsetX < 100) && (OffsetY < 100))
{
vert[0].x = OffsetX;
vert[0].y = OffsetY;
vert[0].Red = 0x0000 + (254 * OffsetY);
vert[0].Green = 0x0000 + (254 * OffsetY);
vert[0].Blue = 0x0000 + (254 * OffsetY);
vert[0].Alpha = 0x0000;
vert[1].x = 256-OffsetX;
vert[1].y = OffsetY;
vert[1].Red = 0x0000 + (254 * OffsetY);
vert[1].Green = 0x0000 + (254 * OffsetY);
vert[1].Blue = 0x0000 + (254 * OffsetY);
vert[1].Alpha = 0x0000;
vert[2].x = 256-OffsetX;
vert[2].y = 256-OffsetY;
vert[2].Red = 0xfe00 - (254 * OffsetY);
vert[2].Green = 0xfe00 - (254 * OffsetY);
vert[2].Blue = 0xfe00 - (254 * OffsetY);
vert[2].Alpha = 0x0000;
vert[3].x = OffsetX;
vert[3].y = 256-OffsetY;
vert[3].Red = 0xfe00 - (254 * OffsetY);
vert[3].Green = 0xfe00 - (254 * OffsetY);
vert[3].Blue = 0xfe00 - (254 * OffsetY);
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)&gTri,2,GRADIENT_FILL_TRIANGLE);
OffsetX += 9;
OffsetY += 9;
}
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,0x660000);
xpos = 16;
ypos += (16+256);
//
// draw a single rectangle, then draw same rectangle by drawing
// smaller rectangles inside each other. XOR to compare
//
//
// Use Complex Clip
//
//
PatBlt(hdcm,0,0,2000,2000,PATCOPY);
HRGN hrgn1 = CreateEllipticRgn(10,10,246,246);
ExtSelectClipRgn(hdcm,hrgn1,RGN_COPY);
vert[0].x = 0;
vert[0].y = 0;
vert[0].Red = 0x0000;
vert[0].Green = 0x0000;
vert[0].Blue = 0x0000;
vert[0].Alpha = 0x0000;
vert[1].x = 256;
vert[1].y = 0;
vert[1].Red = 0x0000;
vert[1].Green = 0x0000;
vert[1].Blue = 0x0000;
vert[1].Alpha = 0x0000;
vert[2].x = 256;
vert[2].y = 256;
vert[2].Red = 0xfe00;
vert[2].Green = 0xfe00;
vert[2].Blue = 0xfe00;
vert[2].Alpha = 0x0000;
vert[3].x = 0;
vert[3].y = 256;
vert[3].Red = 0xfe00;
vert[3].Green = 0xfe00;
vert[3].Blue = 0xfe00;
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)&gTri,2,GRADIENT_FILL_TRIANGLE);
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos+256+16,ypos,256,256,hdcm,0,0,SRCCOPY);
//
// draw rectangles inside rectangles to test dither org
//
OffsetX = 0;
OffsetY = 0;
//
// range in x = 256, range in color = 0xfe00 (256 * 128)
//
while ((OffsetX < 100) && (OffsetY < 100))
{
vert[0].x = OffsetX;
vert[0].y = OffsetY;
vert[0].Red = 0x0000 + (254 * OffsetY);
vert[0].Green = 0x0000 + (254 * OffsetY);
vert[0].Blue = 0x0000 + (254 * OffsetY);
vert[0].Alpha = 0x0000;
vert[1].x = 256-OffsetX;
vert[1].y = OffsetY;
vert[1].Red = 0x0000 + (254 * OffsetY);
vert[1].Green = 0x0000 + (254 * OffsetY);
vert[1].Blue = 0x0000 + (254 * OffsetY);
vert[1].Alpha = 0x0000;
vert[2].x = 256-OffsetX;
vert[2].y = 256-OffsetY;
vert[2].Red = 0xfe00 - (254 * OffsetY);
vert[2].Green = 0xfe00 - (254 * OffsetY);
vert[2].Blue = 0xfe00 - (254 * OffsetY);
vert[2].Alpha = 0x0000;
vert[3].x = OffsetX;
vert[3].y = 256-OffsetY;
vert[3].Red = 0xfe00 - (254 * OffsetY);
vert[3].Green = 0xfe00 - (254 * OffsetY);
vert[3].Blue = 0xfe00 - (254 * OffsetY);
vert[3].Alpha = 0x0000;
GradientFill(hdcm,vert,4,(PVOID)&gTri,2,GRADIENT_FILL_TRIANGLE);
OffsetX += 9;
OffsetY += 9;
}
//
// display copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,SRCCOPY);
xpos += (256+16);
//
// xor copy
//
BitBlt(hdc,xpos,ypos,256,256,hdcm,0,0,0x660000);
ExtSelectClipRgn(hdcm,NULL,RGN_COPY);
DeleteObject(hrgn1);
xpos = 16;
ypos += (256+16);
SelectPalette(hdc,hpalOld,TRUE);
BOOL bRet1 = DeleteObject(hdcm);
BOOL bRet2 = DeleteObject(hpal);
}
/**************************************************************************\
* vTestTriangle
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestGradTriangle(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
HPALETTE hpal = CreateHtPalette(hdc);
CHAR Title[256];
CHAR NewTitle[256];
GetWindowText(pCallData->hwnd,Title,256);
//
// repeat for each src format
//
if (pCallData->Param != -1)
{
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[pCallData->Param],ulFor[pCallData->Param],256,256);
if (hdib != NULL)
{
lstrcpy(NewTitle,Title);
lstrcat(NewTitle,pFormatStr[pCallData->Param]);
SetWindowText(pCallData->hwnd,NewTitle);
vRunGradTriangle(hdc,hdib);
DeleteObject(hdib);
}
}
else
{
ULONG ulIndex = 0;
SelectPalette(hdc,hpal,FALSE);
RealizePalette(hdc);
while (ulBpp[ulIndex] != 0)
{
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[ulIndex],ulFor[ulIndex],256,256);
if (hdib != NULL)
{
lstrcpy(NewTitle,Title);
lstrcat(NewTitle,pFormatStr[ulIndex]);
SetWindowText(pCallData->hwnd,NewTitle);
vRunGradTriangle(hdc,hdib);
DeleteObject(hdib);
}
Sleep(gAlphaSleep);
ulIndex++;
}
}
ReleaseDC(pCallData->hwnd,hdc);
DeleteObject(hpal);
}
/**************************************************************************\
* vTestCaps
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestCaps(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
CHAR Title[256];
CHAR NewTitle[256];
ULONG ShadeCaps = GetDeviceCaps(hdc,SHADEBLENDCAPS);
wsprintf(Title,"Caps = 0x%08lx",ShadeCaps);
TextOut(hdc,10,10,Title,strlen(Title));
ReleaseDC(pCallData->hwnd,hdc);
}
/**************************************************************************\
* vTestBrushOrg
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestBrushOrg(
TEST_CALL_DATA *pCallData
)
{
HDC hdc = GetDCAndTransform(pCallData->hwnd);
CHAR Title[256];
CHAR NewTitle[256];
PBYTE pPack = (PBYTE)LocalAlloc(0,sizeof(BITMAPINFO) + 8*8*4);
PBITMAPINFO pbmi = (PBITMAPINFO)pPack;
PBITMAPINFOHEADER pbmih = (PBITMAPINFOHEADER)&pbmi->bmiHeader;
PULONG pul = (PULONG)(pPack + sizeof(BITMAPINFO));
pbmih->biSize = sizeof(BITMAPINFOHEADER);
pbmih->biWidth = 8;
pbmih->biHeight = -8;
pbmih->biPlanes = 1;
pbmih->biBitCount = 32;
pbmih->biCompression = BI_RGB;
pbmih->biSizeImage = 0;
pbmih->biXPelsPerMeter = 0;
pbmih->biYPelsPerMeter = 0;
pbmih->biClrUsed = 0;
pbmih->biClrImportant = 0;
//
// init brush data
//
{
int ix,iy;
PULONG pulTmp = pul;
for (iy=0;iy<8;iy++)
{
for (ix=0;ix<8;ix++)
{
*pul++ = (((iy * (256/8)) << 16) | (ix * (256/8)));
//*pul++ = 0xffbb55;
}
}
}
HBITMAP hdib = hCreateAlphaStretchBitmap(hdc,ulBpp[0],ulFor[0],256,256);
HDC hdcm = CreateCompatibleDC(hdc);
SelectObject(hdcm,hdib);
HBRUSH hbr = CreateDIBPatternBrushPt(pPack,DIB_RGB_COLORS);
SelectObject(hdcm,hbr);
PatBlt(hdcm,0,0,64,64,0);
GdiFlush();
SetBrushOrgEx(hdcm,0,0,NULL);
GdiFlush();
PatBlt(hdcm,0,0,8,8,PATCOPY);
GdiFlush();
SetBrushOrgEx(hdcm,1,1,NULL);
GdiFlush();
PatBlt(hdcm,0,16,8,8,PATCOPY);
GdiFlush();
SetBrushOrgEx(hdcm,0,0,NULL);
GdiFlush();
PatBlt(hdcm,0,32,8,8,PATCOPY);
GdiFlush();
SetBrushOrgEx(hdcm,4,4,NULL);
GdiFlush();
PatBlt(hdcm,0,48,8,8,PATCOPY);
GdiFlush();
BitBlt(hdc,0,0,64,64,hdcm,0,0,SRCCOPY);
DeleteObject(hbr);
DeleteDC(hdcm);
DeleteObject(hdib);
ReleaseDC(pCallData->hwnd,hdc);
}
/**************************************************************************\
* vTestDummy
*
* used in menu for locations that should no do anything
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 6/3/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vTestDummy(
TEST_CALL_DATA *pCallData
)
{
}
//
// TEST_ENTRY controls automatic menu generation
//
// [Menu Level, Test Param, Stress Enable, Test Name, Test Function Pointer]
//
// Menu Level
// used to autoamtically generate sub-menus.
// 1 = 1rst level menu
// -n = start n-level sub menu
// n = continue sub menu
//
// Test Param
// passed as parameter to test
//
//
// Stress Ensable
// if 1, test is run in stress mode
// if 0, test is not run (tests that require input or runforever)
//
//
// Test Name
// ascii test name for menu
//
// Test Function Pointer
// pfn
//
TEST_ENTRY gTestEntry[] = {
{ 1, 0,1,(PUCHAR)"vTestBrushOrg ", (PFN_DISP)vTestBrushOrg},
{ 1, 0,1,(PUCHAR)"vTestCaps ", (PFN_DISP)vTestCaps},
{ 1, 0,1,(PUCHAR)"vTestMenu ", (PFN_DISP)vTestMenu},
{ 1, 0,1,(PUCHAR)"vTestDiamond ", (PFN_DISP)vTestDiamond},
{-2, 0,1,(PUCHAR)"Test Circle Gradients ", (PFN_DISP)vTestDummy},
{ 2, 0,1,(PUCHAR)"vTestCircle1 ", (PFN_DISP)vTestCircle1},
{ 2, 0,1,(PUCHAR)"vTestCircle2 ", (PFN_DISP)vTestCircle2},
{ 2, 0,1,(PUCHAR)"vTestCircle3 ", (PFN_DISP)vTestCircle3},
{ 1, 0,1,(PUCHAR)"vTestOverflow ", (PFN_DISP)vTestOverflow},
{ 1, 0,1,(PUCHAR)"vTestTessel ", (PFN_DISP)vTestTessel},
{ 1, 0,1,(PUCHAR)"vTestTri ", (PFN_DISP)vTestTri },
{-2, 0,1,(PUCHAR)"Grad Rect Tests ", (PFN_DISP)vTestDummy },
{ 2, 0,1,(PUCHAR)"vTestGradRect1 ", (PFN_DISP)vTestGradRect1},
{ 2, 0,1,(PUCHAR)"vTestGradRect4 ", (PFN_DISP)vTestGradRect4},
{ 2, 0,1,(PUCHAR)"vTestGradRectH ", (PFN_DISP)vTestGradRectH},
{ 2, 0,1,(PUCHAR)"vTestGradRectV ", (PFN_DISP)vTestGradRectV},
{ 2, 0,1,(PUCHAR)"vTestGradMap ", (PFN_DISP)vTestGradMap},
{-2, 0,1,(PUCHAR)"Multi-Res Tests ", (PFN_DISP)vTestDummy},
{-3, 0,1,(PUCHAR)"Test Grad Triangle ", (PFN_DISP)vTestDummy},
{ 3, -1,0,(PUCHAR)"vTestGradTriangle All ", (PFN_DISP)vTestGradTriangle},
{ 3, 0,1,(PUCHAR)"vTestGradTriangle 32BGRA", (PFN_DISP)vTestGradTriangle},
{ 3, 1,1,(PUCHAR)"vTestGradTriangle 32RGB ", (PFN_DISP)vTestGradTriangle},
{ 3, 2,1,(PUCHAR)"vTestGradTriangle 32GRB ", (PFN_DISP)vTestGradTriangle},
{ 3, 3,1,(PUCHAR)"vTestGradTriangle 24 ", (PFN_DISP)vTestGradTriangle},
{ 3, 4,1,(PUCHAR)"vTestGradTriangle 16_555", (PFN_DISP)vTestGradTriangle},
{ 3, 5,1,(PUCHAR)"vTestGradTriangle 16_565", (PFN_DISP)vTestGradTriangle},
{ 3, 6,1,(PUCHAR)"vTestGradTriangle 16_664", (PFN_DISP)vTestGradTriangle},
{ 3, 7,1,(PUCHAR)"vTestGradTriangle 8 ", (PFN_DISP)vTestGradTriangle},
{ 3, 8,1,(PUCHAR)"vTestGradTriangle 4 ", (PFN_DISP)vTestGradTriangle},
{ 3, 9,1,(PUCHAR)"vTestGradTriangle 1 ", (PFN_DISP)vTestGradTriangle},
{-3, 0,1,(PUCHAR)"Test Grad Rect Horz ", (PFN_DISP)vTestDummy},
{ 3, -1,0,(PUCHAR)"vTestGradRectHorz All ", (PFN_DISP)vTestGradRectHorz},
{ 3, 0,1,(PUCHAR)"vTestGradRectHorz 32BGRA", (PFN_DISP)vTestGradRectHorz},
{ 3, 1,1,(PUCHAR)"vTestGradRectHorz 32RGB ", (PFN_DISP)vTestGradRectHorz},
{ 3, 2,1,(PUCHAR)"vTestGradRectHorz 32GRB ", (PFN_DISP)vTestGradRectHorz},
{ 3, 3,1,(PUCHAR)"vTestGradRectHorz 24 ", (PFN_DISP)vTestGradRectHorz},
{ 3, 4,1,(PUCHAR)"vTestGradRectHorz 16_555", (PFN_DISP)vTestGradRectHorz},
{ 3, 5,1,(PUCHAR)"vTestGradRectHorz 16_565", (PFN_DISP)vTestGradRectHorz},
{ 3, 6,1,(PUCHAR)"vTestGradRectHorz 16_664", (PFN_DISP)vTestGradRectHorz},
{ 3, 7,1,(PUCHAR)"vTestGradRectHorz 8 ", (PFN_DISP)vTestGradRectHorz},
{ 3, 8,1,(PUCHAR)"vTestGradRectHorz 4 ", (PFN_DISP)vTestGradRectHorz},
{ 3, 9,1,(PUCHAR)"vTestGradRectHorz 1 ", (PFN_DISP)vTestGradRectHorz},
{-3, 0,1,(PUCHAR)"Test Grad Rect Vert ", (PFN_DISP)vTestDummy},
{ 3, -1,0,(PUCHAR)"vTestGradRectVert All ", (PFN_DISP)vTestGradRectVert},
{ 3, 0,1,(PUCHAR)"vTestGradRectVert 32BGRA", (PFN_DISP)vTestGradRectVert},
{ 3, 1,1,(PUCHAR)"vTestGradRectVert 32RGB ", (PFN_DISP)vTestGradRectVert},
{ 3, 2,1,(PUCHAR)"vTestGradRectVert 32GRB ", (PFN_DISP)vTestGradRectVert},
{ 3, 3,1,(PUCHAR)"vTestGradRectVert 24 ", (PFN_DISP)vTestGradRectVert},
{ 3, 4,1,(PUCHAR)"vTestGradRectVert 16_555", (PFN_DISP)vTestGradRectVert},
{ 3, 5,1,(PUCHAR)"vTestGradRectVert 16_565", (PFN_DISP)vTestGradRectVert},
{ 3, 6,1,(PUCHAR)"vTestGradRectVert 16_664", (PFN_DISP)vTestGradRectVert},
{ 3, 7,1,(PUCHAR)"vTestGradRectVert 8 ", (PFN_DISP)vTestGradRectVert},
{ 3, 8,1,(PUCHAR)"vTestGradRectVert 4 ", (PFN_DISP)vTestGradRectVert},
{ 3, 9,1,(PUCHAR)"vTestGradRectVert 1 ", (PFN_DISP)vTestGradRectVert},
{-2, 0,1,(PUCHAR)"TRI DIB ", (PFN_DISP)vTestDummy },
{ 2, 0,1,(PUCHAR)"vTestTriDIB32 ", (PFN_DISP)vTestTriDIB32},
{ 2, 0,1,(PUCHAR)"vTestTriDIB16565 ", (PFN_DISP)vTestTriDIB16565},
{ 2, 0,1,(PUCHAR)"vTestTriDIB16555 ", (PFN_DISP)vTestTriDIB16555},
{ 2, 0,1,(PUCHAR)"vTestTriDIB8Halftone ", (PFN_DISP)vTestTriDIB8Halftone},
{ 2, 0,1,(PUCHAR)"vTestTriDIB8DefPal ", (PFN_DISP)vTestTriDIB8DefPal},
{-2, 0,1,(PUCHAR)"MetaFile ", (PFN_DISP)vTestDummy },
{ 2, 0,1,(PUCHAR)"vCreateMetaFile ", (PFN_DISP)vCreateMetaFile},
{ 2, 0,1,(PUCHAR)"vPlayMetaFile ", (PFN_DISP)vPlayMetaFile},
{-2, 0,0,(PUCHAR)"Printing ", (PFN_DISP)vTestDummy },
{ 2, 0,0,(PUCHAR)"vTestRASDD ", (PFN_DISP)vTestRASDD},
{ 2, 0,0,(PUCHAR)"vTestTranPrint ", (PFN_DISP)vTestTranPrint},
{ 1, 0,0,(PUCHAR)"vTestInputTri ", (PFN_DISP)vTestInputTri},
{ 1, 0,0,(PUCHAR)"vTestRandTri ", (PFN_DISP)vTestRandTri},
{-2, 0,0,(PUCHAR)"Test BltLnk Bug ", (PFN_DISP)vTestDummy},
{ 2, 0,0,(PUCHAR)"vTestBitBlt ", (PFN_DISP)vTestBitBlt},
{ 2, 0,0,(PUCHAR)"vTestBitBlt2 ", (PFN_DISP)vTestBitBlt2},
{ 2, 0,0,(PUCHAR)"vTestBitBlt3 ", (PFN_DISP)vTestBitBlt3},
{ 0, 0,1,(PUCHAR)" ", (PFN_DISP)vTestDummy}
};
ULONG gNumTests = sizeof(gTestEntry)/sizeof(TEST_ENTRY);