Important Notice
The pages on this site contain documentation for very old MS-DOS software,
purely for historical purposes.
If you're looking for up-to-date documentation, particularly for programming,
you should not rely on the information found here, as it will be woefully
out of date.
Using Area Primitives (1.2)
◄About Section► ◄Function Group► ◄Up► ◄Next► ◄Previous►
────────────────────────────────────────────────────────────────────────────
Using Areas and Area Primitives
You can use area functions to perform the following tasks:
♦ Draw a single closed figure.
♦ Draw multiple intersecting closed figures.
♦ Draw multiple disjoint closed figures.
♦ Draw any combination of the three.
♦ Create a custom fill pattern from a bitmap.
♦ Create a custom fill pattern from a font character.
Drawing a Single Closed Figure
The following code fragment shows how to use area functions to draw a single
closed figure that is filled using the alternate mode. The closed figure in
this example is a five-pointed star.
/* Initialize the array of points for the 5-pointed star. */
aptl[0].x = 37; aptl[0].y = 82;
aptl[1].x = 400; aptl[1].y = 195;
aptl[2].x = 40; aptl[2].y = 320;
aptl[3].x = 260; aptl[3].y = 10;
aptl[4].x = 260; aptl[4].y = 390;
aptl[5].x = 37; aptl[5].y = 82;
/* Draw the star. */
GpiBeginArea(hps, BA_ALTERNATE);
GpiMove(hps, aptl);
GpiPolyLine(hps, 6L, aptl);
GpiEndArea(hps);
Drawing Multiple Intersecting Closed Figures
The following code fragment shows how to use area functions to draw two
intersecting boxes that are filled using the winding mode:
GpiBeginArea(hps, BA_WINDING);
ptl.x = 500; ptl.y = 300;
GpiMove(hps, &ptl);
ptl.x = 700; ptl.y = 500;
GpiBox(hps, DRO_OUTLINE, &ptl, 0L, 0L);
ptl.x = 580; ptl.y = 370;
GpiMove(hps, &ptl);
ptl.x = 780; ptl.y = 570;
GpiBox(hps, DRO_OUTLINE, &ptl, 0L, 0L);
GpiEndArea(hps);
Drawing Multiple Disjoint Closed Figures
The following code fragment shows how to use area functions to draw two
disjoint boxes that are filled using the winding mode:
GpiBeginArea(hps, BA_WINDING);
ptl.x = 100; ptl.y = 200;
GpiMove(hps, &ptl);
ptl.x = 200; ptl.y = 400;
GpiBox(hps, DRO_OUTLINE, &ptl, 0L, 0L);
ptl.x = 580; ptl.y = 470;
GpiMove(hps, &ptl);
ptl.x = 780; ptl.y = 570;
GpiBox(hps, DRO_OUTLINE, &ptl, 0L, 0L);
GpiEndArea(hps);
Creating a Custom Fill Pattern from a Bitmap
The following code fragment shows how to create a custom fill pattern by
using a hard-coded bitmap, which in this example creates a cross-hatch
pattern:
CreatePattern();
GpiSetPatternSet(hps, lcidCustom);
.
.
.
CreatePattern()
{
/* Bitmap information */
HBITMAP hbm; /* bitmap handle */
BITMAPINFOHEADER bmp; /* structure for bitmap information */
PBITMAPINFO pbmi; /* pointer to structure for data */
CHAR cBuffer[80]; /* structure template */
bmp.cbFix = 12; /* length of structure */
bmp.cx = 8; /* 8 pels wide */
bmp.cy = 8; /* 8 pels high */
bmp.cPlanes = 1; /* 1 plane */
bmp.cBitCount = 1; /* 1 bit per pel */
/*
* Initialize the bitmap data by loading "cBuffer" with the bitmap
* information.
*/
pbmi = (PBITMAPINFO) cBuffer;
pbmi->cbFix = 12; /* length of structure */
pbmi->cx = 8; /* 8 bits wide */
pbmi->cy = 8; /* 8 bits high */
pbmi->cPlanes = 1; /* 1 plane */
pbmi->cBitCount = 1; /* 1 bit per pel */
/* Initialize first two color-table entries to black and white. */
pbmi->argbColor[0].bRed = 0; /* Color[0] = black */
pbmi->argbColor[0].bGreen = 0; /* Color[0] = black */
pbmi->argbColor[0].bBlue = 0; /* Color[0] = black */
pbmi->argbColor[1].bRed = 255; /* Color[1] = white */
pbmi->argbColor[1].bGreen = 255; /* Color[1] = white */
pbmi->argbColor[1].bBlue = 255; /* Color[1] = white */
/* Create a bitmap and retrieve its handle. */
hbm = GpiCreateBitmap(hps,
&bmp,
CBM_INIT,
(PBYTE) abPattern5, /* array of bits */
pbmi);
/* Tag the bitmap just created with a custom identifier (lcid). */
GpiSetBitmapId(hps, hbm, lcidCustom);
}
Creating a Custom Fill Pattern from a Font Character
The following code fragment shows how to create a custom fill pattern by
using a character from a font:
LoadFont();
GpiSetPatternSet(hps, lcidCustom);
GpiSetPattern(hps, lCodePoint);
.
.
.
LoadFont()
{
/* Determine the number of loaded public fonts. */
cFonts = GpiQueryFonts(hps, QF_PUBLIC, NULL, &lCount,
(LONG) (sizeof(fm)), (PFONTMETRICS) afm);
/* Load the metrics for all public fonts into afm. */
cFonts = GpiQueryFonts(hps, QF_PUBLIC, NULL, &lCount,
(LONG) (sizeof(fm)), (PFONTMETRICS) afm);
/* Grab the first image font with a point size larger than 8. */
for(i = 1;
(afm[i].fsDefn % 2 != 0) &&
(afm[i].sNominalPointSize / 10 >= 8);
i++);
/* Load the FATTRS structure with corresponding metrics. */
fat.usRecordLength = sizeof(fat);
fat.fsSelection = afm[i].fsSelection;
fat.lMatch = afm[i].lMatch;
strcpy(fat.szFacename, afm[i].szFacename);
fat.idRegistry = afm[i].idRegistry;
fat.usCodePage = afm[i].usCodePage;
fat.lMaxBaselineExt = afm[i].lMaxBaselineExt;
fat.lAveCharWidth = afm[i].lAveCharWidth;
fat.fsType = afm[i].fsType;
fat.fsFontUse = 0;
/* Ask MS OS/2 to select this font and assign it a custom lcid. */
GpiCreateLogFont(hps, (PSTR8) cBuffer, lcidCustom, (PFATTRS) &fat);
GpiSetCharSet(hps, lcidCustom);
}
♦