|
|
/******************************Module*Header*******************************\
* Module Name: test.c * * Created: 09-Dec-1992 10:51:46 * Author: Kirk Olynyk [kirko] * * Copyright (c) 1991 Microsoft Corporation * * Contains the test * \**************************************************************************/
#include <windows.h>
#include <objbase.h>
#include <math.h> // sin & cos
#include "debug.h"
#define USE_NEW_APIS 1
#define USE_NEW_APIS2 1
//
// Where is IStream included from?
//
#define IStream int
#include <gdiplus.h>
using namespace Gdiplus;
/******************************Public*Routine******************************\
* vTest * * This is the workhorse routine that does the test. The test is * started by chosing it from the window menu. * * History: * Tue 08-Dec-1992 17:31:22 by Kirk Olynyk [kirko] * Wrote it. \**************************************************************************/
class RectI { public: INT X; INT Y; INT Width; INT Height; };
VOID TestContainerClip(Graphics *g); VOID TestContainer(Graphics *g); VOID TestPolygons(Graphics *g); VOID TestPaths(Graphics *g); VOID TestDashes(Graphics *g); VOID TestRegions(Graphics *g); VOID TestGradients(Graphics* g); VOID TestHatches(Graphics* g); VOID TestBitmaps(Graphics* g); VOID TestPrimitives(Graphics *g); VOID TestMixedObjects(Graphics *g); VOID TestTexts(Graphics* g); VOID TestTextAlongPath(Graphics *g); VOID TestDerive(HWND hwnd); VOID TestImaging(Graphics* g); VOID TestBitmapGraphics(Graphics* g); VOID TestCompoundLines(Graphics *g);
VOID Test( HWND hwnd ) { Graphics *g = Graphics::FromHWND(hwnd); g->SetSmoothingMode(SmoothingModeAntiAlias);
// Scale everything up by scale
REAL scale = (REAL) 1.2; g->SetPageUnit(UnitDisplay); g->SetPageScale(scale); g->RotateTransform(10);
{ HDC hdc = GetDC(hwnd); { Metafile recording(L"TestEmfP.Emf", hdc); Graphics gMeta(&recording); gMeta.SetSmoothingMode(SmoothingModeAntiAlias); TestContainer(&gMeta); } GpRectF playbackRect; g->GetVisibleClipBounds(&playbackRect);
{ Metafile playback(L"TestEmfP.Emf"); g->DrawImage(&playback, playbackRect); }
ReleaseDC(hwnd, hdc); } TestContainerClip(g); TestPolygons(g); TestPaths(g); TestRegions(g); TestBitmaps(g); TestPrimitives(g); TestMixedObjects(g); TestGradients(g); TestHatches(g); TestTexts(g); TestDerive(hwnd); TestImaging(g); TestDashes(g); TestBitmapGraphics(g); TestCompoundLines(g);
delete g; }
VOID DrawContainer(Graphics * g, ARGB * argb, INT count) { Matrix mymatrix; g->SetPageUnit(UnitInch);
Rect clipRect(0,0,5,5); g->SetClip(clipRect);
mymatrix.Translate(2.5, 2.5); mymatrix.Rotate(15); mymatrix.Translate(-2.5, -2.5); g->SetTransform(&mymatrix);
Color color(*argb++); SolidBrush contBrush(color); g->FillRectangle(&contBrush, 0, 0, 5, 5); if (--count == 0) { return; } RectF destRect(.5, .5, 4, 4); RectF srcRect(0, 0, 5, 5); INT id = g->BeginContainer(destRect, srcRect, UnitInch); g->ResetClip(); DrawContainer (g, argb, count); g->EndContainer(id); }
VOID TestContainerClip(Graphics *g) { ARGB colors[5]; colors[0] = Color::MakeARGB(255, 255, 0, 0); colors[1] = Color::MakeARGB(255, 0, 255, 0); colors[2] = Color::MakeARGB(255, 0, 0, 255); colors[3] = Color::MakeARGB(255, 255, 255, 0); colors[4] = Color::MakeARGB(255, 0, 255, 255);
GraphicsState s = g->Save(); DrawContainer(g, colors, 5); g->Restore(s); }
GraphicsPath circlePath; RectF circleRect(0,0,4,4);
#define ROOT 0
#define LEFT 1
#define RIGHT 2
#define TOP 3
#define BOTTOM 4
VOID DrawFractal(Graphics * g, BYTE gray, INT side, INT count) { ARGB argb;
switch (count % 3) { case 0: argb = Color::MakeARGB(255, 0, 0, gray); break; case 1: argb = Color::MakeARGB(255, 0, gray, 0); break; case 2: argb = Color::MakeARGB(255, gray, 0, 0); gray -= 60; break; } Color color(argb); SolidBrush contBrush(color); g->SetPageUnit(UnitInch); g->FillPath(&contBrush, &circlePath); if (--count == 0) { return; }
RectF destRect; GraphicsContainer cstate;
if (side != LEFT) { destRect = RectF(4, 1, 2, 2); cstate = g->BeginContainer(destRect, circleRect, UnitInch); g->SetSmoothingMode(SmoothingModeAntiAlias); DrawFractal(g, gray, RIGHT, count); g->EndContainer(cstate); } if (side != TOP) { destRect = RectF(1, 4, 2, 2); cstate = g->BeginContainer(destRect, circleRect, UnitInch); g->SetSmoothingMode(SmoothingModeAntiAlias); DrawFractal(g, gray, BOTTOM, count); g->EndContainer(cstate); } if (side != RIGHT) { destRect = RectF(-2, 1, 2, 2); cstate = g->BeginContainer(destRect, circleRect, UnitInch); g->SetSmoothingMode(SmoothingModeAntiAlias); DrawFractal(g, gray, LEFT, count); g->EndContainer(cstate); } if (side != BOTTOM) { destRect = RectF(1, -2, 2, 2); cstate = g->BeginContainer(destRect, circleRect, UnitInch); g->SetSmoothingMode(SmoothingModeAntiAlias); DrawFractal(g, gray, TOP, count); g->EndContainer(cstate); } }
VOID TestContainer(Graphics * g) { circlePath.AddEllipse(circleRect); INT id = g->Save(); g->TranslateTransform(5, 4); DrawFractal(g, 245, ROOT, 8); g->Restore(id); }
/**************************************************************************\
* TestPolygons * * A test for drawing and filling of rectangles and polygons. * \**************************************************************************/
VOID TestPolygons(Graphics *g) { REAL width = 4; // Pen width
Color redColor(255, 0, 0);
SolidBrush redBrush(redColor); g->FillRectangle(&redBrush, 20, 20, 50, 50);
Color alphaColor(128, 0, 255, 0);
SolidBrush alphaBrush(alphaColor); g->FillRectangle(&alphaBrush, 10, 10, 40, 40);
Point points[4]; points[0].X = 50; points[0].Y = 50; points[1].X = 100; points[1].Y = 50; points[2].X = 120; points[2].Y = 120; points[3].X = 50; points[3].Y = 100;
Color blueColor(128, 0, 0, 255);
SolidBrush blueBrush(blueColor); g->FillPolygon(&blueBrush, points, 4);
// Currently only Geometric pen works for lines. - ikkof 1/6/99.
Color blackColor(0, 0, 0); SolidBrush blackBrush(blackColor); Pen blackPen(&blackBrush, width); blackPen.SetLineJoin(LineJoinRound); g->DrawPolygon(&blackPen, points, 4); // g->DrawLines(&blackPen, points, 4, FALSE);
}
/**************************************************************************\
* TestPaths * * A test for general paths. * \**************************************************************************/
VOID TestPaths(Graphics *g) { REAL width = 4; // Pen width
Point points[4];
points[0].X = 100; points[0].Y = 10; points[1].X = -50; points[1].Y = 50; points[2].X = 150; points[2].Y = 200; points[3].X = 200; points[3].Y = 70;
Color yellowColor(128, 255, 255, 0); SolidBrush yellowBrush(yellowColor);
GraphicsPath* path = new GraphicsPath(FillModeAlternate); path->AddBeziers(points, 4); Matrix matrix; matrix.Scale(1.5, 1.5); path->Transform(&matrix); Color blackColor(0, 0, 0);
SolidBrush blackBrush(blackColor); // Set the pen width in inch.
width = (REAL) 0.2; Pen blackPen(&blackBrush, width); blackPen.SetStartCap(LineCapRound); // blackPen.SetEndCap(LineCapSquare);
blackPen.SetEndCap(LineCapArrowAnchor); Region * region = new Region(path); g->FillPath(&yellowBrush, path); g->DrawPath(&blackPen, path); delete path; delete region; }
/**************************************************************************\
* TestDashes * * A test for drawing dashed lines. * \**************************************************************************/
VOID TestDashes(Graphics *g) { REAL width = 4; // Pen width
PointF points[4];
points[0].X = 100; points[0].Y = 10; points[1].X = -50; points[1].Y = 50; points[2].X = 150; points[2].Y = 200; points[3].X = 200; points[3].Y = 70;
Color yellowColor(128, 255, 255, 0); SolidBrush yellowBrush(yellowColor);
GraphicsPath* path = new GraphicsPath(FillModeAlternate); path->AddBeziers(points, 4); Matrix matrix; matrix.Scale(1.5, 1.5);
path->Transform(&matrix);
Color blackColor(0, 0, 0); SolidBrush blackBrush(blackColor); // Set the pen width in inch.
width = (REAL) 0.2; Pen pen1(&blackBrush, width); pen1.SetDashStyle(DashStyleDashDotDot); pen1.SetDashCap(DashCapRound); g->DrawPath(&pen1, path);
// Create a multiple segment with a closed segment.
points[0].X = 50; points[0].Y = 50; points[1].X = 100; points[1].Y = 50; points[2].X = 120; points[2].Y = 120; points[3].X = 50; points[3].Y = 100;
path->Reset(); path->AddLines(points, 4); path->CloseFigure();
points[0].X = 150; points[0].Y = 60; points[1].X = 200; points[1].Y = 150; path->AddLines(points, 2); path->Transform(&matrix);
Color blueColor(128, 0, 0, 255);
SolidBrush blueBrush(blueColor);
width = 5; Pen pen2(&blueBrush, width); pen2.SetDashStyle(DashStyleDashDotDot); g->DrawPath(&pen2, path);
delete path; }
/**************************************************************************\
* TestRegions * * A test for region fill. * \**************************************************************************/
VOID TestRegions(Graphics *g) { REAL width = 2; // Pen width
PointF points[5]; REAL s, c, theta; REAL pi = 3.1415926535897932f; REAL scale = 30; PointF orig(200, 140);
theta = -pi/2;
// Create a star shape.
for(INT i = 0; i < 5; i++) { s = sinf(theta); c = cosf(theta); points[i].X = scale*c + orig.X; points[i].Y = scale*s + orig.Y; theta += 0.8f*pi; }
Color orangeColor(128, 255, 180, 0);
SolidBrush orangeBrush(orangeColor); GraphicsPath* path = new GraphicsPath(FillModeAlternate); // Path* path = new GraphicsPath(Winding);
path->AddPolygon(points, 5); Color blackColor(0, 0, 0);
SolidBrush blackBrush(blackColor); Pen blackPen(&blackBrush, width); Region * region = new Region(path);
g->FillRegion(&orangeBrush, region); // There is a BUG!
// g->FillGraphicsPath(&orangeBrush, path); // Fill path works fine.
blackPen.SetLineJoin(LineJoinMiter); g->DrawPath(&blackPen, path); delete path; delete region; }
GraphicsPath* CreateHeartPath(const RectF& rect) { GpPointF points[7]; points[0].X = 0; points[0].Y = 0; points[1].X = 1.00; points[1].Y = -1.00; points[2].X = 2.00; points[2].Y = 1.00; points[3].X = 0; points[3].Y = 2.00; points[4].X = -2.00; points[4].Y = 1.00; points[5].X = -1.00; points[5].Y = -1.00; points[6].X = 0; points[6].Y = 0;
Matrix matrix;
matrix.Scale(rect.Width/2, rect.Height/3, MatrixOrderAppend); matrix.Translate(3*rect.Width/2, 4*rect.Height/3, MatrixOrderAppend); matrix.TransformPoints(&points[0], 7);
GraphicsPath* path = new GraphicsPath(); if(path) { path->AddBeziers(&points[0], 7); path->CloseFigure(); }
return path; }
/**************************************************************************\
* TestGradients * * A test for rectangle and radial gradients. * \**************************************************************************/
VOID TestGradients(Graphics* g) { REAL width = 4; // Pen width
// Create a rectangular gradient brush.
RectF brushRect(0, 0, 32, 32);
Color colors[5] = { Color(255, 255, 255, 255), Color(255, 255, 0, 0), Color(255, 0, 255, 0), Color(255, 0, 0, 255), Color(255, 0, 0, 0) };
// RectangleGradientBrush rectGrad(brushRect, (Color*) &colors, WrapModeTile);
// Rotate a brush.
GpMatrix xForm; xForm.Rotate(30); // rectGrad.SetTransform(&xForm);
// Change the wrapping mode and fill.
// !! No longer supported
// rectGrad.SetWrapMode(WrapModeTileFlipXY);
// g->FillRectangle(&rectGrad, 350, 20, 100, 80);
Color blackColor(0, 0, 0);
SolidBrush blackBrush(blackColor); Pen blackPen(&blackBrush, width);
g->DrawRectangle(&blackPen, brushRect);
// Create a radial gradient brush.
Color centerColor(255, 255, 255, 255); Color boundaryColor(255, 0, 0, 0); brushRect.X = 380; brushRect.Y = 130; brushRect.Width = 60; brushRect.Height = 32; PointF center; center.X = brushRect.X + brushRect.Width/2; center.Y = brushRect.Y + brushRect.Height/2; xForm.Reset(); xForm.RotateAt(-30, center, MatrixOrderAppend); // !! No longer supported
// RadialGradientBrush radGrad(brushRect, centerColor,
// boundaryColor, WrapModeClamp);
// radGrad.SetTransform(&xForm);
// g->FillRectangle(&radGrad, 320, 120, 120, 100);
// Pen gradPen(&rectGrad, width);
// g->DrawRectangle(&gradPen, 320, 120, 120, 100);
// Triangle gradient.
PointF points[7]; points[0].X = 50; points[0].Y = 10; points[1].X = 200; points[1].Y = 20; points[2].X = 100; points[2].Y = 100; points[3].X = 30; points[3].Y = 120;
Color colors1[5] = { Color(255, 255, 255, 0), Color(255, 255, 0, 0), Color(255, 0, 255, 0), Color(255, 0, 0, 255), Color(255, 0, 0, 0) };
// !! No longer supported
// TriangleGradientBrush triGrad(points, (Color*) &colors);
// g->FillPolygon(&triGrad, points, 3);
RectF triRect; // triGrad.GetRectangle(triRect);
// g->FillRectangle(&triGrad, triRect);
points[0].X = 200; points[0].Y = 300; points[1].X = 280; points[1].Y = 350; points[2].X = 220; points[2].Y = 420; points[3].X = 160; points[3].Y = 440; points[4].X = 120; points[4].Y = 370;
PathGradientBrush polyGrad(points, 5);
REAL blend[10]; Color presetColors[10]; REAL positions[10]; INT count; INT i;
count = 3; blend[0] = (REAL) 0; blend[1] = (REAL) 0; blend[2] = (REAL) 1; positions[0] = (REAL) 0; positions[1] = (REAL) 0.4; positions[2] = (REAL) 1;
// Test for blending factors.
polyGrad.SetBlend(&blend[0], &positions[0], count);
polyGrad.SetCenterColor(centerColor); i = 5; polyGrad.SetSurroundColors(colors1, &i); // g->FillPolygon(&polyGrad, points, 5);
RectF polyRect; polyGrad.GetRectangle(&polyRect); g->FillRectangle(&polyGrad, polyRect);
// Create a heart shaped path.
RectF rect; rect.X = 300; rect.Y = 300; rect.Width = 150; rect.Height = 150; GraphicsPath *path = CreateHeartPath(rect);
// Create a gradient from a path.
PathGradientBrush pathGrad(path); delete path; pathGrad.SetCenterColor(centerColor); i = 1; pathGrad.SetSurroundColors(&Color(255, 255, 0, 0), &i); pathGrad.GetRectangle(&polyRect);
// Set the rect focus.
PointF centerPt;
pathGrad.GetCenterPoint(¢erPt); centerPt.X -= 15; centerPt.Y += 30; pathGrad.SetCenterPoint(centerPt); REAL xScale, yScale; pathGrad.GetFocusScales(&xScale, &yScale); xScale = 0.4f; yScale = 0.3f; pathGrad.SetFocusScales(xScale, yScale);
g->FillRectangle(&pathGrad, polyRect);
// Test for LineGradientBrush.
RectF lineRect(120, -20, 200, 60); Color color1(200, 255, 255, 0); Color color2(200, 0, 0, 255);
LinearGradientBrush lineGrad(lineRect, color1, color1, LinearGradientModeForwardDiagonal);
// Test for preset colors
presetColors[0] = Color(200, 0, 255, 255); presetColors[1] = Color(200, 255, 255, 0); presetColors[2] = Color(200, 0, 255, 0); lineGrad.SetInterpolationColors(&presetColors[0], &positions[0], count);
g->FillRectangle(&lineGrad, lineRect);
}
/**************************************************************************\
* TestHatches * * A test for hatch brushes * \**************************************************************************/
VOID TestHatches(Graphics* g) { Color foreColor(0, 0, 0); Color backColor(128, 255, 255, 255);
HatchStyle style[6]; style[0] = HatchStyleForwardDiagonal; style[1] = HatchStyleBackwardDiagonal; style[2] = HatchStyleCross; style[3] = HatchStyleDiagonalCross; style[4] = HatchStyleHorizontal; style[5] = HatchStyleVertical;
// Pick one of the above hatch styles.
HatchBrush hatch(style[3], foreColor, backColor); g->FillRectangle(&hatch, 200, 20, 100, 80); }
/**************************************************************************\
* TestBitmaps * * A test for texture filling and DrawImage. * \**************************************************************************/
VOID TestBitmaps(Graphics* g) { Point points[4]; REAL width = 4; // Pen width
WCHAR filename[256]; wcscpy(filename, L"../data/brick.jpg"); Bitmap *bitmap = new Bitmap(filename);
// Create a texture brush.
RectI copyRect; copyRect.X = 0; copyRect.Y = 0; copyRect.Width = 40; copyRect.Height = 30;
Bitmap *copiedBitmap = bitmap->Clone(copyRect.X, copyRect.Y, copyRect.Width, copyRect.Height, PixelFormat32bppARGB); if(copiedBitmap) { // Create a texture brush.
TextureBrush textureBrush(copiedBitmap, WrapModeTile);
//copiedBitmap->Dispose();
// Create a radial gradient pen.
Color redColor(255, 0, 0);
SolidBrush redBrush(redColor); Pen redPen(&redBrush, width);
GraphicsPath *path;
points[0].X = 100; points[0].Y = 60; points[1].X = -50; points[1].Y = 60; points[2].X = 150; points[2].Y = 250; points[3].X = 200; points[3].Y = 120; path = new GraphicsPath(FillModeAlternate); path->AddBeziers(points, 4); g->FillPath(&textureBrush, path); g->DrawPath(&redPen, path);
delete path; delete copiedBitmap; }
delete bitmap;
PointF destPoints[3];
destPoints[0].X = 300; destPoints[0].Y = 50; destPoints[1].X = 450; destPoints[1].Y = 50; destPoints[2].X = 240; destPoints[2].Y = 200; Matrix mat; mat.Translate(0, 100); mat.TransformPoints(&destPoints[0], 3); wcscpy(filename, L"../data/apple1.png"); bitmap = new Bitmap(filename); g->DrawImage(bitmap, &destPoints[0], 3); delete bitmap;
destPoints[0].X = 30; destPoints[0].Y = 200; destPoints[1].X = 200; destPoints[1].Y = 200; destPoints[2].X = 200; destPoints[2].Y = 420;
wcscpy(filename, L"../data/dog2.png"); bitmap = new Bitmap(filename); g->DrawImage(bitmap, &destPoints[0], 3); delete bitmap;
Color color(100, 128, 255, 0);
SolidBrush brush(color);
Point pts[10]; INT count = 4;
pts[0].X = 150; pts[0].Y = 60; pts[1].X = 100; pts[1].Y = 230; pts[2].X = 250; pts[2].Y = 260; pts[3].X = 350; pts[3].Y = 100;
g->FillClosedCurve(&brush, pts, count);
wcscpy(filename, L"../data/ballmer.jpg"); bitmap = new Bitmap(filename); RectF destRect(220, 50, 180, 120); RectF srcRect; srcRect.X = 100; srcRect.Y = 40; srcRect.Width = 200; srcRect.Height = 200; g->DrawImage(bitmap, destRect, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, UnitPixel); delete bitmap; }
/**************************************************************************\
* TestPrimitives * * A test for ellipse, arc, pie, curve, and closed curve. * \**************************************************************************/
VOID TestPrimitives( Graphics* g ) { RectF rect;
rect.X = 250; rect.Y = 230; rect.Width = 150; rect.Height = 100;
Color color(128, 128, 255, 0);
SolidBrush brush(color);
REAL width = 1;
Color blackColor(0, 0, 0); SolidBrush blackBrush(blackColor); Pen pen(&blackBrush, width);
// g->FillEllipse(&brush, rect);
// g->DrawEllipse(&pen, rect);
REAL startAngle = 0; REAL sweepAngle = 240; g->FillPie(&brush, rect, startAngle, sweepAngle); g->DrawPie(&pen, rect, startAngle, sweepAngle);
PointF pts[10]; INT count = 4;
pts[0].X = 200; pts[0].Y = 160; pts[1].X = 150; pts[1].Y = 230; pts[2].X = 200; pts[2].Y = 260; pts[3].X = 300; pts[3].Y = 200;
g->FillClosedCurve(&brush, pts, count); g->DrawClosedCurve(&pen, pts, count); }
/**************************************************************************\
* TestMixedObjects * * A test for different brushes and pens. * \**************************************************************************/
VOID TestMixedObjects(Graphics* g) { Point points[10]; REAL width = 4; // Pen width
// Load bmp files.
WCHAR *filename = L"winnt256.bmp"; Bitmap *bitmap = new Bitmap(filename);
// Create a texture brush.
RectI copyRect; copyRect.X = 60; copyRect.Y = 60; copyRect.Width = 80; copyRect.Height = 60; Bitmap *copiedBitmap = bitmap->Clone(copyRect.X, copyRect.Y, copyRect.Width, copyRect.Height, PixelFormat32bppPARGB);
// Create a rectangular gradient brush.
RectF brushRect(0, 0, 32, 32); Color colors[4] = { Color(255, 255, 255, 255), Color(255, 255, 0, 0), Color(255, 0, 255, 0), Color(255, 0, 0, 255) }; // !! No longer supported
// RectangleGradientBrush rectGrad(brushRect, (Color*)&colors, WrapModeTile);
width = 8; // Pen gradPen(&rectGrad, width);
if(copiedBitmap) { // Create a texture brush.
TextureBrush textureBrush(copiedBitmap, WrapModeTile);
//copiedBitmap->Dispose();
// Create a radial gradient pen.
points[3].X = 50; points[3].Y = 300; points[2].X = 100; points[2].Y = 300; points[1].X = 120; points[1].Y = 370; points[0].X = 50; points[0].Y = 350;
// gradPen.SetLineJoin(LineJoinMiter);
g->FillPolygon(&textureBrush, points, 4); // g->DrawPolygon(&gradPen, points, 4);
}
delete copiedBitmap; delete bitmap; }
/**************************************************************************\
* TestTexts * * A test for drawing texts. * \**************************************************************************/
VOID TestTexts(Graphics *g) { //Font font(L"Arial", 60);
FontFamily ff(L"Arial"); RectF rectf(20, 0, 300, 200); GraphicsPath path;
// Solid color text.
Color color(128, 100, 0, 200); SolidBrush brush(color); path.AddString(L"Color", 5, &ff, 0, 60, rectf, NULL); g->FillPath(&brush, &path);
// Texture text.
WCHAR filename[256]; wcscpy(filename, L"../data/marble1.jpg"); Bitmap *bitmap = new Bitmap(filename); TextureBrush textureBrush(bitmap, WrapModeTile); path.Reset(); rectf.X = 200; rectf.Y = 20; path.AddString(L"Texture", 7, &ff, 0, 60, rectf, NULL); g->FillPath(&textureBrush, &path); delete bitmap;
// Gradient text.
rectf.X = 40; rectf.Y = 80; path.Reset(); path.AddString(L"Gradient", 8, &ff, 0, 60, rectf, NULL); Color color1(255, 255, 0, 0); Color color2(255, 0, 255, 0); LinearGradientBrush lineGrad(rectf, color1, color2, 0.0f); g->FillPath(&lineGrad, &path);
// Shadow test
REAL charHeight = 60; REAL topMargin = - 5; rectf.X = 0; rectf.Y = - charHeight - topMargin; // Make y-coord of the base line
// of the characters to be 0.
path.Reset(); path.AddString(L"Shadow", 6, &ff, 0, charHeight, rectf, NULL); GraphicsPath* clonePath = path.Clone();
Color redColor(255, 0, 0); Color grayColor(128, 0, 0, 0); SolidBrush redBrush(redColor); SolidBrush grayBrush(grayColor);
// Shadow part.
REAL tx = 180, ty = 200; Matrix skew; skew.Scale(1.0, 0.5); skew.Shear(-2.0, 0, MatrixOrderAppend); skew.Translate(tx, ty, MatrixOrderAppend); clonePath->Transform(&skew); g->FillPath(&grayBrush, clonePath); delete clonePath;
// Front part.
Matrix trans1; trans1.Translate(tx, ty); path.Transform(&trans1); g->FillPath(&redBrush, &path);
return; /*
REAL x = 200, y = 150;
RectF brushRect(x, y, 150, 32); Color colors[4] = { Color(180, 255, 0, 0), Color(180, 0, 255, 0), Color(180, 255, 0, 0), Color(180, 0, 255, 0) }; RectangleGradientBrush rectGrad(brushRect, (Color*)&colors, WrapModeTile);
g->DrawString(L"GDI+", &font, &rectGrad, x, y);
// And now with DrawText
RectF rect(400, 200, 400, 400);
g->DrawText( DrawTextDisplay, L"A few words powered by GDI+: \
\x3c3\x3bb\x3b1\x3b4 \ \x627\x644\x633\x644\x627\x645 \ \x5e9\x5dc\x5d5\x5dd \ \xe2d\xe4d\xe01\xe29\xe23\xe44\xe17\xe22 \ \x110\x068\x0ea\x300\x103", &font, // Initial font
&rectGrad, // Initial brush (ignored for the time being)
LANG_NEUTRAL, // Initial language
&rect // Formatting rectangle
); */
}
VOID TestTextAlongPath(Graphics *g) { Point points[4];
points[3].X = 100; points[3].Y = 10; points[2].X = -50; points[2].Y = 50; points[1].X = 150; points[1].Y = 200; points[0].X = 200; points[0].Y = 70;
GraphicsPath* path = new GraphicsPath(FillModeAlternate); path->AddBeziers(points, 4); Matrix matrix; matrix.Scale(1.5, 1.5);
path->Transform(&matrix);
Color textColor(180, 200, 0, 200); SolidBrush textBrush(textColor);
WCHAR text[] = L"Windows 2000";
REAL offset = 60;
// g->DrawString(text, 12, NULL, path, NULL, &textBrush, offset);
delete path; }
/**************************************************************************\
* TestDerive * * Test * A test for derivation support. * \**************************************************************************/
VOID TestDerive( HWND hwnd ) { HDC hdcScreen = GetDC(hwnd); HRGN hrgn = CreateEllipticRgn(10, 10, 300, 300);
SetMapMode(hdcScreen, MM_TWIPS); SelectClipRgn(hdcScreen, hrgn); HBRUSH hbrushRed = CreateSolidBrush(RGB(255, 0, 0)); SelectObject(hdcScreen, hbrushRed); Rectangle(hdcScreen, 0, 0, 3000, -3000);
{ Graphics g(hdcScreen); SolidBrush solidBrush(Color(0, 255, 0)); g.FillRectangle(&solidBrush, 0, -3000, 3000, 3000); }
HBITMAP hbmBitmap = CreateCompatibleBitmap(hdcScreen, 50, 50); HDC hdcBitmap = CreateCompatibleDC(hdcScreen); SelectObject(hdcBitmap, hbmBitmap); SetWindowOrgEx(hdcBitmap, 40, 80, NULL);
SelectObject(hdcBitmap, hbrushRed); Rectangle(hdcBitmap, 40, 80, 50, 50);
{ Graphics g(hdcBitmap); SolidBrush solidBrush(Color(0, 0, 255)); g.FillRectangle(&solidBrush, 40, 80, 90, 130);
#if 0
// The DC that we get back should have the same transform set
// as that which we originally passed in:
HDC hdcGet = g.GetHdc(); point.x = 0; point.y = 0; DPtoLP(hdcGet, &point, 1);
// !!! BAD on Alpha box
// if ((hdcGet == NULL) || (point.x != 40) || (point.y != 80)) _asm int 3;
g.ReleaseHdc(hdcGet);
#endif
}
// The DC should have beeen returned to the top save level:
INT saveLevel = SaveDC(hdcBitmap);
// !!! BAD on Alpha box
// if (saveLevel != 1) _asm int 3;
// The DC should have had its transform restored:
POINT oldPoint; SetWindowOrgEx(hdcBitmap, 0, 0, &oldPoint);
// !!! BAD on Alpha box
// if ((oldPoint.x != 40) || (oldPoint.y != 80)) _asm int 3;
// Blt the (hopefully) blue square to the screen. But first,
// reset our transform on 'hdcScreen' the lazy way:
ReleaseDC(hwnd, hdcScreen); hdcScreen = GetDC(hwnd); BitBlt(hdcScreen, 0, 0, 50, 50, hdcBitmap, 0, 0, SRCCOPY); ReleaseDC(hwnd, hdcScreen); }
/**************************************************************************\
* TestImaging * * A test for imaging and DrawImage. * \**************************************************************************/
BOOL CALLBACK MyDrawImageAbort(VOID* data) { UINT *count = (UINT*) data;
*count += 1;
//LBprintf("MyDrawImageAbort: %ld", *count);
return FALSE; }
VOID TestImaging(Graphics* g) { // Load bmp files.
WCHAR *filename = L"winnt256.bmp"; Image *image = new Image(filename);
// Get information on the image.
Image *imageThumb = image->GetThumbnailImage(32, 32);
// Try to save thumbnail
WCHAR *thumbfile = L"thumb256.bmp";
CLSID _BmpCodecClsID_ = { 0x557cf400, 0x1a04, 0x11d3, {0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e} };
if (imageThumb->Save(thumbfile, &_BmpCodecClsID_, NULL) == Ok) LBprintf("thumbnail save OK"); else LBprintf("thumbnail save failed");
RectF srcRect; srcRect.X = 20; srcRect.Y = 20; srcRect.Width = 180; srcRect.Height = 180;
PointF points[4];
PointF destPoints[3];
destPoints[0].X = 300; destPoints[0].Y = 50; destPoints[1].X = 450; destPoints[1].Y = 50; destPoints[2].X = 240; destPoints[2].Y = 200; //g->DrawImage(image, &destPoints[0], 3);
RectF thumbRect(220, 50, (REAL) imageThumb->GetWidth(), (REAL) imageThumb->GetHeight()); //g->DrawImage(imageThumb, thumbRect);
UINT abortCount = 0;
ImageAttributes imgAttrib;
Rect destRect(50, 10, 100, 100);
// Make near-white to white transparent
Color c1(200, 200, 200); Color c2(255, 255, 255); imgAttrib.SetColorKey(c1, c2);
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
ColorMatrix darkMatrix = {.75, 0, 0, 0, 0, 0, .75, 0, 0, 0, 0, 0, .75, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1};
ColorMatrix greyMatrix = {.25, .25, .25, 0, 0, .25, .25, .25, 0, 0, .25, .25, .25, 0, 0, 0, 0, 0, 1, 0, (REAL).1, (REAL).1, (REAL).1, 0, 1};
ColorMatrix pinkMatrix = {(REAL).33, .25, .25, 0, 0, (REAL).33, .25, .25, 0, 0, (REAL).33, .25, .25, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1};
// red->blue, green->red, blue->green, alpha = 0.75
ColorMatrix swapMatrix = {0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, .75, 0, 0, 0, 0, 0, 1};
// red->blue, green->red, blue->green, alpha = 0.9
ColorMatrix swapMatrix2 = {0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (REAL).9, 1};
imgAttrib.ClearColorKey(); imgAttrib.SetColorMatrix(&greyMatrix);
destRect.Y += destRect.Height;
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
imgAttrib.SetColorMatrix(&pinkMatrix, ColorMatrixFlagsSkipGrays);
destRect.Y += destRect.Height;
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
imgAttrib.SetColorMatrix(&darkMatrix);
destRect.X += destRect.Width; destRect.Y = 10;
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
destRect.Y += destRect.Height;
imgAttrib.ClearColorMatrix(); imgAttrib.SetGamma(3.0);
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
destRect.Y += destRect.Height;
imgAttrib.SetThreshold(0.5);
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
imgAttrib.SetColorMatrix(&swapMatrix); imgAttrib.ClearGamma(); imgAttrib.ClearThreshold();
destRect.X += destRect.Width; destRect.Y = 10;
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
destRect.Y += destRect.Height;
imgAttrib.SetNoOp(); imgAttrib.SetColorMatrix(&swapMatrix2);
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount); destRect.Y += destRect.Height;
imgAttrib.ClearNoOp();
g->DrawImage(image, destRect, 0, 0, 180, 180, UnitPixel, &imgAttrib, MyDrawImageAbort, (VOID*)&abortCount);
delete image; delete imageThumb; }
VOID TestBitmapGraphics(Graphics* g) { INT bitmapSize = 500;
Bitmap* bitmap = new Bitmap(bitmapSize, bitmapSize, g);
if (!bitmap) LBprintf("Bitmap creation failed"); else { LBprintf("ImageInfo: %ld x %ld", bitmap->GetWidth(), bitmap->GetHeight()); }
Graphics *bitmapGraphics = Graphics::FromImage(bitmap);
if (!bitmapGraphics) LBprintf("Bitmap.GetGraphics() failed");
TestContainerClip(bitmapGraphics); TestContainer(bitmapGraphics); TestPolygons(bitmapGraphics); TestPaths(bitmapGraphics); TestRegions(bitmapGraphics); TestGradients(bitmapGraphics); TestHatches(bitmapGraphics); TestBitmaps(bitmapGraphics); TestPrimitives(bitmapGraphics); TestMixedObjects(bitmapGraphics); TestTexts(bitmapGraphics); TestImaging(bitmapGraphics);
delete bitmapGraphics;
Rect destRect(100, 100, bitmapSize, bitmapSize);
g->DrawImage(bitmap, destRect, 0, 0, bitmapSize, bitmapSize, UnitPixel);
delete bitmap; }
/**************************************************************************\
* TestCompoundLines * * A test for compound lines. * \**************************************************************************/
VOID TestCompoundLines(Graphics *g) { REAL width = 4; // Pen width
PointF points[4];
points[0].X = 100; points[0].Y = 10; points[1].X = -50; points[1].Y = 50; points[2].X = 150; points[2].Y = 200; points[3].X = 200; points[3].Y = 70;
Color yellowColor(128, 255, 255, 0); SolidBrush yellowBrush(yellowColor);
GraphicsPath* path = new GraphicsPath(FillModeAlternate); path->AddBeziers(points, 4);
points[0].X = 260; points[0].Y = 20; path->AddLines(points, 1); Matrix matrix; matrix.Scale(1.5, 1.5); matrix.Translate(0, 30);
// If you wanto to flatten the path before rendering,
// Flatten() can be called.
BOOL flattenFirst = FALSE;
if(!flattenFirst) { // Don't flatten and keep the original path.
// FillPath or DrawPath will flatten the path automatically
// without modifying the original path.
path->Transform(&matrix); } else { // Flatten this path. The resultant path is made of line
// segments. The original path information is lost.
path->Flatten(&matrix); }
Color blackColor(0, 0, 0);
SolidBrush blackBrush(blackColor); // Set the pen width in inch.
width = (REAL) 0.2; Pen blackPen(&blackBrush, width);
REAL* compoundArray = new REAL[6]; compoundArray[0] = 0.0f; compoundArray[1] = 0.2f; compoundArray[2] = 0.4f; compoundArray[3] = 0.6f; compoundArray[4] = 0.8f; compoundArray[5] = 1.0f; blackPen.SetCompoundArray(&compoundArray[0], 6); blackPen.SetDashStyle(DashStyleDash);
blackPen.SetStartCap(LineCapDiamondAnchor); blackPen.SetEndCap(LineCapArrowAnchor);
g->FillPath(&yellowBrush, path); g->DrawPath(&blackPen, path); delete [] compoundArray; delete path; }
|