summaryrefslogtreecommitdiff
path: root/iup/srcole/tLegacy.cpp
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2009-11-04 11:56:41 -0800
committerPixel <pixel@nobis-crew.org>2009-11-04 11:59:33 -0800
commitd577d991b97ae2b5ee1af23641bcffc3f83af5b2 (patch)
tree590639d50205d1bcfaff2a7d2dc6ebf3f373c7ed /iup/srcole/tLegacy.cpp
Initial import. Contains the im, cd and iup librairies, and a "working" Makefile for them under linux.
Diffstat (limited to 'iup/srcole/tLegacy.cpp')
-rwxr-xr-xiup/srcole/tLegacy.cpp240
1 files changed, 240 insertions, 0 deletions
diff --git a/iup/srcole/tLegacy.cpp b/iup/srcole/tLegacy.cpp
new file mode 100755
index 0000000..c310865
--- /dev/null
+++ b/iup/srcole/tLegacy.cpp
@@ -0,0 +1,240 @@
+// legacy.cpp
+
+#include <windows.h>
+#include "tLegacy.h"
+
+
+/*
+ * RectConvertMappings
+ *
+ * Purpose:
+ * Converts the contents of a rectangle from device to logical
+ * coordinates where the hDC defines the logical coordinates.
+ *
+ * Parameters:
+ * pRect LPRECT containing the rectangle to convert.
+ * hDC HDC describing the logical coordinate system.
+ * if NULL, uses a screen DC in MM_LOMETRIC.
+ * fToDevice BOOL TRUE to convert from uConv to device,
+ * FALSE to convert device to uConv.
+ *
+ * Return Value:
+ * None
+ */
+
+
+void RectConvertMappings(LPRECT pRect, HDC hDC, BOOL fToDevice)
+ {
+ POINT rgpt[2];
+ BOOL fSysDC=FALSE;
+
+ if (NULL==pRect)
+ return;
+
+ rgpt[0].x=pRect->left;
+ rgpt[0].y=pRect->top;
+ rgpt[1].x=pRect->right;
+ rgpt[1].y=pRect->bottom;
+
+ if (NULL==hDC)
+ {
+ hDC=GetDC(NULL);
+ SetMapMode(hDC, MM_LOMETRIC);
+ fSysDC=TRUE;
+ }
+
+ if (fToDevice)
+ LPtoDP(hDC, rgpt, 2);
+ else
+ DPtoLP(hDC, rgpt, 2);
+
+ if (fSysDC)
+ ReleaseDC(NULL, hDC);
+
+ pRect->left=rgpt[0].x;
+ pRect->top=rgpt[0].y;
+ pRect->right=rgpt[1].x;
+ pRect->bottom=rgpt[1].y;
+
+ return;
+ }
+
+STDAPI_(void) XformRectInHimetricToPixels(HDC hDC, LPRECT prcHiMetric
+ , LPRECT prcPix)
+ {
+ int iXppli; //Pixels per logical inch along width
+ int iYppli; //Pixels per logical inch along height
+ int iXextInHiMetric=(prcHiMetric->right-prcHiMetric->left);
+ int iYextInHiMetric=(prcHiMetric->bottom-prcHiMetric->top);
+ BOOL fSystemDC=FALSE;
+
+ if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0)
+ {
+ hDC=GetDC(NULL);
+ fSystemDC=TRUE;
+ }
+
+ iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
+ iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
+
+ //We got pixel units, convert them to logical HIMETRIC along the display
+ prcPix->right=MAP_LOGHIM_TO_PIX(iXextInHiMetric, iXppli);
+ prcPix->top =MAP_LOGHIM_TO_PIX(iYextInHiMetric, iYppli);
+
+ prcPix->left =0;
+ prcPix->bottom= 0;
+
+ if (fSystemDC)
+ ReleaseDC(NULL, hDC);
+
+ return;
+ }
+/*
+ * INOLE_SetIconInCache
+ *
+ * Purpose:
+ * Stores an iconic presentation metafile in the cache.
+ *
+ * Parameters:
+ * pObj IUnknown * of the object.
+ * hMetaPict HGLOBAL containing the presentation.
+ *
+ * Return Value:
+ * HRESULT From IOleCache::SetData.
+ */
+
+#if 0
+STDAPI INOLE_SetIconInCache(IUnknown *pObj, HGLOBAL hMetaPict)
+ {
+ IOleCache *pCache;
+ FORMATETC fe;
+ STGMEDIUM stm;
+ HRESULT hr;
+
+ if (NULL==hMetaPict)
+ return ResultFromScode(E_INVALIDARG);
+
+ if (FAILED(pObj->QueryInterface(IID_IOleCache, (void **)&pCache)))
+ return ResultFromScode(E_NOINTERFACE);
+
+ SETFormatEtc(fe, CF_METAFILEPICT, DVASPECT_ICON, NULL
+ , TYMED_MFPICT, -1);
+
+ stm.tymed=TYMED_MFPICT;
+ stm.hGlobal=hMetaPict;
+ stm.pUnkForRelease=NULL;
+
+ hr=pCache->SetData(&fe, &stm, FALSE);
+ pCache->Release();
+
+ return hr;
+ }
+#endif
+
+
+
+/*
+ * XformRectInPixelsToHimetric
+ * XformRectInHimetricToPixels
+ *
+ * Purpose:
+ * Convert a rectangle between pixels of a given hDC and HIMETRIC units
+ * as manipulated in OLE. If the hDC is NULL, then a screen DC is used
+ * and assumes the MM_TEXT mapping mode.
+ *
+ * Parameters:
+ * hDC HDC providing reference to the pixel mapping. If
+ * NULL, a screen DC is used.
+ * prcPix LPRECT containng the rectangles to convert.
+ * prcHiMetric
+ *
+ * Return Value:
+ * None
+ *
+ * NOTE:
+ * When displaying on the screen, Window apps display everything enlarged
+ * from its actual size so that it is easier to read. For example, if an
+ * app wants to display a 1in. horizontal line, that when printed is
+ * actually a 1in. line on the printed page, then it will display the line
+ * on the screen physically larger than 1in. This is described as a line
+ * that is "logically" 1in. along the display width. Windows maintains as
+ * part of the device-specific information about a given display device:
+ * LOGPIXELSX -- no. of pixels per logical in along the display width
+ * LOGPIXELSY -- no. of pixels per logical in along the display height
+ *
+ * The following formula converts a distance in pixels into its equivalent
+ * logical HIMETRIC units:
+ *
+ * DistInHiMetric=(HIMETRIC_PER_INCH * DistInPix)
+ * -------------------------------
+ * PIXELS_PER_LOGICAL_IN
+ *
+ * Rect in Pixels (MM_TEXT):
+ *
+ * 0---------- X
+ * |
+ * | 1) ------------------ ( 2 P1=(rc.left, rc.top)
+ * | | | P2=(rc.right, rc.top)
+ * | | | P3=(rc.left, rc.bottom)
+ * | | | P4=(rc.right, rc.bottom)
+ * | |
+ * Y | |
+ * 3) ------------------ ( 4
+ *
+ * NOTE: Origin =(P1x, P1y)
+ * X extent=P4x - P1x
+ * Y extent=P4y - P1y
+ *
+ *
+ * Rect in Himetric (MM_HIMETRIC):
+ *
+ *
+ * 1) ------------------ ( 2 P1=(rc.left, rc.top)
+ * Y | | P2=(rc.right, rc.top)
+ * | | P3=(rc.left, rc.bottom)
+ * | | | P4=(rc.right, rc.bottom)
+ * | | |
+ * | | |
+ * | 3) ------------------ ( 4
+ * |
+ * 0---------- X
+ *
+ * NOTE: Origin =(P3x, P3y)
+ * X extent=P2x - P3x
+ * Y extent=P2y - P3y
+ *
+ *
+ */
+
+STDAPI_(void) XformRectInPixelsToHimetric(HDC hDC, LPRECT prcPix
+ , LPRECT prcHiMetric)
+ {
+ int iXppli; //Pixels per logical inch along width
+ int iYppli; //Pixels per logical inch along height
+ int iXextInPix=(prcPix->right-prcPix->left);
+ int iYextInPix=(prcPix->bottom-prcPix->top);
+ BOOL fSystemDC=FALSE;
+
+ if (NULL==hDC || GetDeviceCaps(hDC, LOGPIXELSX) == 0)
+ {
+ hDC=GetDC(NULL);
+ fSystemDC=TRUE;
+ }
+
+ iXppli=GetDeviceCaps (hDC, LOGPIXELSX);
+ iYppli=GetDeviceCaps (hDC, LOGPIXELSY);
+
+ //We got pixel units, convert them to logical HIMETRIC along the display
+ prcHiMetric->right=MAP_PIX_TO_LOGHIM(iXextInPix, iXppli);
+ prcHiMetric->top =MAP_PIX_TO_LOGHIM(iYextInPix, iYppli);
+
+ prcHiMetric->left =0;
+ prcHiMetric->bottom =0;
+
+ if (fSystemDC)
+ ReleaseDC(NULL, hDC);
+
+ return;
+ }
+
+