From 305355ad7723cfe129ef1e5b7a40810984aea72f Mon Sep 17 00:00:00 2001 From: Kurt Zenker Date: Tue, 24 Jun 2008 09:35:44 +0000 Subject: [PATCH] INTEGRATION: CWS canvas05 (1.2.2); FILE MERGED 2008/06/03 11:11:24 thb 1.2.2.6: Cleaned up image debugging stuff; fixed a few d3d debug warnings; fixed one deadlock rendering a bitmap from the same surface to itself; fixed premature ReleaseDC call in GraphicsProvider::getGraphics() 2008/06/02 22:20:50 thb 1.2.2.5: Removed obsolete XTunnel now for real; re-added size getter for BitmapCanvas; smallish cleanups 2008/04/21 07:29:23 thb 1.2.2.4: RESYNC: (1.3-1.4); FILE MERGED 2008/01/22 00:51:07 thb 1.2.2.3: RESYNC: (1.2-1.3); FILE MERGED 2008/01/22 00:25:23 thb 1.2.2.2: #i81092# Making gdiplus and dx canvas more independent 2007/12/20 22:18:57 thb 1.2.2.1: #i81092# #i78888# #i78925# #i79258# #i79437# #i84784# Large canvas rework, completing various areas such as color spaces, bitmap data access, true sprite and non-sprite implementations, and upstreaming the canvas parts of rodos emf+ rendering --- canvas/source/directx/dx_impltools.cxx | 120 ++++++++++--------------- 1 file changed, 46 insertions(+), 74 deletions(-) diff --git a/canvas/source/directx/dx_impltools.cxx b/canvas/source/directx/dx_impltools.cxx index 8136067fda19..40164c9a1d87 100755 --- a/canvas/source/directx/dx_impltools.cxx +++ b/canvas/source/directx/dx_impltools.cxx @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: dx_impltools.cxx,v $ - * $Revision: 1.4 $ + * $Revision: 1.5 $ * * This file is part of OpenOffice.org. * @@ -28,11 +28,15 @@ * ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_canvas.hxx" + #include // don't ask. msdev breaks otherwise... #include #include #include +#include #include #include @@ -54,7 +58,8 @@ #include "dx_linepolypolygon.hxx" #include "dx_canvasbitmap.hxx" #include "dx_canvasfont.hxx" -#include "dx_surfacegraphics.hxx" +#include "dx_canvas.hxx" +#include "dx_spritecanvas.hxx" #include @@ -103,7 +108,7 @@ namespace dxcanvas // no implementation class and no data provider // found - contract violation. - CHECK_AND_THROW( xLinePoly.is(), + ENSURE_ARG_OR_THROW( xLinePoly.is(), "VCLCanvas::polyPolygonFromXPolyPolygon2D(): Invalid input " "poly-polygon, cannot retrieve vertex data" ); @@ -140,6 +145,22 @@ namespace dxcanvas rGraphics.SetPageUnit(Gdiplus::UnitPixel); } + Gdiplus::Graphics* createGraphicsFromHDC(HDC aHDC) + { + Gdiplus::Graphics* pRet = new Gdiplus::Graphics(aHDC); + if( pRet ) + setupGraphics( *pRet ); + return pRet; + } + + Gdiplus::Graphics* createGraphicsFromBitmap(const BitmapSharedPtr& rBitmap) + { + Gdiplus::Graphics* pRet = Gdiplus::Graphics::FromImage(rBitmap.get()); + if( pRet ) + setupGraphics( *pRet ); + return pRet; + } + void gdiPlusMatrixFromB2DHomMatrix( Gdiplus::Matrix& rGdiplusMatrix, const ::basegfx::B2DHomMatrix& rMatrix ) { rGdiplusMatrix.SetElements( static_cast(rMatrix.get(0,0)), @@ -337,7 +358,7 @@ namespace dxcanvas Gdiplus::ARGB sequenceToArgb( const uno::Sequence< sal_Int8 >& rColor ) { - ENSURE_AND_THROW( rColor.getLength() > 2, + ENSURE_OR_THROW( rColor.getLength() > 2, "sequenceToArgb: need at least three channels" ); // TODO(F1): handle color space conversions, when defined on canvas/graphicDevice @@ -353,7 +374,7 @@ namespace dxcanvas Gdiplus::ARGB sequenceToArgb( const uno::Sequence< double >& rColor ) { - ENSURE_AND_THROW( rColor.getLength() > 2, + ENSURE_OR_THROW( rColor.getLength() > 2, "sequenceToColor: need at least three channels" ); // TODO(F1): handle color space conversions, when defined on canvas/graphicDevice @@ -446,20 +467,17 @@ namespace dxcanvas } } - namespace + bool drawGdiPlusBitmap( const GraphicsSharedPtr& rGraphics, + const BitmapSharedPtr& rBitmap ) { - bool drawGdiPlusBitmap( const SurfaceGraphicsSharedPtr& rGraphics, - const BitmapSharedPtr& rBitmap ) - { - Gdiplus::PointF aPoint; - return (Gdiplus::Ok == (*rGraphics)->DrawImage( rBitmap.get(), - aPoint ) ); - } + Gdiplus::PointF aPoint; + return (Gdiplus::Ok == rGraphics->DrawImage( rBitmap.get(), + aPoint ) ); } - bool drawDIBits( const SurfaceGraphicsSharedPtr& rGraphics, - const BITMAPINFO& rBI, - const void* pBits ) + bool drawDIBits( const GraphicsSharedPtr& rGraphics, + const BITMAPINFO& rBI, + const void* pBits ) { BitmapSharedPtr pBitmap( Gdiplus::Bitmap::FromBITMAPINFO( &rBI, @@ -469,8 +487,8 @@ namespace dxcanvas pBitmap ); } - bool drawRGBABits( const SurfaceGraphicsSharedPtr& rGraphics, - const RawRGBABitmap& rRawRGBAData ) + bool drawRGBABits( const GraphicsSharedPtr& rGraphics, + const RawRGBABitmap& rRawRGBAData ) { BitmapSharedPtr pBitmap( new Gdiplus::Bitmap( rRawRGBAData.mnWidth, rRawRGBAData.mnHeight, @@ -499,59 +517,14 @@ namespace dxcanvas pBitmap ); } - bool drawXBitmap( const SurfaceGraphicsSharedPtr& rGraphics, - const uno::Reference< rendering::XBitmap >& xBitmap ) - { - CanvasBitmap* pBitmap = dynamic_cast< CanvasBitmap* >(xBitmap.get()); - - if( pBitmap ) - { - // we're instructed to draw the xBitmap to the - // graphics object. moreover we know that the passed - // xBitmap is a disguised CanvasBitmap object from - // which we're able to directly access the pixel from - // the contained directx surface. - DXBitmapSharedPtr pDXBitmap( pBitmap->getSurface() ); - return drawGdiPlusBitmap(rGraphics,pDXBitmap->getBitmap()); - } - else if( drawVCLBitmapFromUnoTunnel( - rGraphics, - uno::Reference< lang::XUnoTunnel >( xBitmap, - uno::UNO_QUERY ) ) ) - { - return true; - } - else - { - SpriteCanvas* pCanvas = dynamic_cast< SpriteCanvas* >(xBitmap.get()); - - if( pCanvas ) - { - // we're instructed to draw the xBitmap to the - // graphics object. moreover we know that the passed - // xBitmap is a disguised SpriteCanvas object from - // which we're able to directly access the pixel from - // the contained directx surface. - DXBitmapSharedPtr pDXBitmap( pCanvas->getBackBuffer() ); - return drawGdiPlusBitmap(rGraphics,pDXBitmap->getBitmap()); - } - } - - // TODO(F1): extract pixel from XBitmap interface - OSL_ENSURE( false, - "drawXBitmap(): could not extract bitmap" ); - - return false; - } - BitmapSharedPtr bitmapFromXBitmap( const uno::Reference< rendering::XBitmap >& xBitmap ) { - CanvasBitmap* pCanvasBitmap = dynamic_cast< CanvasBitmap* >(xBitmap.get()); + BitmapProvider* pBitmapProvider = dynamic_cast< BitmapProvider* >(xBitmap.get()); - if( pCanvasBitmap ) + if( pBitmapProvider ) { - DXBitmapSharedPtr pDXBitmap( pCanvasBitmap->getSurface() ); - return pDXBitmap->getBitmap(); + IBitmapSharedPtr pBitmap( pBitmapProvider->getBitmap() ); + return pBitmap->getBitmap(); } else { @@ -582,12 +555,11 @@ namespace dxcanvas PixelFormat24bppRGB ) ); } - SurfaceGraphicsSharedPtr pSurface(new SurfaceGraphics(pBitmap)); - tools::setupGraphics(*(pSurface->get())); - if( !drawVCLBitmapFromUnoTunnel( - pSurface, - uno::Reference< lang::XUnoTunnel >( xBitmap, - uno::UNO_QUERY ) ) ) + GraphicsSharedPtr pGraphics(createGraphicsFromBitmap(pBitmap)); + tools::setupGraphics(*pGraphics); + if( !drawVCLBitmapFromXBitmap( + pGraphics, + xBitmap) ) { pBitmap.reset(); } @@ -600,7 +572,7 @@ namespace dxcanvas { CanvasFont* pCanvasFont = dynamic_cast< CanvasFont* >(xFont.get()); - CHECK_AND_THROW( pCanvasFont, + ENSURE_ARG_OR_THROW( pCanvasFont, "canvasFontFromXFont(): Invalid XFont (or incompatible font for this XCanvas)" ); return CanvasFont::ImplRef( pCanvasFont );