Author: alg
Date: Fri Feb 24 16:11:11 2012
New Revision: 1293316

URL: http://svn.apache.org/viewvc?rev=1293316&view=rev
Log:
#118898# Adapted ImpGraphic::ImplGetBitmap to correctly convert metafiles to 
bitmapEx, dynamically expanding needed bitmap size right and bottom dependent 
of having a hairline there. To check this, I adapted GDIMetaFile::GetBoundRect 
to be able to deliver the HairlineBoudRect inn parallell to the regular 
geometry one

Modified:
    
incubator/ooo/trunk/main/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx
    incubator/ooo/trunk/main/chart2/source/controller/main/ChartTransferable.cxx
    incubator/ooo/trunk/main/cui/source/tabpages/tpline.cxx
    incubator/ooo/trunk/main/sc/source/ui/app/drwtrans.cxx
    incubator/ooo/trunk/main/sd/source/ui/app/sdxfer.cxx
    incubator/ooo/trunk/main/sd/source/ui/view/drviews2.cxx
    incubator/ooo/trunk/main/svx/inc/svx/svdxcgv.hxx
    incubator/ooo/trunk/main/svx/source/svdraw/svdxcgv.cxx
    incubator/ooo/trunk/main/svx/source/unodraw/unoshape.cxx
    incubator/ooo/trunk/main/sw/source/core/frmedt/fecopy.cxx
    incubator/ooo/trunk/main/sw/source/core/layout/paintfrm.cxx
    incubator/ooo/trunk/main/vcl/inc/vcl/gdimtf.hxx
    incubator/ooo/trunk/main/vcl/source/gdi/gdimtf.cxx
    incubator/ooo/trunk/main/vcl/source/gdi/impgraph.cxx

Modified: 
incubator/ooo/trunk/main/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- 
incubator/ooo/trunk/main/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx
 (original)
+++ 
incubator/ooo/trunk/main/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx
 Fri Feb 24 16:11:11 2012
@@ -190,7 +190,7 @@ Graphic ViewElementListProvider::GetSymb
     if( pSymbolShapeProperties )
         pObj->SetMergedItemSet(*pSymbolShapeProperties);
 
-       GDIMetaFile aMeta(pView->GetAllMarkedMetaFile());
+       GDIMetaFile aMeta(pView->GetMarkedObjMetaFile());
 
        Graphic aGraph(aMeta);
     Size aSize = pObj->GetSnapRect().GetSize();

Modified: 
incubator/ooo/trunk/main/chart2/source/controller/main/ChartTransferable.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/chart2/source/controller/main/ChartTransferable.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- 
incubator/ooo/trunk/main/chart2/source/controller/main/ChartTransferable.cxx 
(original)
+++ 
incubator/ooo/trunk/main/chart2/source/controller/main/ChartTransferable.cxx 
Fri Feb 24 16:11:11 2012
@@ -60,7 +60,7 @@ ChartTransferable::ChartTransferable( Sd
         pExchgView->MarkObj( pSelectedObj, pPv );
     else
         pExchgView->MarkAllObj( pPv );
-    Graphic aGraphic( pExchgView->GetMarkedObjMetaFile( sal_True ));
+    Graphic aGraphic( pExchgView->GetMarkedObjMetaFile(true));
     m_xMetaFileGraphic.set( aGraphic.GetXGraphic());
     if ( m_bDrawing )
     {

Modified: incubator/ooo/trunk/main/cui/source/tabpages/tpline.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/cui/source/tabpages/tpline.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/cui/source/tabpages/tpline.cxx (original)
+++ incubator/ooo/trunk/main/cui/source/tabpages/tpline.cxx Fri Feb 24 16:11:11 
2012
@@ -1042,7 +1042,7 @@ void SvxLineTabPage::Reset( const SfxIte
                                        {
                                                
pObj->SetMergedItemSet(rOutAttrs);
                                        }
-                                       GDIMetaFile 
aMeta(pView->GetAllMarkedMetaFile());
+                                       GDIMetaFile 
aMeta(pView->GetMarkedObjMetaFile());
 
                                        aSymbolGraphic=Graphic(aMeta);
                                        
aSymbolSize=pObj->GetSnapRect().GetSize();
@@ -1764,8 +1764,8 @@ IMPL_LINK( SvxLineTabPage, MenuCreateHdl
                                pObj->SetMergedItemSet(rOutAttrs);
                        }
 
-                       Bitmap aBitmap(pView->GetAllMarkedBitmap());
-                       GDIMetaFile aMeta(pView->GetAllMarkedMetaFile());
+                       BitmapEx aBitmapEx(pView->GetMarkedObjBitmapEx());
+                       GDIMetaFile aMeta(pView->GetMarkedObjMetaFile());
                        pView->UnmarkAll();
                        pObj=pPage->RemoveObject(0);
             SdrObject::Free(pObj);
@@ -1778,16 +1778,16 @@ IMPL_LINK( SvxLineTabPage, MenuCreateHdl
                        pInfo->nItemId = (sal_uInt16)(MN_GALLERY_ENTRY + i + 
nNumMenuGalleryItems);
                        aGrfBrushItems.Insert(pInfo, nNumMenuGalleryItems + i);
 
-                       Size aSize(aBitmap.GetSizePixel());
+                       Size aSize(aBitmapEx.GetSizePixel());
                        if(aSize.Width() > MAX_BMP_WIDTH || aSize.Height() > 
MAX_BMP_HEIGHT)
                        {
                                sal_Bool bWidth = aSize.Width() > 
aSize.Height();
                                double nScale = bWidth ?
                                                                        
(double)MAX_BMP_WIDTH / (double)aSize.Width():
                                                                        
(double)MAX_BMP_HEIGHT / (double)aSize.Height();
-                               aBitmap.Scale(nScale, nScale);
+                               aBitmapEx.Scale(nScale, nScale);
                        }
-                       Image aImage(aBitmap);
+                       Image aImage(aBitmapEx);
                        pPopup->InsertItem(pInfo->nItemId,*pStr,aImage);
                }
                aSymbolMB.GetPopupMenu()->SetPopupMenu( MN_SYMBOLS, pPopup );

Modified: incubator/ooo/trunk/main/sc/source/ui/app/drwtrans.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sc/source/ui/app/drwtrans.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sc/source/ui/app/drwtrans.cxx (original)
+++ incubator/ooo/trunk/main/sc/source/ui/app/drwtrans.cxx Fri Feb 24 16:11:11 
2012
@@ -435,9 +435,9 @@ sal_Bool ScDrawTransferObj::GetData( con
             DBG_ASSERT( pPv, "pPv not there..." );
             aView.MarkAllObj( pPv );
             if ( nFormat == SOT_FORMAT_GDIMETAFILE )
-                bOK = SetGDIMetaFile( aView.GetAllMarkedMetaFile( sal_True ), 
rFlavor );
+                bOK = SetGDIMetaFile( aView.GetMarkedObjMetaFile(true), 
rFlavor );
             else
-                bOK = SetBitmap( aView.GetAllMarkedBitmap( sal_True ), rFlavor 
);
+                bOK = SetBitmap( aView.GetMarkedObjBitmapEx(true).GetBitmap(), 
rFlavor );
         }
         else if ( nFormat == SOT_FORMATSTR_ID_SVXB )
         {

Modified: incubator/ooo/trunk/main/sd/source/ui/app/sdxfer.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sd/source/ui/app/sdxfer.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sd/source/ui/app/sdxfer.cxx (original)
+++ incubator/ooo/trunk/main/sd/source/ui/app/sdxfer.cxx Fri Feb 24 16:11:11 
2012
@@ -546,12 +546,12 @@ sal_Bool SdTransferable::GetData( const 
                else if( nFormat == FORMAT_GDIMETAFILE )
                {
                        if( mpSdViewIntern )
-                               bOK = SetGDIMetaFile( 
mpSdViewIntern->GetAllMarkedMetaFile( sal_True ), rFlavor );
+                               bOK = SetGDIMetaFile( 
mpSdViewIntern->GetMarkedObjMetaFile(true), rFlavor );
                }
                else if( nFormat == FORMAT_BITMAP )
                {
                        if( mpSdViewIntern )
-                               bOK = SetBitmap( 
mpSdViewIntern->GetAllMarkedBitmap( sal_True ), rFlavor );
+                               bOK = SetBitmap( 
mpSdViewIntern->GetMarkedObjBitmapEx(true).GetBitmap(), rFlavor );
                }
                else if( ( nFormat == FORMAT_STRING ) && mpBookmark )
                {

Modified: incubator/ooo/trunk/main/sd/source/ui/view/drviews2.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sd/source/ui/view/drviews2.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sd/source/ui/view/drviews2.cxx (original)
+++ incubator/ooo/trunk/main/sd/source/ui/view/drviews2.cxx Fri Feb 24 16:11:11 
2012
@@ -705,7 +705,7 @@ void DrawViewShell::FuTemporary(SfxReque
                                {
                                        case SID_CONVERT_TO_METAFILE:
                                        {
-                                               GDIMetaFile 
aMetaFile(mpDrawView->GetAllMarkedMetaFile ());
+                                               GDIMetaFile 
aMetaFile(mpDrawView->GetMarkedObjMetaFile());
                                                aGraphic = Graphic(aMetaFile);
                                        }
                                        break;
@@ -713,9 +713,9 @@ void DrawViewShell::FuTemporary(SfxReque
                                        {
                         bool bDone(false);
                         
-                        // I have to get the image here directly since 
GetAllMarkedBitmap works
+                        // I have to get the image here directly since 
GetMarkedObjBitmapEx works
                         // based on Bitmaps, but not on BitmapEx, thus 
throwing away the alpha
-                        // channel. Argh! GetAllMarkedBitmap itself is too 
widely used to safely
+                        // channel. Argh! GetMarkedObjBitmapEx itself is too 
widely used to safely
                         // change that, e.g. in the exchange formats. For now 
I can only add this 
                         // exception to get good results for Svgs. This is how 
the code gets more 
                         // and more crowded, at last I made a remark for 
myself to change this
@@ -733,8 +733,7 @@ void DrawViewShell::FuTemporary(SfxReque
 
                         if(!bDone)
                         {
-                            Bitmap aBitmap (mpDrawView->GetAllMarkedBitmap ());
-                            aGraphic = Graphic(aBitmap);
+                            aGraphic = 
Graphic(mpDrawView->GetMarkedObjBitmapEx());
                         }
                                        }
                                        break;

Modified: incubator/ooo/trunk/main/svx/inc/svx/svdxcgv.hxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/inc/svx/svdxcgv.hxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/inc/svx/svdxcgv.hxx (original)
+++ incubator/ooo/trunk/main/svx/inc/svx/svdxcgv.hxx Fri Feb 24 16:11:11 2012
@@ -71,11 +71,11 @@ public:
        // Alle markierten Objekte in ein Metafile stecken. Z.Zt. noch etwas
        // buggee (Offset..., Fremdgrafikobjekte (SdrGrafObj), Virtuelle
        // Objektkopien (SdrVirtObj) mit Ankerpos<>(0,0)).
-       virtual GDIMetaFile GetMarkedObjMetaFile(sal_Bool 
bNoVDevIfOneMtfMarked=sal_False) const;
+       GDIMetaFile GetMarkedObjMetaFile(bool bNoVDevIfOneMtfMarked = false) 
const;
 
        // Alle markierten Objekte auf eine Bitmap malen. Diese hat die 
Farbtiefe
        // und Aufloesung des Bildschirms.
-       BitmapEx GetMarkedObjBitmap(bool bNoVDevIfOneBmpMarked = false) const;
+       BitmapEx GetMarkedObjBitmapEx(bool bNoVDevIfOneBmpMarked = false) const;
 
        // Alle markierten Objekte in ein neues Model kopieren. Dieses neue 
Model
        // hat dann genau eine Page. Das Flag PageNotValid an diesem Model ist
@@ -89,8 +89,6 @@ public:
        // der Default-Layer zugewiesen (Layer 0, (dokumentglobaler 
Standardlayer).
        virtual SdrModel*   GetMarkedObjModel() const;
 
-       GDIMetaFile     GetAllMarkedMetaFile(sal_Bool 
bNoVDevIfOneMtfMarked=sal_False) const { return 
GetMarkedObjMetaFile(bNoVDevIfOneMtfMarked); }
-       Bitmap          GetAllMarkedBitmap(sal_Bool 
bNoVDevIfOneBmpMarked=sal_False) const { return 
GetMarkedObjBitmap(bNoVDevIfOneBmpMarked).GetBitmap(); }
        Graphic         GetAllMarkedGraphic() const;
        SdrModel*       GetAllMarkedModel() const { return GetMarkedObjModel(); 
}
 

Modified: incubator/ooo/trunk/main/svx/source/svdraw/svdxcgv.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/source/svdraw/svdxcgv.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/source/svdraw/svdxcgv.cxx (original)
+++ incubator/ooo/trunk/main/svx/source/svdraw/svdxcgv.cxx Fri Feb 24 16:11:11 
2012
@@ -529,7 +529,7 @@ void SdrExchangeView::ImpPasteObject(Sdr
 
 
////////////////////////////////////////////////////////////////////////////////////////////////////
 
-BitmapEx SdrExchangeView::GetMarkedObjBitmap( bool bNoVDevIfOneBmpMarked ) 
const
+BitmapEx SdrExchangeView::GetMarkedObjBitmapEx(bool bNoVDevIfOneBmpMarked) 
const
 {
        BitmapEx aBmp;
 
@@ -560,7 +560,7 @@ BitmapEx SdrExchangeView::GetMarkedObjBi
 
                if( !aBmp )
                {
-                       const Graphic aGraphic( GetMarkedObjMetaFile( 
bNoVDevIfOneBmpMarked ) );
+                       const Graphic 
aGraphic(GetMarkedObjMetaFile(bNoVDevIfOneBmpMarked));
             
             // #i102089# support user's settings of AA and LineSnap when the 
MetaFile gets
             // rasterconverted to a bitmap
@@ -580,7 +580,7 @@ BitmapEx SdrExchangeView::GetMarkedObjBi
 
 // 
-----------------------------------------------------------------------------
 
-GDIMetaFile SdrExchangeView::GetMarkedObjMetaFile( sal_Bool 
bNoVDevIfOneMtfMarked ) const
+GDIMetaFile SdrExchangeView::GetMarkedObjMetaFile(bool bNoVDevIfOneMtfMarked) 
const
 {
     GDIMetaFile aMtf;
 
@@ -659,7 +659,7 @@ Graphic SdrExchangeView::GetAllMarkedGra
         if( ( 1 == GetMarkedObjectCount() ) && GetSdrMarkByIndex( 0 ) )
             aRet = SdrExchangeView::GetObjGraphic( pMod, 
GetMarkedObjectByIndex( 0 ) );
         else
-            aRet = GetMarkedObjMetaFile( sal_False );
+            aRet = GetMarkedObjMetaFile(false);
     }
 
     return aRet;

Modified: incubator/ooo/trunk/main/svx/source/unodraw/unoshape.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/source/unodraw/unoshape.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/source/unodraw/unoshape.cxx (original)
+++ incubator/ooo/trunk/main/svx/source/unodraw/unoshape.cxx Fri Feb 24 
16:11:11 2012
@@ -752,7 +752,7 @@ uno::Any SvxShape::GetBitmap( sal_Bool b
        aRect.Justify();
        Size aSize(aRect.GetSize());
 
-       GDIMetaFile aMtf( pView->GetAllMarkedMetaFile() );
+       GDIMetaFile aMtf( pView->GetMarkedObjMetaFile() );
        if( bMetaFile )
        {
                SvMemoryStream aDestStrm( 65535, 65535 );

Modified: incubator/ooo/trunk/main/sw/source/core/frmedt/fecopy.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/frmedt/fecopy.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/core/frmedt/fecopy.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/core/frmedt/fecopy.cxx Fri Feb 24 
16:11:11 2012
@@ -1298,9 +1298,9 @@ sal_Bool SwFEShell::GetDrawObjGraphic( s
                        }
                }
                else if( SOT_FORMAT_GDIMETAFILE == nFmt )
-                       rGrf = Imp()->GetDrawView()->GetAllMarkedMetaFile();
+                       rGrf = Imp()->GetDrawView()->GetMarkedObjMetaFile();
                else if( SOT_FORMAT_BITMAP == nFmt )
-                       rGrf = Imp()->GetDrawView()->GetAllMarkedBitmap();
+                       rGrf = Imp()->GetDrawView()->GetMarkedObjBitmapEx();
        }
        return bConvert;
 }

Modified: incubator/ooo/trunk/main/sw/source/core/layout/paintfrm.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/layout/paintfrm.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/core/layout/paintfrm.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/core/layout/paintfrm.cxx Fri Feb 24 
16:11:11 2012
@@ -6759,7 +6759,7 @@ Graphic SwDrawFrmFmt::MakeGraphic( Image
                SdrView *pView = new SdrView( pMod );
                SdrPageView *pPgView = 
pView->ShowSdrPage(pView->GetModel()->GetPage(0));
                pView->MarkObj( pObj, pPgView );
-               aRet = pView->GetMarkedObjBitmap();
+               aRet = pView->GetMarkedObjBitmapEx();
                pView->HideSdrPage();
                delete pView;
        }

Modified: incubator/ooo/trunk/main/vcl/inc/vcl/gdimtf.hxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/inc/vcl/gdimtf.hxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/vcl/inc/vcl/gdimtf.hxx (original)
+++ incubator/ooo/trunk/main/vcl/inc/vcl/gdimtf.hxx Fri Feb 24 16:11:11 2012
@@ -167,7 +167,7 @@ public:
      * - coordinates of actions will be transformed to preferred mapmode
      * - the returned rectangle is relative to the preferred mapmode of the 
metafile
     */
-    Rectangle       GetBoundRect( OutputDevice& i_rReference );
+    Rectangle       GetBoundRect( OutputDevice& i_rReference, Rectangle* 
pHairline = 0 ) const;
 
        void                    Adjust( short nLuminancePercent = 0, short 
nContrastPercent = 0,
                                                        short nChannelRPercent 
= 0, short nChannelGPercent = 0, 

Modified: incubator/ooo/trunk/main/vcl/source/gdi/gdimtf.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/source/gdi/gdimtf.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/vcl/source/gdi/gdimtf.cxx (original)
+++ incubator/ooo/trunk/main/vcl/source/gdi/gdimtf.cxx Fri Feb 24 16:11:11 2012
@@ -1476,7 +1476,8 @@ void GDIMetaFile::Rotate( long nAngle10 
 
 static void ImplActionBounds( Rectangle& o_rOutBounds,
                               const Rectangle& i_rInBounds,
-                              const std::vector<Rectangle>& i_rClipStack )
+                              const std::vector<Rectangle>& i_rClipStack,
+                              Rectangle* o_pHairline )
 {
     Rectangle aBounds( i_rInBounds );
     if( ! i_rInBounds.IsEmpty() && ! i_rClipStack.empty() && ! 
i_rClipStack.back().IsEmpty() )
@@ -1487,10 +1488,18 @@ static void ImplActionBounds( Rectangle&
             o_rOutBounds.Union( aBounds );
         else
             o_rOutBounds = aBounds;
+
+        if(o_pHairline)
+        {
+            if( ! o_pHairline->IsEmpty() )
+                o_pHairline->Union( aBounds );
+            else
+                *o_pHairline = aBounds;
+        }
     }
 }
 
-Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference )
+Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference, Rectangle* 
pHairline ) const
 {
     GDIMetaFile     aMtf;
     VirtualDevice   aMapVDev( i_rReference );
@@ -1503,9 +1512,18 @@ Rectangle GDIMetaFile::GetBoundRect( Out
     
     Rectangle aBound;
 
-    for( MetaAction* pAction = (MetaAction*) First(); pAction; pAction = 
(MetaAction*) Next() )
+    if(pHairline)
     {
+        *pHairline = Rectangle();
+    }
+
+    const sal_uLong nCount(GetActionCount());
+
+    for(sal_uLong a(0); a < nCount; a++)
+    {
+        MetaAction* pAction = GetAction(a);
         const sal_uInt16 nActionType = pAction->GetType();
+        Rectangle* pUseHairline = (pHairline && aMapVDev.IsLineColor()) ? 
pHairline : 0;
         
         switch( nActionType )
         {
@@ -1515,7 +1533,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             ImplActionBounds( aBound,
                              Rectangle( aMapVDev.LogicToLogic( 
pAct->GetPoint(), aMapVDev.GetMapMode(), GetPrefMapMode() ),
                                        aMapVDev.PixelToLogic( Size( 1, 1 ), 
GetPrefMapMode() ) ),
-                             aClipStack );
+                             aClipStack, pUseHairline );
         }
         break;
 
@@ -1525,7 +1543,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             ImplActionBounds( aBound,
                              Rectangle( aMapVDev.LogicToLogic( 
pAct->GetPoint(), aMapVDev.GetMapMode(), GetPrefMapMode() ),
                                        aMapVDev.PixelToLogic( Size( 1, 1 ), 
GetPrefMapMode() ) ),
-                             aClipStack );
+                             aClipStack, pUseHairline );
         }
         break;
 
@@ -1535,28 +1553,39 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             Point aP1( pAct->GetStartPoint() ), aP2( pAct->GetEndPoint() );
             Rectangle aRect( aP1, aP2 );
             aRect.Justify();
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+
+            if(pUseHairline)
+            {
+                const LineInfo& rLineInfo = pAct->GetLineInfo();
+
+                if(0 != rLineInfo.GetWidth())
+                {
+                    pUseHairline = 0;
+                }
+            }
+
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
         case( META_RECT_ACTION ):
         {
             MetaRectAction* pAct = (MetaRectAction*) pAction;
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
         case( META_ROUNDRECT_ACTION ):
         {
             MetaRoundRectAction*    pAct = (MetaRoundRectAction*) pAction;
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
         case( META_ELLIPSE_ACTION ):
         {
             MetaEllipseAction*      pAct = (MetaEllipseAction*) pAction;
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
@@ -1565,7 +1594,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             MetaArcAction*  pAct = (MetaArcAction*) pAction;
             // FIXME: this is imprecise
             // e.g. for small arcs the whole rectangle is WAY too large
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
@@ -1574,7 +1603,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             MetaPieAction*  pAct = (MetaPieAction*) pAction;
             // FIXME: this is imprecise
             // e.g. for small arcs the whole rectangle is WAY too large
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
@@ -1583,7 +1612,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             MetaChordAction*    pAct = (MetaChordAction*) pAction;
             // FIXME: this is imprecise
             // e.g. for small arcs the whole rectangle is WAY too large
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
@@ -1591,7 +1620,18 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaPolyLineAction* pAct = (MetaPolyLineAction*) pAction;
             Rectangle aRect( pAct->GetPolygon().GetBoundRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+
+            if(pUseHairline)
+            {
+                const LineInfo& rLineInfo = pAct->GetLineInfo();
+
+                if(0 != rLineInfo.GetWidth())
+                {
+                    pUseHairline = 0;
+                }
+            }
+
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
@@ -1599,7 +1639,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaPolygonAction* pAct = (MetaPolygonAction*) pAction;
             Rectangle aRect( pAct->GetPolygon().GetBoundRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
@@ -1607,7 +1647,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaPolyPolygonAction* pAct = (MetaPolyPolygonAction*) pAction;
             Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, pUseHairline );
         }
         break;
 
@@ -1619,7 +1659,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             aMapVDev.GetTextBoundRect( aRect, pAct->GetText(), 
pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen() );
             Point aPt( pAct->GetPoint() );
             aRect.Move( aPt.X(), aPt.Y() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1632,7 +1672,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
                                        0, pAct->GetDXArray() );
             Point aPt( pAct->GetPoint() );
             aRect.Move( aPt.X(), aPt.Y() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1645,7 +1685,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
                                        pAct->GetWidth(), NULL );
             Point aPt( pAct->GetPoint() );
             aRect.Move( aPt.X(), aPt.Y() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1661,7 +1701,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             Point aPt( pAct->GetStartPoint() );
             aRect.Move( aPt.X(), aPt.Y() );
             aRect.Right() = aRect.Left() + pAct->GetWidth();
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1669,7 +1709,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaBmpScaleAction* pAct = (MetaBmpScaleAction*) pAction;
             Rectangle aRect( pAct->GetPoint(), pAct->GetSize() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1677,7 +1717,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaBmpScalePartAction* pAct = (MetaBmpScalePartAction*) pAction;
             Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1685,7 +1725,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaBmpExScaleAction*   pAct = (MetaBmpExScaleAction*) pAction;
             Rectangle aRect( pAct->GetPoint(), pAct->GetSize() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1693,7 +1733,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaBmpExScalePartAction*   pAct = (MetaBmpExScalePartAction*) 
pAction;
             Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1701,7 +1741,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaGradientAction* pAct = (MetaGradientAction*) pAction;
             Rectangle aRect( pAct->GetRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1709,7 +1749,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaGradientExAction* pAct = (MetaGradientExAction*) pAction;
             Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1723,7 +1763,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaHatchAction*   pAct = (MetaHatchAction*) pAction;
             Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1731,7 +1771,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaTransparentAction* pAct = (MetaTransparentAction*) pAction;
             Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1756,7 +1796,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
             // transform the rect to current VDev state
             aRect = aMapVDev.LogicToLogic( aRect, aTransMtf.GetPrefMapMode(), 
aMapVDev.GetMapMode() );
 
-            ImplActionBounds( aBound, aRect, aClipStack );
+            ImplActionBounds( aBound, aRect, aClipStack, 0 );
         }
         break;
 
@@ -1764,7 +1804,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaEPSAction*     pAct = (MetaEPSAction*) pAction;
             Rectangle aRect( pAct->GetPoint(), pAct->GetSize() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1804,7 +1844,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaBmpAction* pAct = (MetaBmpAction*) pAction;
             Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( 
pAct->GetBitmap().GetSizePixel() ) );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1812,7 +1852,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaBmpExAction* pAct = (MetaBmpExAction*) pAction;
             Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( 
pAct->GetBitmapEx().GetSizePixel() ) );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1820,7 +1860,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaMaskAction* pAct = (MetaMaskAction*) pAction;
             Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( 
pAct->GetBitmap().GetSizePixel() ) );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1828,7 +1868,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaMaskScalePartAction* pAct = (MetaMaskScalePartAction*) pAction;
             Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1836,7 +1876,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaMaskScalePartAction* pAct = (MetaMaskScalePartAction*) pAction;
             Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1844,7 +1884,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaWallpaperAction* pAct = (MetaWallpaperAction*) pAction;
             Rectangle aRect( pAct->GetRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 
@@ -1852,7 +1892,7 @@ Rectangle GDIMetaFile::GetBoundRect( Out
         {
             MetaTextRectAction* pAct = (MetaTextRectAction*) pAction;
             Rectangle aRect( pAct->GetRect() );
-            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack );
+            ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, 
aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack, 0 );
         }
         break;
 

Modified: incubator/ooo/trunk/main/vcl/source/gdi/impgraph.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/vcl/source/gdi/impgraph.cxx?rev=1293316&r1=1293315&r2=1293316&view=diff
==============================================================================
--- incubator/ooo/trunk/main/vcl/source/gdi/impgraph.cxx (original)
+++ incubator/ooo/trunk/main/vcl/source/gdi/impgraph.cxx Fri Feb 24 16:11:11 
2012
@@ -559,41 +559,60 @@ Bitmap ImpGraphic::ImplGetBitmap(const G
     }
     else if( ( meType != GRAPHIC_DEFAULT ) && ImplIsSupportedGraphic() )
     {
-        // use corner points of graphic to determine the pixel
-        // extent of the graphic (rounding errors are possible else)
-        VirtualDevice  aVDev;
-           const Point     aNullPt;
-        const Point     aTLPix( aVDev.LogicToPixel( aNullPt, 
maMetaFile.GetPrefMapMode() ) );
-        const Point     aBRPix( aVDev.LogicToPixel( Point( 
maMetaFile.GetPrefSize().Width() - 1, maMetaFile.GetPrefSize().Height() - 1 ), 
maMetaFile.GetPrefMapMode() ) );
-        Size            aDrawSize( aVDev.LogicToPixel( 
maMetaFile.GetPrefSize(), maMetaFile.GetPrefMapMode() ) );
-        Size                   aSizePix( labs( aBRPix.X() - aTLPix.X() ) + 1, 
labs( aBRPix.Y() - aTLPix.Y() ) + 1 );
+        // calculate size
+        VirtualDevice aVDev;
+        Size aDrawSize(aVDev.LogicToPixel(maMetaFile.GetPrefSize(), 
maMetaFile.GetPrefMapMode()));
 
         if(rParameters.getSizePixel().Width() && 
rParameters.getSizePixel().Height())
         {
-            aDrawSize.Width() = 
FRound((double)rParameters.getSizePixel().Width() *
-                (double)aDrawSize.Width() / (double)aSizePix.Width());
-            aDrawSize.Height() = 
FRound((double)rParameters.getSizePixel().Height() *
-                (double)aDrawSize.Height() / (double)aSizePix.Height());
+            // apply given size if exists
+            aDrawSize = rParameters.getSizePixel();
+        }
+
+        if(aDrawSize.Width() && aDrawSize.Height() && 
!rParameters.getUnlimitedSize()
+            && (aDrawSize.Width() > GRAPHIC_MTFTOBMP_MAXEXT || 
aDrawSize.Height() > GRAPHIC_MTFTOBMP_MAXEXT))
+        {
+            // limit bitmap size to a maximum of GRAPHIC_MTFTOBMP_MAXEXT x 
GRAPHIC_MTFTOBMP_MAXEXT
+            double fWH((double)aDrawSize.Width() / (double)aDrawSize.Height());
 
-            aSizePix = rParameters.getSizePixel();
+            if(fWH <= 1.0)
+            {
+                aDrawSize.setWidth(basegfx::fround(GRAPHIC_MTFTOBMP_MAXEXT * 
fWH));
+                aDrawSize.setHeight(GRAPHIC_MTFTOBMP_MAXEXT);
+            }
+            else
+            {
+                aDrawSize.setWidth(GRAPHIC_MTFTOBMP_MAXEXT);
+                aDrawSize.setHeight(basegfx::fround(GRAPHIC_MTFTOBMP_MAXEXT / 
fWH));
+            }
         }
 
-               if( aSizePix.Width() && aSizePix.Height() && 
!rParameters.getUnlimitedSize()
-            && (aSizePix.Width() > GRAPHIC_MTFTOBMP_MAXEXT || 
aSizePix.Height() > GRAPHIC_MTFTOBMP_MAXEXT))
-               {
-                       const Size  aOldSizePix( aSizePix );
-            double      fWH = (double) aSizePix.Width() / aSizePix.Height();
+        // calculate pixel size. Normally, it's the same as aDrawSize, but may
+        // need to be extended when hairlines are on the right or bottom edge
+        Size aPixelSize(aDrawSize);
 
-                       if( fWH <= 1.0 )
-                               aSizePix.Width() = FRound( 
GRAPHIC_MTFTOBMP_MAXEXT * fWH ), aSizePix.Height() = GRAPHIC_MTFTOBMP_MAXEXT;
-                       else
-                               aSizePix.Width() = GRAPHIC_MTFTOBMP_MAXEXT, 
aSizePix.Height() = FRound(  GRAPHIC_MTFTOBMP_MAXEXT / fWH );
+        if(GRAPHIC_GDIMETAFILE == ImplGetType())
+        {
+            // get hairline and full bound rect
+            Rectangle aHairlineRect;
+            const Rectangle aRect(maMetaFile.GetBoundRect(aVDev, 
&aHairlineRect));
 
-            aDrawSize.Width() = FRound( ( (double) aDrawSize.Width() * 
aSizePix.Width() ) / aOldSizePix.Width() );
-            aDrawSize.Height() = FRound( ( (double) aDrawSize.Height() * 
aSizePix.Height() ) / aOldSizePix.Height() );
-               }
+            if(!aRect.IsEmpty() && !aHairlineRect.IsEmpty())
+            {
+                // expand if needed to allow bottom and right hairlines to be 
added
+                if(aRect.Right() == aHairlineRect.Right())
+                {
+                    aPixelSize.setWidth(aPixelSize.getWidth() + 1);
+                }
+
+                if(aRect.Bottom() == aHairlineRect.Bottom())
+                {
+                    aPixelSize.setHeight(aPixelSize.getHeight() + 1);
+                }
+            }
+        }
 
-               if( aVDev.SetOutputSizePixel( aSizePix ) )
+        if(aVDev.SetOutputSizePixel(aPixelSize))
         {
             if(rParameters.getAntiAliase())
             {
@@ -605,8 +624,8 @@ Bitmap ImpGraphic::ImplGetBitmap(const G
                 aVDev.SetAntialiasing(aVDev.GetAntialiasing() | 
ANTIALIASING_PIXELSNAPHAIRLINE);
             }
 
-            ImplDraw( &aVDev, aNullPt, aDrawSize );
-            aRetBmp =  aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() );
+            ImplDraw( &aVDev, Point(), aDrawSize );
+            aRetBmp =  aVDev.GetBitmap( Point(), aVDev.GetOutputSizePixel() );
         }
     }
 


Reply via email to