Windows2000/private/windows/shell/accesory/ole2pbsh/metafile.c
2020-09-30 17:12:32 +02:00

127 lines
4.4 KiB
C

/****************************Module*Header******************************\
* Module Name: metafile.c *
* Routines to paste a metafile as a bitmap. *
* Copyright (c) 1987 - 1991 Microsoft Corporation *
*/
#include <windows.h>
#include "port1632.h"
#include "pbrush.h"
/* Computes dimensions of a metafile picture in pixels */
BOOL GetMFDimensions(
HANDLE hMF, /* handle to the CF_METAFILEPICT object from clipbrd */
HDC hDC, /* display context */
int *pWidth, /* width of picture in pixels, OUT param */
int *pHeight) /* height of picture in pixels, OUT param */
{
METAFILEPICT FAR *lpMfp, Picture;
int MapModeOld=0;
RECT Rect;
long xScale, yScale, Scale;
int hRes, vRes; /* horz and vert resolution, in pixels */
int hSize, vSize; /* horz and vert size, in mm */
int fResult = FALSE;
if (!hMF || !(lpMfp = (METAFILEPICT FAR *)GlobalLock(hMF)))
return FALSE;
/* copy metafile picture hdr */
Picture = *lpMfp;
GlobalUnlock(hMF);
/* Do not modify given DC's attributes */
SaveDC(hDC);
/* set the mapping mode */
MapModeOld = SetMapMode(hDC, Picture.mm);
if (Picture.mm != MM_ISOTROPIC && Picture.mm != MM_ANISOTROPIC)
{
/* For modes other than ISOTROPIC and ANISOTROPIC the picture
* dimensions are given in logical units.
/* Convert logical units to pixels. */
Rect.left = 0; Rect.right = Picture.xExt;
Rect.top = 0; Rect.bottom = Picture.yExt;
if (!LPtoDP(hDC, (LPPOINT)&Rect, 2))
goto Error;
*pWidth = Rect.right - Rect.left + 1;
*pHeight = Rect.bottom - Rect.top + 1;
fResult = TRUE;
}
else /* ISOTROPIC or ANISOTROPIC mode,
* using the xExt and yExt, determine pixel width and height of
* the image */
{
hRes = GetDeviceCaps(hDC, HORZRES);
vRes = GetDeviceCaps(hDC, VERTRES);
hSize = GetDeviceCaps(hDC, HORZSIZE);
vSize = GetDeviceCaps(hDC, VERTSIZE);
if (Picture.xExt == 0) /* assume default size, aspect ratio */
{
*pWidth = imageWid;
*pHeight = imageHgt;
}
else if (Picture.xExt > 0) /* use suggested size in HIMETRIC units */
{
// convert suggested extents(in .01 mm units) for picture to pixel units.
// xPixelsPermm = hRes/hSize;, yPixelsPermm = vRes/vSize;
// Use Pixels Per logical unit.
// *pWidth = Picture.xExt*xPixelsPermm/100;
// *pHeight = Picture.yExt*yPixelsPermm/100;
*pWidth = ((long)Picture.xExt * hRes/hSize/100);
*pHeight = ((long)Picture.yExt * vRes/vSize/100);
}
else if (Picture.xExt < 0) /* use suggested aspect ratio, default size */
{
// 1 log unit = .01 mm.
// (# of log units in imageWid pixels)/xExt;
xScale = 100L * (long) imageWid *
hSize/hRes/-Picture.xExt;
// (# of log units in imageHgt pixels)/yExt;
yScale = 100L * (long) imageHgt *
vSize/vRes/-Picture.yExt;
// choose the minimum to accomodate the entire image
Scale = min(xScale, yScale);
// use scaled Pixels Per log unit.
*pWidth = ((long)-Picture.xExt * Scale *
hRes/hSize / 100);
*pHeight = ((long)-Picture.yExt * Scale *
vRes/vSize / 100);
}
fResult = TRUE;
}
Error:
if (MapModeOld)
SetMapMode(hDC, MapModeOld); /* select the old mapping mode */
RestoreDC(hDC, -1);
return fResult;
}
BOOL PlayMetafileIntoDC(
HANDLE hMF,
RECT *pRect,
HDC hDC)
{
HBRUSH hbrBackground;
METAFILEPICT FAR *lpMfp;
if (!(lpMfp = (METAFILEPICT FAR *)GlobalLock(hMF)))
return FALSE;
SaveDC(hDC);
/* Setup background color for the bitmap */
hbrBackground = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
FillRect(hDC, pRect, hbrBackground);
DeleteObject(hbrBackground);
SetMapMode(hDC, lpMfp->mm);
if (lpMfp->mm == MM_ISOTROPIC || lpMfp->mm == MM_ANISOTROPIC)
MSetViewportExt(hDC, pRect->right-pRect->left, pRect->bottom-pRect->top);
PlayMetaFile(hDC, lpMfp->hMF);
GlobalUnlock(hMF);
RestoreDC(hDC, -1);
return TRUE;
}