void KDCAttributes::DumpDC(HDC hDC) { POINT pnt; SIZE size; m_List.DeleteAll(); Add(_T("Technology"), _T("%d"), GetDeviceCaps(hDC, TECHNOLOGY)); Add(_T("width"), _T("%d"), GetDeviceCaps(hDC, HORZRES)); Add(_T("height"), _T("%d"), GetDeviceCaps(hDC, VERTRES)); GetDCOrgEx(hDC, & pnt); Add(_T("DC Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); TCHAR szTitle[MAX_PATH]; szTitle[0] = 0; GetWindowText(WindowFromDC(hDC), szTitle, MAX_PATH); Add(_T("Window"), _T("0x%X \"%s\""), WindowFromDC(hDC), szTitle); Add(_T("Bitmap"), _T("0x%X"), GetCurrentObject(hDC, OBJ_BITMAP)); Add(_T("Graphics Mode"), _T("%d"), GetGraphicsMode(hDC)); Add(_T("Mapping Mode"), _T("%d"), GetMapMode(hDC)); GetViewportExtEx(hDC, & size); Add(_T("Viewport Extent"), _T("{ %d, %d }"), size.cx, size.cy); GetViewportOrgEx(hDC, & pnt); Add(_T("Viewport Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); GetWindowExtEx(hDC, & size); Add(_T("Window Extent"), _T("{ %d, %d }"), size.cx, size.cy); GetWindowOrgEx(hDC, & pnt); Add(_T("Window Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); XFORM xform; GetWorldTransform(hDC, & xform); Add(_T("World transformation"), _T("{ %f, %f, %f, %f, %f, %f }"), xform.eM11, xform.eM12, xform.eM21, xform.eM22, xform.eDx, xform.eDy); // transformation Add(_T("Background Color"), _T("0x%X"), GetBkColor(hDC)); Add(_T("Text Color"), _T("0x%X"), GetTextColor(hDC)); Add(_T("Palette"), _T("0x%X"), GetCurrentObject(hDC, OBJ_PAL)); { COLORADJUSTMENT ca; GetColorAdjustment(hDC, & ca); Add(_T("Color Adjustment"), _T("{ %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d }"), ca.caSize, ca.caFlags, ca.caIlluminantIndex, ca.caRedGamma, ca.caGreenGamma, ca.caBlueGamma, ca.caReferenceBlack, ca.caReferenceWhite, ca.caContrast, ca.caBrightness, ca.caColorfulness, ca.caRedGreenTint); } Add(_T("Color Space"), _T("0x%X"), GetColorSpace(hDC)); Add(_T("ICM Mode"), _T("%d"), SetICMMode(hDC, ICM_QUERY)); { TCHAR szProfile[MAX_PATH]; DWORD dwSize = MAX_PATH; szProfile[0] = 0; GetICMProfile(hDC, & dwSize, szProfile); Add(_T("ICM Profile"), _T("%s"), szProfile); } GetCurrentPositionEx(hDC, & pnt); Add(_T("Current Position"), _T("{ %d, %d }"), pnt.x, pnt.y); Add(_T("ROP2"), _T("%d"), GetROP2(hDC)); Add(_T("Background Mode"), _T("%d"), GetBkMode(hDC)); Add(_T("Logical Pen"), _T("0x%X"), GetCurrentObject(hDC, OBJ_PEN)); Add(_T("DC Pen Color"), _T("0x%X"), GetDCPenColor(hDC)); Add(_T("Arc Direction"), _T("%d"), GetArcDirection(hDC)); FLOAT miter; GetMiterLimit(hDC, & miter); Add(_T("Miter Limit"), _T("%f"), miter); Add(_T("Logical Brush"), _T("0x%X"), GetCurrentObject(hDC, OBJ_BRUSH)); Add(_T("DC Brush Color"), _T("0x%X"), GetDCBrushColor(hDC)); GetBrushOrgEx(hDC, & pnt); Add(_T("Brush Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); Add(_T("Polygon Filling Mode"), _T("%d"), GetPolyFillMode(hDC)); Add(_T("Bitmap Stretching Mode"), _T("%d"), GetStretchBltMode(hDC)); Add(_T("Logical Font"), _T("0x%X"), GetCurrentObject(hDC, OBJ_FONT)); Add(_T("Inter-character spacing"), _T("%d"), GetTextCharacterExtra(hDC)); DWORD flag = SetMapperFlags(hDC, 0); SetMapperFlags(hDC, flag); Add(_T("Font Mapper Flags"), _T("0x%X"), flag); Add(_T("Text Alignment"), _T("0x%X"), GetTextAlign(hDC)); Add(_T("Text Justification"), _T("write only"), 0); Add(_T("Layout"), _T("%d"), GetLayout(hDC)); Add(_T("Path"), _T("%d bytes"), GetPath(hDC, NULL, NULL, 0)); RECT rect; int typ = GetClipBox(hDC, & rect); HRGN hRgn = CreateRectRgn(0, 0, 1, 1); GetClipRgn(hDC, hRgn); Add(_T("Clipping"), _T("type %d clip box { %d, %d, %d, %d } size %d bytes"), typ, rect.left, rect.top, rect.right, rect.bottom, GetRegionData(hRgn, 0, NULL) ); GetMetaRgn(hDC, hRgn); GetRgnBox(hRgn, & rect); Add(_T("Meta Region"), _T("size %d bytes, rgn box { %d, %d, %d, %d }"), GetRegionData(hRgn, 0, NULL), rect.left, rect.top, rect.right, rect.bottom); for (int i=1; i<=5; i++) { int rslt = GetRandomRgn(hDC, hRgn, i); if ( rslt==1 ) { GetRgnBox(hRgn, & rect); Add(_T("Random Region"), _T("size %d bytes, rgn box { %d, %d, %d, %d }"), GetRegionData(hRgn, 0, NULL), rect.left, rect.top, rect.right, rect.bottom); } else if ( rslt==0 ) Add(_T("Random Region"), _T("NULL"), 0); else Add(_T("Random Region"), _T("FAIL"), 0); } DeleteObject(hRgn); GetBoundsRect(hDC, & rect, 0); Add(_T("Bounds Rectangle"), _T("{ %d, %d, %d, %d }"), rect.left, rect.top, rect.right, rect.bottom); }
/*********************************************************************** * SelectPen (X11DRV.@) */ HPEN X11DRV_SelectPen( PHYSDEV dev, HPEN hpen ) { static const char PEN_dash[] = { 16,8 }; static const char PEN_dot[] = { 4,4 }; static const char PEN_dashdot[] = { 12,8,4,8 }; static const char PEN_dashdotdot[] = { 12,4,4,4,4,4 }; static const char PEN_alternate[] = { 1,1 }; static const char EXTPEN_dash[] = { 3,1 }; static const char EXTPEN_dot[] = { 1,1 }; static const char EXTPEN_dashdot[] = { 3,1,1,1 }; static const char EXTPEN_dashdotdot[] = { 3,1,1,1,1,1 }; X11DRV_PDEVICE *physDev = get_x11drv_dev( dev ); LOGPEN logpen; int i; if (!GetObjectW( hpen, sizeof(logpen), &logpen )) { /* must be an extended pen */ EXTLOGPEN *elp; INT size = GetObjectW( hpen, 0, NULL ); if (!size) return 0; physDev->pen.ext = 1; elp = HeapAlloc( GetProcessHeap(), 0, size ); GetObjectW( hpen, size, elp ); /* FIXME: add support for user style pens */ logpen.lopnStyle = elp->elpPenStyle; logpen.lopnWidth.x = elp->elpWidth; logpen.lopnWidth.y = 0; logpen.lopnColor = elp->elpColor; HeapFree( GetProcessHeap(), 0, elp ); } else physDev->pen.ext = 0; physDev->pen.style = logpen.lopnStyle & PS_STYLE_MASK; physDev->pen.type = logpen.lopnStyle & PS_TYPE_MASK; physDev->pen.endcap = logpen.lopnStyle & PS_ENDCAP_MASK; physDev->pen.linejoin = logpen.lopnStyle & PS_JOIN_MASK; physDev->pen.width = logpen.lopnWidth.x; if ((logpen.lopnStyle & PS_GEOMETRIC) || (physDev->pen.width >= 1)) { physDev->pen.width = X11DRV_XWStoDS( dev->hdc, physDev->pen.width ); if (physDev->pen.width < 0) physDev->pen.width = -physDev->pen.width; } if (physDev->pen.width == 1) physDev->pen.width = 0; /* Faster */ if (hpen == GetStockObject( DC_PEN )) logpen.lopnColor = GetDCPenColor( dev->hdc ); physDev->pen.pixel = X11DRV_PALETTE_ToPhysical( physDev, logpen.lopnColor ); switch(logpen.lopnStyle & PS_STYLE_MASK) { case PS_DASH: physDev->pen.dash_len = sizeof(PEN_dash)/sizeof(*PEN_dash); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dash : PEN_dash, physDev->pen.dash_len); break; case PS_DOT: physDev->pen.dash_len = sizeof(PEN_dot)/sizeof(*PEN_dot); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dot : PEN_dot, physDev->pen.dash_len); break; case PS_DASHDOT: physDev->pen.dash_len = sizeof(PEN_dashdot)/sizeof(*PEN_dashdot); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dashdot : PEN_dashdot, physDev->pen.dash_len); break; case PS_DASHDOTDOT: physDev->pen.dash_len = sizeof(PEN_dashdotdot)/sizeof(*PEN_dashdotdot); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dashdotdot : PEN_dashdotdot, physDev->pen.dash_len); break; case PS_ALTERNATE: physDev->pen.dash_len = sizeof(PEN_alternate)/sizeof(*PEN_alternate); memcpy(physDev->pen.dashes, PEN_alternate, physDev->pen.dash_len); break; case PS_USERSTYLE: FIXME("PS_USERSTYLE is not supported\n"); /* fall through */ default: physDev->pen.dash_len = 0; break; } if(physDev->pen.ext && physDev->pen.dash_len && (logpen.lopnStyle & PS_STYLE_MASK) != PS_ALTERNATE) for(i = 0; i < physDev->pen.dash_len; i++) physDev->pen.dashes[i] *= (physDev->pen.width ? physDev->pen.width : 1); return hpen; }
/*********************************************************************** * dibdrv_SelectPen */ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectPen ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); LOGPEN logpen; DWORD style; TRACE("(%p, %p)\n", dev, hpen); if (!GetObjectW( hpen, sizeof(logpen), &logpen )) { /* must be an extended pen */ EXTLOGPEN *elp; INT size = GetObjectW( hpen, 0, NULL ); if (!size) return 0; elp = HeapAlloc( GetProcessHeap(), 0, size ); GetObjectW( hpen, size, elp ); /* FIXME: add support for user style pens */ logpen.lopnStyle = elp->elpPenStyle; logpen.lopnWidth.x = elp->elpWidth; logpen.lopnWidth.y = 0; logpen.lopnColor = elp->elpColor; HeapFree( GetProcessHeap(), 0, elp ); } if (hpen == GetStockObject( DC_PEN )) logpen.lopnColor = GetDCPenColor( dev->hdc ); pdev->pen_colorref = logpen.lopnColor; pdev->pen_color = get_fg_color( pdev, pdev->pen_colorref ); calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor); pdev->pen_pattern = dash_patterns[PS_SOLID]; pdev->defer |= DEFER_PEN; style = logpen.lopnStyle & PS_STYLE_MASK; switch(style) { case PS_SOLID: if(logpen.lopnStyle & PS_GEOMETRIC) break; if(logpen.lopnWidth.x > 1) break; pdev->pen_line = solid_pen_line; pdev->defer &= ~DEFER_PEN; break; case PS_DASH: case PS_DOT: case PS_DASHDOT: case PS_DASHDOTDOT: if(logpen.lopnStyle & PS_GEOMETRIC) break; if(logpen.lopnWidth.x > 1) break; pdev->pen_line = dashed_pen_line; pdev->pen_pattern = dash_patterns[style]; pdev->defer &= ~DEFER_PEN; break; case PS_NULL: pdev->pen_line = null_pen_line; pdev->defer &= ~DEFER_PEN; break; default: break; } return next->funcs->pSelectPen( next, hpen ); }