static HRESULT WINAPI IWineD3DClipperImpl_GetClipList(IWineD3DClipper *iface, const RECT *Rect, RGNDATA *ClipList, DWORD *Size) { IWineD3DClipperImpl *This = (IWineD3DClipperImpl *)iface; TRACE("(%p,%p,%p,%p)\n", This, Rect, ClipList, Size); if (This->hWnd) { HDC hDC = GetDCEx(This->hWnd, NULL, DCX_WINDOW); if (hDC) { HRGN hRgn = CreateRectRgn(0,0,0,0); if (GetRandomRgn(hDC, hRgn, SYSRGN)) { if (GetVersion() & 0x80000000) { /* map region to screen coordinates */ POINT org; GetDCOrgEx( hDC, &org ); OffsetRgn( hRgn, org.x, org.y ); } if (Rect) { HRGN hRgnClip = CreateRectRgn(Rect->left, Rect->top, Rect->right, Rect->bottom); CombineRgn(hRgn, hRgn, hRgnClip, RGN_AND); DeleteObject(hRgnClip); } *Size = GetRegionData(hRgn, *Size, ClipList); } DeleteObject(hRgn); ReleaseDC(This->hWnd, hDC); } return WINED3D_OK; } else { static int warned = 0; if (warned++ < 10) FIXME("(%p,%p,%p,%p),stub!\n",This,Rect,ClipList,Size); if (Size) *Size=0; return WINEDDERR_NOCLIPLIST; } }
static HRGN get_window_region(HWND window) { POINT origin; HRGN rgn; HDC dc; if (!(dc = GetDC(window))) { WARN("Failed to get dc.\n"); return NULL; } if (!(rgn = CreateRectRgn(0, 0, 0, 0))) { ERR("Failed to create region.\n"); ReleaseDC(window, dc); return NULL; } if (GetRandomRgn(dc, rgn, SYSRGN) != 1) { ERR("Failed to get window region.\n"); DeleteObject(rgn); ReleaseDC(window, dc); return NULL; } if (GetVersion() & 0x80000000) { GetDCOrgEx(dc, &origin); OffsetRgn(rgn, origin.x, origin.y); } ReleaseDC(window, dc); return rgn; }
/************************************************************************* * ScrollDC (X11DRV.@) */ BOOL X11DRV_ScrollDC( HDC hdc, INT dx, INT dy, const RECT *lprcScroll, const RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate ) { RECT rcSrc, rcClip, offset; INT dxdev, dydev, res; HRGN DstRgn, clipRgn, visrgn; INT code = X11DRV_START_EXPOSURES; TRACE("dx,dy %d,%d rcScroll %s rcClip %s hrgnUpdate %p lprcUpdate %p\n", dx, dy, wine_dbgstr_rect(lprcScroll), wine_dbgstr_rect(lprcClip), hrgnUpdate, lprcUpdate); /* enable X-exposure events */ if (hrgnUpdate || lprcUpdate) ExtEscape( hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL ); /* get the visible region */ visrgn=CreateRectRgn( 0, 0, 0, 0); GetRandomRgn( hdc, visrgn, SYSRGN); if( !(GetVersion() & 0x80000000)) { /* Window NT/2k/XP */ POINT org; GetDCOrgEx(hdc, &org); OffsetRgn( visrgn, -org.x, -org.y); } /* intersect with the clipping Region if the DC has one */ clipRgn = CreateRectRgn( 0, 0, 0, 0); if (GetClipRgn( hdc, clipRgn) != 1) { DeleteObject(clipRgn); clipRgn=NULL; } else CombineRgn( visrgn, visrgn, clipRgn, RGN_AND); /* only those pixels in the scroll rectangle that remain in the clipping * rect are scrolled. */ if( lprcClip) rcClip = *lprcClip; else GetClipBox( hdc, &rcClip); rcSrc = rcClip; OffsetRect( &rcClip, -dx, -dy); IntersectRect( &rcSrc, &rcSrc, &rcClip); /* if an scroll rectangle is specified, only the pixels within that * rectangle are scrolled */ if( lprcScroll) IntersectRect( &rcSrc, &rcSrc, lprcScroll); /* now convert to device coordinates */ LPtoDP(hdc, (LPPOINT)&rcSrc, 2); TRACE("source rect: %s\n", wine_dbgstr_rect(&rcSrc)); /* also dx and dy */ SetRect(&offset, 0, 0, dx, dy); LPtoDP(hdc, (LPPOINT)&offset, 2); dxdev = offset.right - offset.left; dydev = offset.bottom - offset.top; /* now intersect with the visible region to get the pixels that will * actually scroll */ DstRgn = CreateRectRgnIndirect( &rcSrc); res = CombineRgn( DstRgn, DstRgn, visrgn, RGN_AND); /* and translate, giving the destination region */ OffsetRgn( DstRgn, dxdev, dydev); if( TRACE_ON( scroll)) dump_region( "Destination scroll region: ", DstRgn); /* if there are any, do it */ if( res > NULLREGION) { RECT rect ; /* clip to the destination region, so we can BitBlt with a simple * bounding rectangle */ if( clipRgn) ExtSelectClipRgn( hdc, DstRgn, RGN_AND); else SelectClipRgn( hdc, DstRgn); GetRgnBox( DstRgn, &rect); DPtoLP(hdc, (LPPOINT)&rect, 2); TRACE("destination rect: %s\n", wine_dbgstr_rect(&rect)); BitBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hdc, rect.left - dx, rect.top - dy, SRCCOPY); } /* compute the update areas. This is the combined clip rectangle * minus the scrolled region, and intersected with the visible * region. */ if (hrgnUpdate || lprcUpdate) { HRGN hrgn = hrgnUpdate; HRGN ExpRgn = 0; /* collect all the exposures */ code = X11DRV_END_EXPOSURES; ExtEscape( hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, sizeof(ExpRgn), (LPSTR)&ExpRgn ); /* Intersect clip and scroll rectangles, allowing NULL values */ if( lprcScroll) if( lprcClip) IntersectRect( &rcClip, lprcClip, lprcScroll); else rcClip = *lprcScroll; else if( lprcClip) rcClip = *lprcClip; else GetClipBox( hdc, &rcClip); /* Convert the combined clip rectangle to device coordinates */ LPtoDP(hdc, (LPPOINT)&rcClip, 2); if( hrgn ) SetRectRgn( hrgn, rcClip.left, rcClip.top, rcClip.right, rcClip.bottom); else hrgn = CreateRectRgnIndirect( &rcClip); CombineRgn( hrgn, hrgn, visrgn, RGN_AND); CombineRgn( hrgn, hrgn, DstRgn, RGN_DIFF); /* add the exposures to this */ if( ExpRgn) { if( TRACE_ON( scroll)) dump_region( "Expose region: ", ExpRgn); CombineRgn( hrgn, hrgn, ExpRgn, RGN_OR); DeleteObject( ExpRgn); } if( TRACE_ON( scroll)) dump_region( "Update region: ", hrgn); if( lprcUpdate) { GetRgnBox( hrgn, lprcUpdate ); /* Put the lprcUpdate in logical coordinates */ DPtoLP( hdc, (LPPOINT)lprcUpdate, 2 ); TRACE("returning lprcUpdate %s\n", wine_dbgstr_rect(lprcUpdate)); } if( !hrgnUpdate) DeleteObject( hrgn); } /* restore original clipping region */ SelectClipRgn( hdc, clipRgn); DeleteObject( visrgn); DeleteObject( DstRgn); if( clipRgn) DeleteObject( clipRgn); return TRUE; }
void Test_GetRandomRgn_RGN5() { HDC hdc; HRGN hrgn1, hrgn2; INT ret; RECT rect, rect2; HBITMAP hbmp; DBG_UNREFERENCED_LOCAL_VARIABLE(hrgn2); DBG_UNREFERENCED_LOCAL_VARIABLE(rect2); hrgn1 = CreateRectRgn(11, 17, 23, 42); if (!hrgn1) { printf("Coun't create a region\n"); return; } hdc = CreateCompatibleDC(0); if (!hdc) { printf("Coun't create a dc\n"); return; } #if 0 // this is vista+ ret = GetRandomRgn(hdc, hrgn1, RGN5); ok_int(ret, 1); GetRgnBox(hrgn1, &rect); ok_long(rect.left, 0); ok_long(rect.top, 0); ok_long(rect.right, 1); ok_long(rect.bottom, 1); hrgn2 = CreateRectRgn(1, 2, 3, 4); SelectClipRgn(hdc, hrgn2); DeleteObject(hrgn2); ret = GetRandomRgn(hdc, hrgn1, RGN5); ok_int(ret, 1); GetRgnBox(hrgn1, &rect); ok_long(rect.left, 0); ok_long(rect.top, 0); ok_long(rect.right, 1); ok_long(rect.bottom, 1); #endif hbmp = CreateCompatibleBitmap(hdc, 4, 7); SelectObject(hdc, hbmp); ret = GetRandomRgn(hdc, hrgn1, SYSRGN); ok_int(ret, 1); GetRgnBox(hrgn1, &rect); ok_long(rect.left, 0); ok_long(rect.top, 0); ok_long(rect.right, 4); ok_long(rect.bottom, 7); DeleteObject(hbmp); #if 0 // this is vista+ MoveWindow(ghwnd, 100, 100, 100, 100, 0); ret = GetRandomRgn(ghdcWindow, hrgn1, RGN5); ok_int(ret, 1); GetRgnBox(hrgn1, &rect); DPtoLP(ghdcWindow, (LPPOINT)&rect, 2); ok_long(rect.left, 104); ok_long(rect.top, 124); ok_long(rect.right, 209); ok_long(rect.bottom, 196); MoveWindow(ghwnd, 200, 400, 200, 200, 0); ret = GetRandomRgn(ghdcWindow, hrgn1, RGN5); ok_int(ret, 1); GetRgnBox(hrgn1, &rect2); DPtoLP(ghdcWindow, (LPPOINT)&rect2, 2); ok_long(rect2.left, rect.left + 100); ok_long(rect2.top, rect.top + 300); ok_long(rect2.right, rect.right + 200 - 13); ok_long(rect2.bottom, rect.bottom + 400); #endif DeleteObject(hrgn1); DeleteDC(hdc); }
void Test_GetRandomRgn_Params() { HDC hdc; HRGN hrgn; INT ret; hdc = CreateCompatibleDC(0); if (!hdc) { printf("Coun't create a dc\n"); return; } hrgn = CreateRectRgn(11, 17, 23, 42); if (!hrgn) { printf("Coun't create a region\n"); return; } SetLastError(0xbadbad00); ret = GetRandomRgn(NULL, NULL, 0); ok_int(ret, -1); ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError()); SetLastError(0xbadbad00); ret = GetRandomRgn(NULL, NULL, CLIPRGN); ok_int(ret, -1); ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError()); SetLastError(0xbadbad00); ret = GetRandomRgn(NULL, hrgn, 0); ok_int(ret, -1); ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError()); SetLastError(0xbadbad00); ret = GetRandomRgn(NULL, hrgn, CLIPRGN); ok_int(ret, -1); ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError()); SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, NULL, 0); ok_int(ret, 0); ok_err(0xbadbad00); SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, NULL, CLIPRGN); ok_int(ret, 0); ok_err(0xbadbad00); SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, hrgn, 0); ok_int(ret, 0); ok_err(0xbadbad00); #if 0 // this is vista+ SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, hrgn, 5); ok_int(ret, 1); ok_err(0xbadbad00); #endif SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, hrgn, 6); ok_int(ret, 0); ok_err(0xbadbad00); SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, hrgn, 27); ok_int(ret, 0); ok_err(0xbadbad00); SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, hrgn, -1); ok_int(ret, 0); ok_err(0xbadbad00); SetLastError(0xbadbad00); ret = GetRandomRgn(hdc, hrgn, CLIPRGN); ok_int(ret, 0); ok_err(0xbadbad00); SetLastError(0xbadbad00); ret = GetRandomRgn((HDC)0x123, hrgn, CLIPRGN); ok_int(ret, -1); ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError()); DeleteObject(hrgn); DeleteDC(hdc); }
void Test_GetRandomRgn_CLIPRGN() { HDC hdc; HRGN hrgn1, hrgn2; INT ret; RECT rect; hrgn1 = CreateRectRgn(11, 17, 23, 42); if (!hrgn1) { printf("Coun't create a region\n"); return; } hdc = CreateCompatibleDC(0); if (!hdc) { printf("Coun't create a dc\n"); return; } ret = GetRandomRgn(hdc, hrgn1, CLIPRGN); ok_int(ret, 0); GetRgnBox(hrgn1, &rect); ok_long(rect.left, 11); ok_long(rect.top, 17); ok_long(rect.right, 23); ok_long(rect.bottom, 42); hrgn2 = CreateRectRgn(1, 2, 3, 4); SelectClipRgn(hdc, hrgn2); DeleteObject(hrgn2); ret = GetRandomRgn(hdc, hrgn1, CLIPRGN); ok_int(ret, 1); GetRgnBox(hrgn1, &rect); ok_long(rect.left, 1); ok_long(rect.top, 2); ok_long(rect.right, 3); ok_long(rect.bottom, 4); hrgn2 = CreateRectRgn(2, 3, 4, 5); SelectClipRgn(ghdcWindow, hrgn2); DeleteObject(hrgn2); ret = GetRandomRgn(ghdcWindow, hrgn1, CLIPRGN); ok_int(ret, 1); GetRgnBox(hrgn1, &rect); ok_long(rect.left, 2); ok_long(rect.top, 3); ok_long(rect.right, 4); ok_long(rect.bottom, 5); MoveWindow(ghwnd, 200, 400, 100, 100, 0); ret = GetRandomRgn(ghdcWindow, hrgn1, CLIPRGN); ok_int(ret, 1); GetRgnBox(hrgn1, &rect); ok_long(rect.left, 2); ok_long(rect.top, 3); ok_long(rect.right, 4); ok_long(rect.bottom, 5); DeleteObject(hrgn1); DeleteDC(hdc); }
static void test_GetRandomRgn(void) { HWND hwnd = CreateWindowExA(0,"BUTTON","test",WS_VISIBLE|WS_POPUP,0,0,100,100,GetDesktopWindow(),0,0,0); HDC hdc; HRGN hrgn = CreateRectRgn(0, 0, 0, 0); int ret; RECT rc, rc2; RECT ret_rc, window_rc; ok( hwnd != 0, "CreateWindow failed\n" ); SetRect(&window_rc, 400, 300, 500, 400); SetWindowPos(hwnd, HWND_TOPMOST, window_rc.left, window_rc.top, window_rc.right - window_rc.left, window_rc.bottom - window_rc.top, 0 ); hdc = GetDC(hwnd); ret = GetRandomRgn(hdc, hrgn, 1); ok(ret == 0, "GetRandomRgn rets %d\n", ret); ret = GetRandomRgn(hdc, hrgn, 2); ok(ret == 0, "GetRandomRgn rets %d\n", ret); ret = GetRandomRgn(hdc, hrgn, 3); ok(ret == 0, "GetRandomRgn rets %d\n", ret); /* Set a clip region */ SetRect(&rc, 20, 20, 80, 80); IntersectClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom); ret = GetRandomRgn(hdc, hrgn, 1); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); ret = GetRandomRgn(hdc, hrgn, 2); ok(ret == 0, "GetRandomRgn rets %d\n", ret); ret = GetRandomRgn(hdc, hrgn, 3); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); /* Move the clip to the meta and clear the clip */ SetMetaRgn(hdc); ret = GetRandomRgn(hdc, hrgn, 1); ok(ret == 0, "GetRandomRgn rets %d\n", ret); ret = GetRandomRgn(hdc, hrgn, 2); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); ret = GetRandomRgn(hdc, hrgn, 3); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); /* Set a new clip (still got the meta) */ SetRect(&rc2, 10, 30, 70, 90); IntersectClipRect(hdc, rc2.left, rc2.top, rc2.right, rc2.bottom); ret = GetRandomRgn(hdc, hrgn, 1); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); ok(EqualRect(&rc2, &ret_rc), "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); ret = GetRandomRgn(hdc, hrgn, 2); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); ok(EqualRect(&rc, &ret_rc), "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); IntersectRect(&rc2, &rc, &rc2); ret = GetRandomRgn(hdc, hrgn, 3); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); ok(EqualRect(&rc2, &ret_rc), "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); ret = GetRandomRgn(hdc, hrgn, SYSRGN); ok(ret != 0, "GetRandomRgn rets %d\n", ret); GetRgnBox(hrgn, &ret_rc); if(GetVersion() & 0x80000000) OffsetRect(&window_rc, -window_rc.left, -window_rc.top); /* the window may be partially obscured so the region may be smaller */ IntersectRect( &window_rc, &ret_rc, &ret_rc ); ok(EqualRect(&window_rc, &ret_rc) || broken(IsRectEmpty(&ret_rc)), /* win95 */ "GetRandomRgn %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom); DeleteObject(hrgn); ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); }
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); }
/* * Updates visible regions for given spu window. * Returns GL_TRUE if regions changed since last call, GL_FALSE otherwise. */ GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow) { HRGN hVisRgn; HWND hwnd; DWORD dwCount; LPRGNDATA lpRgnData; POINT pt; int iret; if (!pWindow) return GL_FALSE; hwnd = pWindow->hWnd; if (!hwnd) return GL_FALSE; if (hwnd!=WindowFromDC(pWindow->drawable)) { crWarning("Window(%i) DC is no longer valid", pWindow->spuWindow); return GL_FALSE; } hVisRgn = CreateRectRgn(0,0,0,0); iret = GetRandomRgn(pWindow->drawable, hVisRgn, SYSRGN); if (iret==1) { /*@todo check win95/win98 here, as rects should be already in client space there*/ /* Convert screen related rectangles to client related rectangles */ pt.x = 0; pt.y = 0; ScreenToClient(hwnd, &pt); OffsetRgn(hVisRgn, pt.x, pt.y); /* dwCount = GetRegionData(hVisRgn, 0, NULL); lpRgnData = crAlloc(dwCount); crDebug("GetRandomRgn returned 1, dwCount=%d", dwCount); GetRegionData(hVisRgn, dwCount, lpRgnData); crDebug("Region consists of %d rects", lpRgnData->rdh.nCount); pRects = (RECT*) lpRgnData->Buffer; for (i=0; i<lpRgnData->rdh.nCount; ++i) { crDebug("Rgn[%d] = (%d, %d, %d, %d)", i, pRects[i].left, pRects[i].top, pRects[i].right, pRects[i].bottom); } crFree(lpRgnData); */ if (pWindow->hVisibleRegion==INVALID_HANDLE_VALUE || !EqualRgn(pWindow->hVisibleRegion, hVisRgn)) { DeleteObject(pWindow->hVisibleRegion); pWindow->hVisibleRegion = hVisRgn; dwCount = GetRegionData(hVisRgn, 0, NULL); lpRgnData = crAlloc(dwCount); if (lpRgnData) { GetRegionData(hVisRgn, dwCount, lpRgnData); crDebug("Dispatched WindowVisibleRegion (%i, cRects=%i)", pWindow->spuWindow, lpRgnData->rdh.nCount); stub.spuDispatch.WindowVisibleRegion(pWindow->spuWindow, lpRgnData->rdh.nCount, (GLint*) lpRgnData->Buffer); crFree(lpRgnData); return GL_TRUE; } else crWarning("GetRegionData failed, VisibleRegions update failed"); } else { DeleteObject(hVisRgn); } } else { crWarning("GetRandomRgn returned (%d) instead of (1), VisibleRegions update failed", iret); DeleteObject(hVisRgn); } return GL_FALSE; }
void KMyCanvas::OnDraw(HDC hDC, const RECT * rcPaint) { if ( m_lastlimit>= m_limit ) return; TCHAR title [MAX_PATH]; sprintf(title, "Mandelbrot Set (%f %f) zoom %d:%d unit %f", m_x, m_y, m_zoommul, m_zoomdiv, m_unit); SetWindowText(GetParent(m_hWnd), title); int tick = GetTickCount(); if ( rcPaint ) m_lastlimit = 0; RECT rect; GetClientRect(m_hWnd, & rect); int x0 = GetScrollPos(m_hWnd, SB_HORZ); int y0 = GetScrollPos(m_hWnd, SB_VERT); // ClearBuffer(rect.right, rect.bottom, x0, y0); HRGN hRgn = CreateRectRgn(0, 0, 1, 1); { GetRandomRgn(hDC, hRgn, SYSRGN); POINT p0; GetDCOrgEx(hDC, & p0); // change region to be relative to DC, NT only // if ( HIWORD(hDC) ) OffsetRgn(hRgn, - p0.x, - p0.y); } m_lastlimit += 16; for (int y=0; y<rect.bottom; y++) { COLORREF lastc = 0xFFFFFFFF; int count = 0; for (int x=0; x<rect.right; x++) // if ( Buffer[y][x]==0 ) if ( PtInRegion(hRgn, x, y) ) { int count = MandelCount(NULL, x+x0, y+y0, m_limit); COLORREF c = 0; if ( count==0 ) // don't know c = RGB(64, 78, 170); // Red else if ( count>0 ) // yes c = In[count]; // green else if ( count< -3 ) c = Out[-count]; // Buffer[y][x] = count; if ( c ) SetPixel(hDC, x+x0, y+y0, c); } } tick = GetTickCount() - tick; wsprintf(title, "tick %d", tick); m_pStatus->SetText(1, title); }