示例#1
0
void CCoorConvert::UpdateWindow()
{
    POINT ptDP1 = { m_ViewRect.right / 2, m_ViewRect.bottom / 2 };
    
    POINT ptDP2;
    LPToDP( m_ptMapCenter, ptDP2 );
    
    m_nOffsetX += ptDP1.x - ptDP2.x;
    m_nOffsetY += ptDP1.y - ptDP2.y;
    
    UpdateClipRect();
    m_nScaleValue = FLOAT_TO_LONG( DPIXELS_IN_METER / ( m_dScale * LPIXELS_IN_METER ) );
}
示例#2
0
int CReadEMF::EnhMetaFileProc(
	  HDC hhDC,                    // handle to device context
	  HANDLETABLE FAR *lpHTable,  // pointer to metafile handle table
	  ENHMETARECORD FAR *lpEMFR,  // pointer to metafile record
	  int nObj                   // count of objects
	)
{
	CComPtr<IPDDocument> pddoc;
	m_group->get_document(&pddoc);

	//	CESvgDocument* pDoc = (CESvgDocument*)lpData;
//	ASSERT(pDoc);

	switch (lpEMFR->iType)
	{
// Do nothing for these records
	case EMR_HEADER:
		break;
		
	case EMR_GDICOMMENT:
		break;
		
		// Palette Stuff / Do nothing
	case EMR_CREATEPALETTE:
		{
			//	PEMRCREATEPALETTE pEMR = (PEMRCREATEPALETTE)lpEMFR;
			TRACE("EMR_CREATEPALETTE (unhandled)\n");
		}
		break;
		
	case EMR_SELECTPALETTE:
		{
			//	PEMRSELECTPALETTE pEMR = (PEMRSELECTPALETTE)lpEMFR;
			TRACE("EMR_SELECTPALETTE (unhandled)\n");
		}
		break;
		
	case EMR_REALIZEPALETTE:
		{
			//	PEMRREALIZEPALETTE pEMR = (PEMRREALIZEPALETTE)lpEMFR;
				TRACE("EMR_REALIZEPALETTE (unhandled)\n");
		}
		break;
		
		// Mapping mode and coordinate translations
	case EMR_SETMAPMODE:
		{
			TRACE("EMR_SETMAPMODE:\n");

			PEMRSETMAPMODE	pEMR = (PEMRSETMAPMODE)lpEMFR;
			
			::SetMapMode(hDC, pEMR->iMode);
		}
		break;
		
	case EMR_SETVIEWPORTEXTEX:
		{
			TRACE("EMR_SETVIEWPORTEXTEX:\n");

			PEMRSETVIEWPORTEXTEX pEMR = (PEMRSETVIEWPORTEXTEX)lpEMFR;
			::SetViewportExtEx(hDC, pEMR->szlExtent.cx, pEMR->szlExtent.cy, NULL);
		}
		break;
		
	case EMR_SETWINDOWEXTEX:
		{
			TRACE("EMR_SETWINDOWEXTEX:\n");

			PEMRSETWINDOWEXTEX pEMR = (PEMRSETWINDOWEXTEX)lpEMFR;
			::SetWindowExtEx(hDC, pEMR->szlExtent.cx, pEMR->szlExtent.cy, NULL);
		}
		break;
		
	case EMR_SETVIEWPORTORGEX:
		{
			TRACE("EMR_SETVIEWPORTORGEX:\n");

			PEMRSETVIEWPORTORGEX pEMR = (PEMRSETVIEWPORTORGEX)lpEMFR;
			::SetViewportOrgEx(hDC, pEMR->ptlOrigin.x, pEMR->ptlOrigin.y, NULL);
		}
		break;
		
	case EMR_SETWINDOWORGEX:
		{
			TRACE("EMR_SETWINDOWORGEX:\n");
			PEMRSETWINDOWORGEX pEMR = (PEMRSETWINDOWORGEX)lpEMFR;
			::SetWindowOrgEx(hDC, pEMR->ptlOrigin.x, pEMR->ptlOrigin.y, NULL);
		}
		break;
		
	case EMR_SCALEVIEWPORTEXTEX:
		{
			TRACE("EMR_SCALEVIEWPORTEXTEX:\n");
			PEMRSCALEVIEWPORTEXTEX pEMR = (PEMRSCALEVIEWPORTEXTEX)lpEMFR;
			::ScaleViewportExtEx(hDC, pEMR->xNum, pEMR->xDenom, pEMR->yNum, pEMR->yDenom, NULL);
		}
		break;
		
	case EMR_SCALEWINDOWEXTEX:
		{
			TRACE("EMR_SCALEWINDOWEXTEX:\n");
			PEMRSCALEWINDOWEXTEX pEMR = (PEMRSCALEWINDOWEXTEX)lpEMFR;
			::ScaleWindowExtEx(hDC, pEMR->xNum, pEMR->xDenom, pEMR->yNum, pEMR->yDenom, NULL);
		}
		break;
		
		// GDI Objects
	case EMR_SELECTOBJECT:
		{
			TRACE("EMR_SELECTOBJECT\n");
			PEMRSELECTOBJECT pEMR = (PEMRSELECTOBJECT)lpEMFR;
			
			CGdiObj* pObj = NULL;
			if (pEMR->ihObject & ENHMETA_STOCK_OBJECT)
			{
				int n = pEMR->ihObject & ~ENHMETA_STOCK_OBJECT;
				if (n >= 0 && n <= STOCK_LAST)
				{
					pObj = m_stockObjects[n];
				}
				//::SelectObject(hDC, ::GetStockObject(pEMR->ihObject & ~ENHMETA_STOCK_OBJECT));
			}
			else if (hTable[pEMR->ihObject])
			{
				pObj = hTable[pEMR->ihObject];
				//::SelectObject(hDC, hTable[pEMR->ihObject]);
			}

			if (pObj)
			{
				if (pObj->m_type == OBJ_BRUSH)
					m_pCurrentBrush = (CGdiBrush*)pObj;
				else if (pObj->m_type == OBJ_PEN)
					m_pCurrentPen = (CGdiPen*)pObj;
			}
		}
		break;
		
	case EMR_DELETEOBJECT:
		{
			TRACE("EMR_DELETEOBJECT\n");
			PEMRDELETEOBJECT pEMR = (PEMRDELETEOBJECT)lpEMFR;
			
			if (hTable[pEMR->ihObject])
			{
				delete hTable[pEMR->ihObject];
				//::DeleteObject(hTable[pEMR->ihObject]);
				hTable[pEMR->ihObject] = NULL;
			}
		}
		break;
		
	case EMR_CREATEPEN:
		{
			TRACE("EMR_CREATEPEN\n");

			PEMRCREATEPEN pEMR = (PEMRCREATEPEN)lpEMFR;
			/*
			
			HPEN hPen = ::CreatePenIndirect(&pEMR->lopn);
			hTable[pEMR->ihPen] = hPen;
			*/

			CGdiPen* pPen = new CGdiPen;
			pPen->m_elp.elpColor = pEMR->lopn.lopnColor;
			pPen->m_elp.elpWidth = pEMR->lopn.lopnWidth.x;
			pPen->m_elp.elpPenStyle = pEMR->lopn.lopnStyle;
			hTable[pEMR->ihPen] = pPen;
		}
		break;

	case EMR_EXTCREATEPEN:
		{
			TRACE("EMR_EXTCREATEPEN\n");

			PEMREXTCREATEPEN pEMR = (PEMREXTCREATEPEN)lpEMFR;
			
			//PS_USERSTYLE
#if 0
			LOGBRUSH lb;
			lb.lbColor = pEMR->elp.elpColor;
			lb.lbHatch = 0;
			lb.lbStyle = BS_SOLID;
			HPEN hPen = ::ExtCreatePen(/*PS_SOLID | PS_GEOMETRIC*/pEMR->elp.elpPenStyle, pEMR->elp.elpWidth, &lb, pEMR->elp.elpNumEntries, NULL/*pEMR->elp.elpStyleEntry*/);
			ATLASSERT(hPen);
			hTable[pEMR->ihPen] = hPen;
#endif
			CGdiPen* pPen = new CGdiPen;
			pPen->m_elp = pEMR->elp;
			hTable[pEMR->ihPen] = pPen;
		}
		break;
		
	case EMR_CREATEBRUSHINDIRECT:
		{
			TRACE("EMR_CREATEBRUSHINDIRECT\n");

			PEMRCREATEBRUSHINDIRECT pEMR = (PEMRCREATEBRUSHINDIRECT)lpEMFR;
			
			//HBRUSH hBrush = ::CreateBrushIndirect((LOGBRUSH*)&pEMR->lb);
			//hTable[pEMR->ihBrush] = hBrush;
			CGdiBrush* pBrush = new CGdiBrush;
			pBrush->m_lb = pEMR->lb;

			hTable[pEMR->ihBrush] = pBrush;
		}
		break;
		
	case EMR_EXTCREATEFONTINDIRECTW:
		{
			TRACE("EMR_EXTCREATEFONTINDIRECTW\n");

		/*
			PEMREXTCREATEFONTINDIRECTW pEMR = (PEMREXTCREATEFONTINDIRECTW)lpEMFR;
			
			HFONT hFont = ::CreateFontIndirect((LPLOGFONT)&pEMR->elfw);
			hTable[pEMR->ihFont] = hFont;
			*/
		}
		break;
		
		// Transformations
	case EMR_SETWORLDTRANSFORM:	// TODO
		{
			TRACE("EMR_SETWORLDTRANSFORM (unhandled)\n");
		}
		break;
		
	case EMR_MODIFYWORLDTRANSFORM:	// TODO
		{
			TRACE("EMR_MODIFYWORLDTRANSFORM (unhandled)\n");
		}
		break;
		
		// Regions
	case EMR_INTERSECTCLIPRECT:
		{
			TRACE("EMR_INTERSECTCLIPRECT (unhandled)\n");
		}
		break;
		
	case EMR_EXTSELECTCLIPRGN:
		{
			PEMREXTSELECTCLIPRGN pEMR = (PEMREXTSELECTCLIPRGN)lpEMFR;
			TRACE("EMR_EXTSELECTCLIPRGN (unhandled)\n");
		}
		break;
		
		// DC State
	case EMR_SAVEDC:
		{
			TRACE("EMR_SAVEDC\n");

			PEMRSAVEDC pEMR = (PEMRSAVEDC)lpEMFR;
			::SaveDC(hDC);
		}
		break;
		
	case EMR_RESTOREDC:
		{
			TRACE("EMR_RESTOREDC\n");

			PEMRRESTOREDC pEMR = (PEMRRESTOREDC)lpEMFR;
			
			if (pEMR->iRelative > 0)
			{
				//	AfxMessageBox("restoredc is positive!!");
				pEMR->iRelative = -pEMR->iRelative;
			}
			
			::RestoreDC(hDC, pEMR->iRelative);
		}
		break;
		
		// GDI Modes
	case EMR_SETTEXTCOLOR:
		{
			TRACE("EMR_SETTEXTCOLOR\n");

			PEMRSETTEXTCOLOR pEMR = (PEMRSETTEXTCOLOR)lpEMFR;
			::SetTextColor(hDC, pEMR->crColor);
		}
		break;
		
	case EMR_SETBKCOLOR:
		{
			TRACE("EMR_SETBKCOLOR\n");

			PEMRSETBKCOLOR pEMR = (PEMRSETBKCOLOR)lpEMFR;
			::SetBkColor(hDC, pEMR->crColor);
		}
		break;
		
	case EMR_SETBKMODE:
		{
			TRACE("EMR_SETBKMODE\n");

			PEMRSETBKMODE pEMR = (PEMRSETBKMODE)lpEMFR;
			::SetBkMode(hDC, pEMR->iMode);
		}
		break;
		
	case EMR_SETPOLYFILLMODE:
		{
			TRACE("EMR_SETPOLYFILLMODE\n");

			PEMRSETPOLYFILLMODE pEMR = (PEMRSETPOLYFILLMODE)lpEMFR;
			::SetPolyFillMode(hDC, pEMR->iMode);
		}
		break;
		
	case EMR_SETROP2:
		{
			TRACE("EMR_SETROP2\n");

			PEMRSETROP2	pEMR = (PEMRSETROP2)lpEMFR;
			::SetROP2(hDC, pEMR->iMode);
		}
		break;
		
	case EMR_SETMAPPERFLAGS:
		{
			TRACE("EMR_SETMAPPERFLAGS\n");

			PEMRSETMAPPERFLAGS pEMR = (PEMRSETMAPPERFLAGS)lpEMFR;
			::SetMapperFlags(hDC, pEMR->dwFlags);
		}
		break;
		
	case EMR_MOVETOEX:
		{
			TRACE("EMR_MOVETOEX\n");

			PEMRMOVETOEX pEMR = (PEMRMOVETOEX)lpEMFR;

			::MoveToEx(hDC, pEMR->ptl.x, pEMR->ptl.y, NULL);

			m_startPt.x = pEMR->ptl.x;
			m_startPt.y = pEMR->ptl.y;

			if (m_curSubPath)	// Start new subpath
			{
				m_curSubPath.Release();
			}
		}
		break;
		
	case EMR_SETMITERLIMIT:
		{
			TRACE("EMR_SETMITERLIMIT\n");

			PEMRSETMITERLIMIT pEMR = (PEMRSETMITERLIMIT)lpEMFR;
			::SetMiterLimit(hDC, pEMR->eMiterLimit, NULL);
		}
		break;

		case EMR_BEGINPATH:
			{
				TRACE("EMR_BEGINPATH\n");

				if (m_curFrame == NULL)
				{
					pddoc->createObjectFrame(&m_curFrame);
					m_curFrame->get_path(&m_curPath);

					m_group->appendObject(m_curFrame);
				}
			}
			break;

		case EMR_STROKEPATH:
			{
				TRACE("EMR_STROKEPATH\n");

				if (m_curFrame)
				{
					SetShapeStroke(m_curFrame, &m_pCurrentPen->m_elp);

					m_group->appendObject(m_curFrame);

					m_curSubPath.Release();
					m_curPath.Release();
					m_curFrame.Release();
				}
			}
			break;

		case EMR_STROKEANDFILLPATH:
			{
				TRACE("EMR_STROKEANDFILLPATH\n");

				if (m_curFrame)
				{
					SetShapeFill(m_curFrame, &m_pCurrentBrush->m_lb);
					SetShapeStroke(m_curFrame, &m_pCurrentPen->m_elp);

					m_group->appendObject(m_curFrame);

					m_curSubPath.Release();
					m_curPath.Release();
					m_curFrame.Release();
				}
			}
			break;

// Geometric shapes
		case EMR_LINETO:
		{
			TRACE("EMR_LINETO\n");

			PEMRLINETO pEMR = (PEMRLINETO)lpEMFR;

			if (m_curSubPath)
			{
				BezierPoint bpt;

				LPToDP(hDC, pEMR->ptl.x, pEMR->ptl.y, &bpt.x, &bpt.y);
				ConvertPt(&bpt.x, &bpt.y);
				bpt.x1 = bpt.x;
				bpt.y1 = bpt.y;
				bpt.x2 = bpt.x;
				bpt.y2 = bpt.y;

				long index;
				m_curSubPath->appendPoint(bpt.x, bpt.y, bpt.x1, bpt.y1, bpt.x2, bpt.y2, &index);
			}

			MoveToEx(hDC, pEMR->ptl.x, pEMR->ptl.y, NULL);
		}
		break;

		case EMR_POLYGON16:
		case EMR_POLYLINE16:
			{
				PEMRPOLYGON16	pEMR = (PEMRPOLYGON16)lpEMFR;

				if (lpEMFR->iType == EMR_POLYGON16)
					TRACE("POLYGON16\n");
				else
					TRACE("POLYLINE16\n");

				BOOL bInPath;

				if (m_curFrame == NULL)
				{
					bInPath = FALSE;

					pddoc->createObjectFrame(&m_curFrame);

					m_curFrame->get_path(&m_curPath);

					m_curPath->createSubPath(&m_curSubPath);
					m_curPath->insertSubPath(-1, m_curSubPath);

					if (lpEMFR->iType == EMR_POLYGON16)
					{
						/*
						if (fillMode == WINDING)
							;//pLayer->m_fillType = 0;
						else if (fillMode == ALTERNATE)
							;//pLayer->m_fillType = 1;
						else
							ASSERT(0);
							*/

						m_curSubPath->put_closed(VARIANT_TRUE);

						SetShapeFill(m_curFrame, &m_pCurrentBrush->m_lb);
						SetShapeStroke(m_curFrame, &m_pCurrentPen->m_elp);
					}
					else
					{
						SetShapeStroke(m_curFrame, &m_pCurrentPen->m_elp);
					}
				}
				else
					bInPath = TRUE;

				for (int i = 0; i < pEMR->cpts; i++)
				{
					POINT	pt;
					pt.x = pEMR->apts[i].x;
					pt.y = pEMR->apts[i].y;

					BezierPoint bpt;
					LPToDP(hDC, pt.x, pt.y, &bpt.x, &bpt.y);
					ConvertPt(&bpt.x, &bpt.y);

					bpt.x1 = bpt.x;
					bpt.y1 = bpt.y;
					bpt.x2 = bpt.x;
					bpt.y2 = bpt.y;

					long index;
					m_curSubPath->appendPoint(bpt.x, bpt.y, bpt.x1, bpt.y1, bpt.x2, bpt.y2, &index);
				}

				if (!bInPath)
				{
					m_group->appendObject(m_curFrame);

					m_curSubPath.Release();
					m_curPath.Release();
					m_curFrame.Release();
				}
			}
			break;

		case EMR_POLYPOLYGON16:
		case EMR_POLYPOLYLINE16:
			{
				TRACE("POLYPOLYGON16/POLYPOLYLINE16 (unhandled)\n");
			}
			break;
			
		case EMR_RECTANGLE:
		case EMR_ELLIPSE:
			{
				TRACE("RECTANGLE/ELLIPSE\n");
			}
			break;

#if 0
		{
			CComPtr<IPDObjectFrame> element;

			HPEN hPen = (HPEN)::GetCurrentObject(hDC, OBJ_PEN);
			HBRUSH hBrush = (HBRUSH)::GetCurrentObject(hDC, OBJ_BRUSH);

			LOGPEN	lp;
			::GetObject(hPen, sizeof(lp), &lp);

			LOGBRUSH	lb;
			::GetObject(hBrush, sizeof(lb), &lb);

			int fillMode = ::GetPolyFillMode(hDC);

			switch (lpEMFR->iType)
			{
				case EMR_POLYGON16:
				case EMR_POLYLINE16:
				{
					TRACE("POLYGON16/POLYLINE16\n");

					/*
					PEMRPOLYGON16	pEMR = (PEMRPOLYGON16)lpEMFR;

					pddoc->createObjectFrame(&element);

					CComPtr<IPDPath> pathData;
					element->get_path(&pathData);

					if (lpEMFR->iType == EMR_POLYGON16)
					{
					//	pLayer->m_name.Format("Polygon");

						if (fillMode == WINDING)
							;//pLayer->m_fillType = 0;
						else if (fillMode == ALTERNATE)
							;//pLayer->m_fillType = 1;
						else
							ASSERT(0);
					}
					else
					{
					//	pLayer->m_name.Format("Polyline");
					}

					SetShapeStrokeFill(path, &lp, (EMR_POLYGON16)? &lb: NULL);

					int j = 0;
					for (DWORD i = 0; i < pEMR->cpts; i++)
					{
						POINT	pt;
						pt.x = pEMR->apts[i].x;
						pt.y = pEMR->apts[i].y;

						::LPtoDP(hDC, &pt, 1);

						if (i == 0)
						{
							SVGLib::ISVGPathSegMovetoAbsPtr moveto = path->createSVGPathSegMovetoAbs(pt.x, pt.y);
							pathData->pathSegList->appendItem(moveto);
						}
						else
						{
							SVGLib::ISVGPathSegLinetoAbsPtr lineto = path->createSVGPathSegLinetoAbs(pt.x, pt.y);
							pathData->pathSegList->appendItem(lineto);
						}
					}

					element = path;
					*/
				}
				break;

				case EMR_POLYPOLYGON16:
				case EMR_POLYPOLYLINE16:
				{
					TRACE("POLYPOLYGON16/POLYPOLYLINE16 (unhandled)\n");

					/*
					PEMRPOLYPOLYGON16 pEMR = (PEMRPOLYPOLYGON16)lpEMFR;

					POINTS* apts = (POINTS*)(((LPBYTE)pEMR->apts) + (pEMR->nPolys-1)*4);

					SVGLib::ISVGPathElementPtr path = pDoc->GetDOMDocument()->createElement(L"path");
					SVGLib::ISVGAnimatedPathDataPtr pathData = path;

					for (DWORD nPoly = 0; nPoly < pEMR->nPolys; nPoly++)
					{
					//	pLayer->SetShapeStrokeFill(&lp, (lpEMFR->iType == EMR_POLYPOLYGON16) ? &lb: NULL);

						if (lpEMFR->iType == EMR_POLYPOLYGON16)
						{
							if (fillMode == WINDING)
								;//pLayer->m_fillType = 0;
							else// if (fillMode == ALTERNATE)
								;//pLayer->m_fillType = 1;
						}
						else
						{
						}

						int j = 0;

						for (DWORD i = 0; i < pEMR->aPolyCounts[nPoly]; i++)
						{
							POINT	pt;
							pt.x = apts->x;
							pt.y = apts->y;
							apts++;

							::LPtoDP(hDC, &pt, 1);

							if (i == 0)
							{
								SVGLib::ISVGPathSegMovetoAbsPtr moveto = path->createSVGPathSegMovetoAbs(pt.x, pt.y);
								pathData->pathSegList->appendItem(moveto);
							}
							else
							{
								SVGLib::ISVGPathSegLinetoAbsPtr lineto = path->createSVGPathSegLinetoAbs(pt.x, pt.y);
								pathData->pathSegList->appendItem(lineto);
							}
						}
					}

					element = path;
					*/
				}
				break;

				case EMR_RECTANGLE:
				case EMR_ELLIPSE:
				{
					/*
					PEMRRECTANGLE	pEMR = (PEMRRECTANGLE)lpEMFR;

					CRect	r;
					r.left = pEMR->rclBox.left;
					r.right = pEMR->rclBox.right;
					r.top = pEMR->rclBox.top;
					r.bottom = pEMR->rclBox.bottom;
					::LPtoDP(hDC, (LPPOINT)&r, 2);

					if (lpEMFR->iType == EMR_RECTANGLE)
					{
						SVGLib::ISVGRectElementPtr rect = pDoc->GetDOMDocument()->createElement(L"rect");
						rect->x->baseVal->value = r.left;
						rect->y->baseVal->value = r.top;
						rect->width->baseVal->value = r.Width();
						rect->height->baseVal->value = r.Height();

						element = rect;
					}
					else if (lpEMFR->iType == EMR_ELLIPSE)
					{
						SVGLib::ISVGEllipseElementPtr ellipse = pDoc->GetDOMDocument()->createElement(L"ellipse");
						ellipse->cx->baseVal->value = r.left + r.Width()/2;
						ellipse->cy->baseVal->value = r.top + r.Height()/2;
						ellipse->rx->baseVal->value = r.Width()/2;
						ellipse->ry->baseVal->value = r.Height()/2;

						element = ellipse;
					}

					SetShapeStrokeFill(element, &lp, &lb);
					*/
				}
				break;
			}

			if (element)
			{
				m_group->appendObject(element);
			}
		}
		break;
#endif

		case EMR_POLYBEZIER16:
			{
				TRACE("EMR_POLYBEZIER16: (unhandled)\n");
			}
			break;

		case EMR_POLYBEZIERTO16:
			{
				TRACE("EMR_POLYBEZIERTO16:\n");
				
				PEMRPOLYBEZIERTO16 pEMR = (PEMRPOLYBEZIERTO16)lpEMFR;
				
				POINT pt;
				GetCurrentPositionEx(hDC, &pt);
				
				BezierPoint bpt;
				
				if (m_curSubPath == NULL)
				{
					m_curPath->createSubPath(&m_curSubPath);
					m_curPath->insertSubPath(-1, m_curSubPath);
				}

				LPToDP(hDC, pt.x, pt.y, &bpt.x, &bpt.y);
				ConvertPt(&bpt.x, &bpt.y);

				bpt.x1 = bpt.x;
				bpt.y1 = bpt.y;
				
				ATLASSERT((pEMR->cpts % 3) == 0);
				
				for (int i = 0; i < pEMR->cpts; i += 3)
				{
					LPToDP(hDC, pEMR->apts[i].x, pEMR->apts[i].y, &bpt.x2, &bpt.y2);
					ConvertPt(&bpt.x2, &bpt.y2);
					
					long index;
					m_curSubPath->appendPoint(bpt.x, bpt.y, bpt.x1, bpt.y1, bpt.x2, bpt.y2, &index);

					LPToDP(hDC, pEMR->apts[i+1].x, pEMR->apts[i+1].y, &bpt.x1, &bpt.y1);
					ConvertPt(&bpt.x1, &bpt.y1);

					LPToDP(hDC, pEMR->apts[i+2].x, pEMR->apts[i+2].y, &bpt.x, &bpt.y);
					ConvertPt(&bpt.x, &bpt.y);
				}
				
				bpt.x2 = bpt.x;
				bpt.y2 = bpt.y;
				
				long index;
				m_curSubPath->appendPoint(bpt.x, bpt.y, bpt.x1, bpt.y1, bpt.x2, bpt.y2, &index);
				
				MoveToEx(hDC, pEMR->apts[i-1].x, pEMR->apts[i-1].y, NULL);
			}
			break;

		case EMR_CLOSEFIGURE:
			{
				TRACE("EMR_CLOSEFIGURE:\n");

				if (m_curSubPath)
				{
					m_curSubPath->put_closed(VARIANT_TRUE);
					m_curSubPath.Release();

					/*	Have this ?????
					BezierPoint bpt;

					LPToDP(hDC, m_startPt.x, m_startPt.y, &bpt.x, &bpt.y);
					ConvertPt(&bpt.x, &bpt.y);
					bpt.x1 = bpt.x;
					bpt.y1 = bpt.y;
					bpt.x2 = bpt.x;
					bpt.y2 = bpt.y;

					long index;
					m_curSubPath->appendPoint(bpt.x, bpt.y, bpt.x1, bpt.y1, bpt.x2, bpt.y2, &index);
					*/
				}
			}
			break;

		case EMR_ROUNDRECT:	// TODO
			{
				TRACE("EMR_ROUNDRECT: (unhandled)\n");
			}
			break;
			
		case EMR_ARC:	// TODO
			{
				TRACE("EMR_ARC: (unhandled)\n");
			}
			break;
			
		case EMR_PIE:	// TODO
			{
				TRACE("EMR_PIE: (unhandled)\n");
			}
			break;
			
		case EMR_CHORD:	// TODO
			{
				TRACE("EMR_CHORD: (unhandled)\n");
			}
			break;
			
		case EMR_ANGLEARC:	// TODO
			{
				TRACE("EMR_ANGLEARC: (unhandled)\n");
			}
			break;
			
		case EMR_ARCTO:
			{
				TRACE("EMR_ARCTO: (unhandled)\n");
			}
			break;
			
			// Bitmap Stuff (in order of importance)
		case EMR_BITBLT:	// TODO
			{
				PEMRBITBLT pEMR = (PEMRBITBLT)lpEMFR;
				
				//	pEMR->
				TRACE("EMR_BITBLT: (unhandled)\n");
			}
			break;
			
		case EMR_STRETCHDIBITS:	// TODO
			{
				TRACE("EMR_STRETCHDIBITS: (unhandled)\n");
			}
			break;
			
		case EMR_STRETCHBLT:	// TODO
			{
				TRACE("EMR_STRETCHBLT: (unhandled)\n");
			}
			break;
			
		case EMR_SETDIBITSTODEVICE:	// TODO
			{
				TRACE("EMR_SETDIBITSTODEVICE: (unhandled)\n");
			}
			break;
			
		case EMR_MASKBLT:
			{
				TRACE("EMR_MASKBLT: (unhandled)\n");
			}
			break;
			
		case EMR_PLGBLT:
			{
				TRACE("EMR_PLGBLT: (unhandled)\n");
			}
			break;
			
		case EMR_ALPHABLEND:	// TODO
			{
				TRACE("EMR_ALPHABLEND: (unhandled)\n");
			}
			break;
			
		case 115: //EMR_ALPHADIBBLEND:	// TODO
			{
				TRACE("EMR_ALPHADIBBLEND: (unhandled)\n");
			}
			break;
			
		case EMR_TRANSPARENTBLT:
			{
				TRACE("EMR_TRANSPARENTBLT: (unhandled)\n");
			}
			break;
			
		case 117: //EMR_TRANSPARENTDIB:
			{
				TRACE("EMR_TRANSPARENTDIB: (unhandled)\n");
			}
			break;
			
		case 118: //EMR_GRADIENTFILL:
			{
				TRACE("EMR_GRADIENTFILL: (unhandled)\n");
			}
			break;
			
		case EMR_SETPIXELV:
			{
				TRACE("EMR_SETPIXELV: (unhandled)\n");
			}
			break;
			
			// Text Stuff
		case EMR_EXTTEXTOUTA:	// TODO
		case EMR_EXTTEXTOUTW:
			{
				TRACE("EMR_EXTTEXTOUT: (unhandled)\n");
			}
			break;
			
		case EMR_POLYTEXTOUTA:	// TODO
		case EMR_POLYTEXTOUTW:
			{
				TRACE("EMR_POLYTEXTOUT: (unhandled)\n");
			}
			break;
			
			// End of file
		case EMR_EOF:
			{
				PEMREOF pEMR = (PEMREOF)lpEMFR;
				return 0;
			}
			break;
			
		default:	// Unknown record type
			{
				ATLTRACE("Unknown iType: %d\n", lpEMFR->iType);
			}
			break;
	}
	
	return 1;
}