void Win32Graphics::drawGraphics( const OSGraphics &rGraphics, int xSrc, int ySrc, int xDest, int yDest, int width, int height ) { if( width == -1 ) { width = rGraphics.getWidth(); } if( height == -1 ) { height = rGraphics.getHeight(); } // Create the mask for transparency HRGN mask = CreateRectRgn( xSrc, ySrc, xSrc + width, ySrc + height ); CombineRgn( mask, ((Win32Graphics&)rGraphics).getMask(), mask, RGN_AND ); OffsetRgn( mask, xDest - xSrc, yDest - ySrc ); // Copy the image HDC srcDC = ((Win32Graphics&)rGraphics).getDC(); SelectClipRgn( m_hDC, mask ); BitBlt( m_hDC, xDest, yDest, width, height, srcDC, xSrc, ySrc, SRCCOPY ); // Add the source mask to the mask of the graphics CombineRgn( m_mask, mask, m_mask, RGN_OR ); DeleteObject( mask ); }
void Win32Graphics::drawGraphics( const OSGraphics &rGraphics, int xSrc, int ySrc, int xDest, int yDest, int width, int height ) { // check and adapt to source if needed if( !checkBoundaries( 0, 0, rGraphics.getWidth(), rGraphics.getHeight(), xSrc, ySrc, width, height ) ) { msg_Err( getIntf(), "nothing to draw from graphics source" ); return; } // check destination if( !checkBoundaries( 0, 0, m_width, m_height, xDest, yDest, width, height ) ) { msg_Err( getIntf(), "out of reach destination! pls, debug your skin" ); return; } // Create the mask for transparency HRGN mask = CreateRectRgn( xSrc, ySrc, xSrc + width, ySrc + height ); CombineRgn( mask, ((Win32Graphics&)rGraphics).getMask(), mask, RGN_AND ); OffsetRgn( mask, xDest - xSrc, yDest - ySrc ); // Copy the image HDC srcDC = ((Win32Graphics&)rGraphics).getDC(); SelectClipRgn( m_hDC, mask ); BitBlt( m_hDC, xDest, yDest, width, height, srcDC, xSrc, ySrc, SRCCOPY ); // Add the source mask to the mask of the graphics CombineRgn( m_mask, mask, m_mask, RGN_OR ); DeleteObject( mask ); }
void X11Tooltip::show( int left, int top, OSGraphics &rText ) { // Source drawable Drawable src = ((X11Graphics&)rText).getDrawable(); int width = rText.getWidth(); int height = rText.getHeight(); XMoveResizeWindow( XDISPLAY, m_wnd, left, top, width, height ); // Show the window XMapRaised( XDISPLAY, m_wnd ); // Move it again if the window manager forgets the position XMoveWindow( XDISPLAY, m_wnd, left, top ); XCopyArea( XDISPLAY, src, m_wnd, XGC, 0, 0, width, height, 0, 0 ); }
void Win32Tooltip::show( int left, int top, OSGraphics &rText ) { // Source drawable HDC srcDC = ((Win32Graphics&)rText).getDC(); int width = rText.getWidth(); int height = rText.getHeight(); // Set the window on top, resize it and show it SetWindowPos( m_hWnd, HWND_TOPMOST, left, top, width, height, 0 ); ShowWindow( m_hWnd, SW_SHOW ); HDC wndDC = GetDC( m_hWnd ); BitBlt( wndDC, 0, 0, width, height, srcDC, 0, 0, SRCCOPY ); ReleaseDC( m_hWnd, wndDC ); }
void X11Graphics::drawGraphics( const OSGraphics &rGraphics, int xSrc, int ySrc, int xDest, int yDest, int width, int height ) { if( width == -1 ) { width = rGraphics.getWidth(); } if( height == -1 ) { height = rGraphics.getHeight(); } // Source drawable Drawable src = ((X11Graphics&)rGraphics).getDrawable(); // Create the mask for transparency Region voidMask = XCreateRegion(); XRectangle rect; rect.x = xSrc; rect.y = ySrc; rect.width = width; rect.height = height; Region clipMask = XCreateRegion(); XUnionRectWithRegion( &rect, voidMask, clipMask ); Region mask = XCreateRegion(); XIntersectRegion( ((X11Graphics&)rGraphics).getMask(), clipMask, mask ); XDestroyRegion( clipMask ); XDestroyRegion( voidMask ); XOffsetRegion( mask, xDest - xSrc, yDest - ySrc ); // Copy the pixmap XSetRegion( XDISPLAY, m_gc, mask ); XCopyArea( XDISPLAY, src, m_pixmap, m_gc, xSrc, ySrc, width, height, xDest, yDest ); // Add the source mask to the mask of the graphics Region newMask = XCreateRegion(); XUnionRegion( m_mask, mask, newMask ); XDestroyRegion( mask ); XDestroyRegion( m_mask ); m_mask = newMask; }