|
|
/*****************************************************************************
* * polygons - Entry points for Win32 to Win 16 converter * * Date: 7/1/91 * Author: Jeffrey Newman (c-jeffn) * * Copyright 1991 Microsoft Corp *****************************************************************************/
#include "precomp.h"
#pragma hdrstop
/***************************************************************************
* PolyPolygon - Win32 to Win16 Metafile Converter Entry Point **************************************************************************/ BOOL WINAPI DoPolyPolygon ( PLOCALDC pLocalDC, PPOINTL pptl, PDWORD pcptl, DWORD cptl, DWORD ccptl ) { BOOL b; PWORD pcptlBuff = (PWORD) NULL; PPOINTL pptlBuff = (PPOINTL) NULL; PPOINTL pptlSrc, pptlDst; DWORD i, cptlMax, cptlNeed, cptli;
// If we're recording the drawing orders for a path
// then just pass the drawing order to the helper DC.
// Do not emit any Win16 drawing orders.
if (pLocalDC->flags & RECORDING_PATH) return(PolyPolygon(pLocalDC->hdcHelper, (LPPOINT) pptl, (LPINT) pcptl, (INT) ccptl));
// NOTE: There is a semantic between the Win32 PolyPolygon and
// the Win16 PolyPolygon. Win32 will close each polygon, Win16
// will not. As a result, we have to insert points as necessary
// to make the polygons closed. We cannot use multiple polygons
// to replace a single PolyPolygon because they are different if
// the polygons overlap and the polyfill mode is winding.
// If there are not verrics just return TRUE.
if (ccptl == 0) return(TRUE) ;
b = FALSE; // assume failure
// Compute the maximum size of the temporary point array required
// to create closed PolyPolygon in win16.
cptlMax = cptl + ccptl;
// Allocate a buffer for the temporary point array.
pptlBuff = (PPOINTL) LocalAlloc(LMEM_FIXED, cptlMax * sizeof(POINTL)) ; if (!pptlBuff) { PUTS("MF3216: DoPolyPolygon, LocalAlloc failed\n") ; goto exit; }
// Allocate a buffer for the new polycount array and make a copy
// of the old array.
pcptlBuff = (PWORD) LocalAlloc(LMEM_FIXED, ccptl * sizeof(WORD)) ; if (!pcptlBuff) { PUTS("MF3216: DoPolyPolygon, LocalAlloc failed\n") ; goto exit; }
for (i = 0; i < ccptl; i++) pcptlBuff[i] = (WORD) pcptl[i];
// Insert the points and update the polycount as necessary.
pptlDst = pptlBuff; pptlSrc = pptl; cptlNeed = cptl; for (i = 0; i < ccptl; i++) { cptli = pcptl[i];
if (cptli < 2) goto exit;
RtlCopyMemory(pptlDst, pptlSrc, cptli * sizeof(POINTL)) ; if (pptlDst[0].x != pptlDst[cptli - 1].x || pptlDst[0].y != pptlDst[cptli - 1].y) { pptlDst[cptli] = pptlDst[0]; pptlDst++; cptlNeed++; pcptlBuff[i]++; } pptlSrc += cptli; pptlDst += cptli; }
// The Win16 poly record is limited to 64K points.
// Need to check this limit.
if (cptlNeed > (DWORD) (WORD) MAXWORD) { PUTS("MF3216: DoPolyPolygon, Too many point in poly array\n") ; SetLastError(ERROR_NOT_ENOUGH_MEMORY) ; goto exit ; }
// Do the transformations.
if (!bXformRWorldToPPage(pLocalDC, pptlBuff, cptlNeed)) goto exit;
// Compress the POINTLs to POINTSs
vCompressPoints(pptlBuff, cptlNeed) ;
// Call the Win16 routine to emit the PolyPolygon to the metafile.
b = bEmitWin16PolyPolygon(pLocalDC, (PPOINTS) pptlBuff, pcptlBuff, (WORD) cptlNeed, (WORD) ccptl); exit: // Free the memory.
if (pptlBuff) if (LocalFree(pptlBuff)) ASSERTGDI(FALSE, "MF3216: DoPolyPolygon, LocalFree failed");
if (pcptlBuff) if (LocalFree(pcptlBuff)) ASSERTGDI(FALSE, "MF3216: DoPolyPolygon, LocalFree failed");
return(b) ; }
/***************************************************************************
* SetPolyFillMode - Win32 to Win16 Metafile Converter Entry Point **************************************************************************/ BOOL WINAPI DoSetPolyFillMode ( PLOCALDC pLocalDC, DWORD iPolyFillMode ) { BOOL b ;
// Emit the Win16 metafile drawing order.
b = bEmitWin16SetPolyFillMode(pLocalDC, LOWORD(iPolyFillMode)) ;
return(b) ; }
|