|
|
/*****************************************************************************
* * lines - 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
/***************************************************************************
* PolylineTo - Win32 to Win16 Metafile Converter Entry Point **************************************************************************/ BOOL WINAPI DoPolylineTo ( PLOCALDC pLocalDC, PPOINTL pptl, DWORD cptl ) { BOOL b ;
// Handle path.
if (pLocalDC->flags & RECORDING_PATH) { if (pfnSetVirtualResolution == NULL) { bXformWorkhorse((PPOINTL) pptl, cptl, &pLocalDC->xformRWorldToRDev); } return(PolylineTo(pLocalDC->hdcHelper, (LPPOINT) pptl, (DWORD) cptl)); }
// Handle the trivial case.
if (cptl == 0) return(TRUE);
// This can be done by using a LineTo, PolyLine, & MoveTo.
if (!DoLineTo(pLocalDC, pptl[0].x, pptl[0].y)) return(FALSE);
// If there is only one point, we are done.
if (cptl == 1) return(TRUE);
if (!DoPoly(pLocalDC, pptl, cptl, EMR_POLYLINE, TRUE)) return(FALSE);
b = DoMoveTo(pLocalDC, pptl[cptl-1].x, pptl[cptl-1].y) ; return (b) ; }
/***************************************************************************
* PolyPolyline - Win32 to Win16 Metafile Converter Entry Point **************************************************************************/ BOOL WINAPI DoPolyPolyline ( PLOCALDC pLocalDC, PPOINTL pptl, // -> to PolyPolyline points.
PDWORD pcptl, // -> to PolyCounts
DWORD ccptl, // # of PolyCounts.
BOOL transform // do we want to transform the points
) { BOOL b ; UINT i, iStart, nCount ;
b = TRUE; // just in case if there is no poly
// Let polyline do the work.
iStart = 0 ; for (i = 0 ; i < ccptl ; i++) { nCount = pcptl[i] ; b = DoPoly(pLocalDC, &pptl[iStart], nCount, EMR_POLYLINE, transform) ; if (b == FALSE) break ; iStart += nCount ; }
return(b) ; }
/***************************************************************************
* LineTo - Win32 to Win16 Metafile Converter Entry Point * * See DoMoveTo() in misc.c for notes on the current position. **************************************************************************/ BOOL WINAPI DoLineTo ( PLOCALDC pLocalDC, LONG x, LONG y ) { BOOL b ; POINT pt ; POINT ptCP;
// Whether we are recording for a path or acutally emitting
// a drawing order we must pass the drawing order to the helper DC
// so the helper can maintain the current positon.
// 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.
POINTL p = {x, y}; if (pfnSetVirtualResolution == NULL) { bXformWorkhorse(&p, 1, &pLocalDC->xformRWorldToRDev); }
if (pLocalDC->flags & RECORDING_PATH) { return(LineTo(pLocalDC->hdcHelper, (INT) p.x, (INT) p.y)); }
// Update the current position in the converted metafile if
// it is different from that of the helper DC. See notes
// in DoMoveTo().
if (!GetCurrentPositionEx(pLocalDC->hdcHelper, &ptCP)) return(FALSE);
if (pfnSetVirtualResolution == NULL) { // On Win9x we need to convert from Device Units in the Helper DC
// to WorldUnits
if (!bXformWorkhorse((PPOINTL) &ptCP, 1, &pLocalDC->xformRDevToRWorld)) return(FALSE); }
// Make sure that the converted metafile has the same CP as the
// helper DC.
if (!bValidateMetaFileCP(pLocalDC, ptCP.x, ptCP.y)) return(FALSE);
// Update the helper DC.
// Update the helper DC. (We only need to update the CP so there's no
// reason to actually call LineTo.)
if (!MoveToEx(pLocalDC->hdcHelper, (INT) p.x, (INT) p.y, 0)) return(FALSE);
// Compute the new current position.
pt.x = x ; pt.y = y ; if (!bXformRWorldToPPage(pLocalDC, (PPOINTL) &pt, 1L)) return(FALSE);
// Update the mf16 current position to what it will be when this call
// is finished.
pLocalDC->ptCP = pt ;
// Call the Win16 routine to emit the line to the metafile.
b = bEmitWin16LineTo(pLocalDC, LOWORD(pt.x), LOWORD(pt.y)) ; return(b) ; }
/***************************************************************************
* Polyline/Polygon - Win32 to Win16 Metafile Converter Entry Point **************************************************************************/ BOOL WINAPI DoPoly ( PLOCALDC pLocalDC, PPOINTL pptl, DWORD cptl, INT mrType, BOOL transform ) { BOOL b ; PPOINTL pptlBuff ;
// 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) { if (pfnSetVirtualResolution == NULL) { bXformWorkhorse(pptl, cptl, &pLocalDC->xformRWorldToRDev); } switch(mrType) { case EMR_POLYLINE: b = Polyline(pLocalDC->hdcHelper, (LPPOINT) pptl, (INT) cptl) ; break; case EMR_POLYGON: b = Polygon(pLocalDC->hdcHelper, (LPPOINT) pptl, (INT) cptl) ; break; } return(b) ; }
// The Win16 poly record is limited to 64K points.
// Need to check this limit.
if (cptl > (DWORD) (WORD) MAXWORD) { b = FALSE; PUTS("MF3216: DoPoly, Too many point in poly array\n") ; SetLastError(ERROR_NOT_ENOUGH_MEMORY) ; goto exit1 ; }
// Allocate a buffer to do the transformation in.
// Then copy the points to this buffer.
pptlBuff = (PPOINTL) LocalAlloc(LMEM_FIXED, cptl * sizeof(POINTL)) ; if (!pptlBuff) { b = FALSE; PUTS("MF3216: DoPoly, LocalAlloc failed\n") ; goto exit1 ; }
RtlCopyMemory(pptlBuff, pptl, cptl * sizeof(POINTL)) ;
// Do the transformations.
if (transform) { b = bXformRWorldToPPage(pLocalDC, pptlBuff, cptl) ; if (b == FALSE) goto exit2 ; }
// Compress the POINTLs to POINTSs
vCompressPoints(pptlBuff, cptl) ;
// Call the Win16 routine to emit the poly to the metafile.
b = bEmitWin16Poly(pLocalDC, (LPPOINTS) pptlBuff, (SHORT) cptl, (WORD) (mrType == EMR_POLYLINE ? META_POLYLINE : META_POLYGON)) ;
// Free the memory used as the transform buffer.
exit2: if (LocalFree(pptlBuff)) ASSERTGDI(FALSE, "MF3216: DoPoly, LocalFree failed"); exit1: return(b) ; }
/***************************************************************************
* vCompressPoints - Utility routine to compress the POINTLs to POINTSs. **************************************************************************/ VOID vCompressPoints(PVOID pBuff, LONG nCount) { PPOINTL pPointl ; PPOINTS pPoints ; INT i ;
pPointl = (PPOINTL) pBuff ; pPoints = (PPOINTS) pBuff ;
for (i = 0 ; i < nCount ; i++) { pPoints[i].x = LOWORD(pPointl[i].x) ; pPoints[i].y = LOWORD(pPointl[i].y) ; } }
|