[ooo-build-commit] Branch 'ooo/OOO320' - 3 commits - comphelper/source goodies/source svtools/inc svtools/source tools/inc tools/source vcl/aqua vcl/source vcl/win

Jan Holesovsky kendy at kemper.freedesktop.org
Tue Oct 27 21:47:44 PDT 2009


 comphelper/source/misc/uieventslogger.cxx     |   32 ++++++++++
 goodies/source/filter.vcl/eos2met/eos2met.cxx |    6 -
 goodies/source/filter.vcl/epict/epict.cxx     |    6 -
 svtools/inc/svtools/embedhlp.hxx              |   10 ++-
 svtools/source/filter.vcl/igif/decode.cxx     |    3 
 svtools/source/filter.vcl/ixpm/xpmread.cxx    |   21 ++++--
 svtools/source/filter.vcl/wmf/wmfwr.cxx       |    6 -
 svtools/source/misc/embedhlp.cxx              |   41 ++++++++++---
 tools/inc/tools/poly.hxx                      |    2 
 tools/source/generic/poly.cxx                 |   53 -----------------
 tools/source/generic/poly2.cxx                |   17 -----
 vcl/aqua/source/gdi/salgdi.cxx                |    6 +
 vcl/source/fontsubset/cff.cxx                 |   80 +++++++++++++++-----------
 vcl/source/gdi/cvtsvm.cxx                     |   40 ++++++++++---
 vcl/source/gdi/metaact.cxx                    |   37 ++++++++++--
 vcl/source/gdi/outdev3.cxx                    |    2 
 vcl/source/gdi/region.cxx                     |    8 ++
 vcl/source/gdi/sallayout.cxx                  |    8 +-
 vcl/win/source/gdi/winlayout.cxx              |    5 -
 19 files changed, 225 insertions(+), 158 deletions(-)

New commits:
commit 998daee6f7862e153aed4417c6d4aef9a38fc4e3
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date:   Tue Oct 27 15:20:25 2009 +0000

    CWS-TOOLING: integrate CWS ooo32gsl01
    2009-10-13 15:59:25 +0200 hdu  r276868 : #i100000# fix remaining merge conflict
    2009-10-12 16:08:38 +0200 hdu  r276837 : CWS-TOOLING: rebase CWS ooo32gsl01 to branches/OOO320 at 276773 (milestone: OOO320:m1)
    2009-09-15 10:09:52 +0200 hdu  r276150 : #i104861# adjust metrics to pseudo-emUnits==1000 expectation
    for better precision allow non-integer charwidth/stemwidth
    2009-09-15 09:58:00 +0200 hdu  r276149 : #i104861# prepare to fix by updating cff.cxx to latest version from CWS vcl105
    2009-09-14 16:06:46 +0200 hdu  r276130 : #i104221# treat judeo-spanish varika as diacritic also in problematic fonts (thanks yoramg)
    2009-09-14 15:27:14 +0200 hdu  r276126 : #i104221# fix regression with he/ar diacritics
    2009-09-10 15:39:58 +0200 aw  r276038 : #i104867# added a GraphicVersion number to EmbeddedObjectRef to allow Grahic chamge checks without fetching the graphic
    2009-09-10 15:38:41 +0200 aw  r276037 : #i104867# added GraphicVersionNumber to SdrOleContentPrimitive to detect OLE content change without getting the Graphic
    2009-09-09 17:16:43 +0200 hdu  r276006 : #i104886# Aqua: fix for 101491 only applies to non-hairlines
    2009-09-09 16:39:05 +0200 hdu  r276002 : #i99849# don't give up on ScriptItemize too early

diff --git a/svtools/inc/svtools/embedhlp.hxx b/svtools/inc/svtools/embedhlp.hxx
index 462f692..b993129 100644
--- a/svtools/inc/svtools/embedhlp.hxx
+++ b/svtools/inc/svtools/embedhlp.hxx
@@ -6,9 +6,6 @@
  *
  * OpenOffice.org - a multi-platform office productivity suite
  *
- * $RCSfile: embedhlp.hxx,v $
- * $Revision: 1.2 $
- *
  * This file is part of OpenOffice.org.
  *
  * OpenOffice.org is free software: you can redistribute it and/or modify
@@ -131,6 +128,13 @@ namespace svt
         BOOL            is() const { return mxObj.is(); }
 
         BOOL            IsChart() const;
+
+        // #i104867#
+        // Provides a graphic version number for the fetchable Graphic during this object's lifetime. Internally,
+        // that number is incremented at each change of the Graphic. This mechanism is needed to identify if a 
+        // remembered Graphic (e.g. primitives) has changed compared to the current one, but without actively 
+        // fetching the Graphic what would be too expensive e.g. for charts
+        sal_uInt32 getGraphicVersion() const;
         void            SetDefaultSizeForChart( const Size& rSizeIn_100TH_MM );//#i103460# charts do not necessaryly have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this method
     };
 }
diff --git a/svtools/source/misc/embedhlp.cxx b/svtools/source/misc/embedhlp.cxx
index 38022b9..6a40859 100644
--- a/svtools/source/misc/embedhlp.cxx
+++ b/svtools/source/misc/embedhlp.cxx
@@ -7,7 +7,6 @@
  * OpenOffice.org - a multi-platform office productivity suite
  *
  * $RCSfile: embedhlp.cxx,v $
- * $Revision: 1.28 $
  *
  * This file is part of OpenOffice.org.
  *
@@ -189,7 +188,6 @@ void SAL_CALL EmbedEventListener_Impl::modified( const lang::EventObject& ) thro
             pObject->UpdateReplacementOnDemand();
         }
     }
-
 }
 
 void SAL_CALL EmbedEventListener_Impl::notifyEvent( const document::EventObject& aEvent ) throw( uno::RuntimeException )
@@ -250,6 +248,9 @@ struct EmbeddedObjectRef_Impl
     sal_Int64                                   nViewAspect;
     BOOL                                        bIsLocked;
     sal_Bool                                    bNeedUpdate;
+
+    // #i104867#
+    sal_uInt32                                  mnGraphicVersion;
     awt::Size                                   aDefaultSizeForChart_In_100TH_MM;//#i103460# charts do not necessaryly have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this member
 };
 
@@ -262,6 +263,7 @@ void EmbeddedObjectRef::Construct_Impl()
     mpImp->nViewAspect = embed::Aspects::MSOLE_CONTENT;
     mpImp->bIsLocked = FALSE;
     mpImp->bNeedUpdate = sal_False;
+    mpImp->mnGraphicVersion = 0;
     mpImp->aDefaultSizeForChart_In_100TH_MM = awt::Size(8000,7000);
 }
 
@@ -297,12 +299,14 @@ EmbeddedObjectRef::EmbeddedObjectRef( const EmbeddedObjectRef& rObj )
         mpImp->pGraphic = 0;
 
     mpImp->pHCGraphic = 0;
+    mpImp->mnGraphicVersion = 0;
 }
 
 EmbeddedObjectRef::~EmbeddedObjectRef()
 {
     delete mpImp->pGraphic;
-    if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic );
+    if ( mpImp->pHCGraphic ) 
+        DELETEZ( mpImp->pHCGraphic );
     Clear();
 }
 /*
@@ -453,10 +457,15 @@ void EmbeddedObjectRef::GetReplacement( BOOL bUpdate )
         DELETEZ( mpImp->pGraphic );
         mpImp->aMediaType = ::rtl::OUString();
         mpImp->pGraphic = new Graphic;
-        if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic );
+        if ( mpImp->pHCGraphic ) 
+            DELETEZ( mpImp->pHCGraphic );
+        mpImp->mnGraphicVersion++;
     }
     else if ( !mpImp->pGraphic )
+    {
         mpImp->pGraphic = new Graphic;
+        mpImp->mnGraphicVersion++;
+    }
     else
     {
         DBG_ERROR("No update, but replacement exists already!");
@@ -469,6 +478,7 @@ void EmbeddedObjectRef::GetReplacement( BOOL bUpdate )
         GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
         if( mpImp->pGraphic )
             pGF->ImportGraphic( *mpImp->pGraphic, String(), *pGraphicStream, GRFILTER_FORMAT_DONTKNOW );
+        mpImp->mnGraphicVersion++;
         delete pGraphicStream;
     }
 }
@@ -598,6 +608,7 @@ Graphic* EmbeddedObjectRef::GetHCGraphic() const
                         mpImp->pHCGraphic = pGraphic;
                     else
                         delete pGraphic;
+                    mpImp->mnGraphicVersion++;
                 }
 
                 delete pStream;
@@ -615,7 +626,9 @@ void EmbeddedObjectRef::SetGraphicStream( const uno::Reference< io::XInputStream
         delete mpImp->pGraphic;
     mpImp->pGraphic = new Graphic();
     mpImp->aMediaType = rMediaType;
-    if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic );
+    if ( mpImp->pHCGraphic ) 
+        DELETEZ( mpImp->pHCGraphic );
+    mpImp->mnGraphicVersion++;
 
     SvStream* pGraphicStream = ::utl::UcbStreamHelper::CreateStream( xInGrStream );
 
@@ -623,6 +636,7 @@ void EmbeddedObjectRef::SetGraphicStream( const uno::Reference< io::XInputStream
     {
         GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
         pGF->ImportGraphic( *mpImp->pGraphic, String(), *pGraphicStream, GRFILTER_FORMAT_DONTKNOW );
+        mpImp->mnGraphicVersion++;
     
         if ( mpImp->pContainer )
         {
@@ -645,7 +659,9 @@ void EmbeddedObjectRef::SetGraphic( const Graphic& rGraphic, const ::rtl::OUStri
         delete mpImp->pGraphic;
     mpImp->pGraphic = new Graphic( rGraphic );
     mpImp->aMediaType = rMediaType;
-    if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic );
+    if ( mpImp->pHCGraphic ) 
+        DELETEZ( mpImp->pHCGraphic );
+    mpImp->mnGraphicVersion++;
 
     if ( mpImp->pContainer )
         SetGraphicToContainer( rGraphic, *mpImp->pContainer, mpImp->aPersistName, rMediaType );
@@ -880,7 +896,9 @@ void EmbeddedObjectRef::UpdateReplacementOnDemand()
 {
     DELETEZ( mpImp->pGraphic );
     mpImp->bNeedUpdate = sal_True;
-    if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic );
+    if ( mpImp->pHCGraphic ) 
+        DELETEZ( mpImp->pHCGraphic );
+    mpImp->mnGraphicVersion++;
 
     if( mpImp->pContainer )
     {
@@ -914,6 +932,12 @@ BOOL EmbeddedObjectRef::IsChart() const
     return sal_False;
 }
 
+// #i104867#
+sal_uInt32 EmbeddedObjectRef::getGraphicVersion() const
+{
+    return mpImp->mnGraphicVersion;
+}
+
 void EmbeddedObjectRef::SetDefaultSizeForChart( const Size& rSizeIn_100TH_MM )
 {
     //#i103460# charts do not necessaryly have an own size within ODF files,
@@ -928,4 +952,5 @@ void EmbeddedObjectRef::SetDefaultSizeForChart( const Size& rSizeIn_100TH_MM )
         xSizeTransmitter->setDefaultSize( mpImp->aDefaultSizeForChart_In_100TH_MM );
 }
 
-}
+} // namespace svt
+
diff --git a/vcl/aqua/source/gdi/salgdi.cxx b/vcl/aqua/source/gdi/salgdi.cxx
index dd07bf1..60885d5 100644
--- a/vcl/aqua/source/gdi/salgdi.cxx
+++ b/vcl/aqua/source/gdi/salgdi.cxx
@@ -966,13 +966,15 @@ bool AquaSalGraphics::drawPolyLine( const ::basegfx::B2DPolygon& rPolyLine,
     if( nPointCount <= 0 )
         return true;
 
-    // reject strange requests
+    // reject requests that cannot be handled yet
     if( rLineWidths.getX() != rLineWidths.getY() )
         return false;
 
     // #i101491# Aqua does not support B2DLINEJOIN_NONE; return false to use
     // the fallback (own geometry preparation)
-    if(basegfx::B2DLINEJOIN_NONE == eLineJoin)
+    // #i104886# linejoin-mode and thus the above only applies to "fat" lines
+    if( (basegfx::B2DLINEJOIN_NONE == eLineJoin)
+    && (rLineWidths.getX() > 1.3) )
         return false;
 
     // setup line attributes
diff --git a/vcl/source/fontsubset/cff.cxx b/vcl/source/fontsubset/cff.cxx
index 281262b..0e56b8d 100644
--- a/vcl/source/fontsubset/cff.cxx
+++ b/vcl/source/fontsubset/cff.cxx
@@ -332,12 +332,13 @@ struct CffLocal
     int		mnLocalSubrBase;
     int		mnLocalSubrCount;
     int		mnLocalSubrBias;
-    int		mnNominalWidth;
-    int		mnDefaultWidth;
+
+    ValType	maNominalWidth;
+    ValType maDefaultWidth;
 
     // ATM hinting related values
-    int			mnStemStdHW;
-    int			mnStemStdVW;
+    ValType		maStemStdHW;
+    ValType		maStemStdVW;
     ValVector	maStemSnapH;
     ValVector	maStemSnapV;
     ValVector	maBlueValues;
@@ -461,10 +462,10 @@ public: // TODO: is public really needed?
     void	getHintPair( int nIndex, ValType* nMin, ValType* nEnd) const;
 
     // accessing other charstring specifics
-    bool	hasCharWidth( void) const { return (mnCharWidth != -1);}
-    int		getCharWidth( void) const { return mnCharWidth;}
-    void	setNominalWidth( int nWidth) { mpCffLocal->mnNominalWidth = nWidth;}
-    void	setDefaultWidth( int nWidth) { mpCffLocal->mnDefaultWidth = nWidth;}
+    bool	hasCharWidth( void) const { return (maCharWidth > 0);}
+    ValType	getCharWidth( void) const { return maCharWidth;}
+    void	setNominalWidth( ValType aWidth) { mpCffLocal->maNominalWidth = aWidth;}
+    void	setDefaultWidth( ValType aWidth) { mpCffLocal->maDefaultWidth = aWidth;}
     void	updateWidth( bool bUseFirstVal);
 
 private:
@@ -477,7 +478,7 @@ private:
     int	mnHorzHintSize;
     ValType	mnHintStack[ NMAXHINTS];
 
-    int	mnCharWidth;
+    ValType	maCharWidth;
 };
 
 // --------------------------------------------------------------------
@@ -488,7 +489,7 @@ CffSubsetterContext::CffSubsetterContext( const U8* pBasePtr, int nBaseLen)
 ,	mnStackIdx(0)
 ,	mnHintSize(0)
 ,	mnHorzHintSize(0)
-,	mnCharWidth(-1)
+,	maCharWidth(-1)
 {
 //	setCharStringType( 1);
     // TODO: new CffLocal[ mnFDAryCount];
@@ -542,13 +543,13 @@ inline void CffSubsetterContext::updateWidth( bool bUseFirstVal)
         return;
 #endif
     if( bUseFirstVal) {
-        mnCharWidth = static_cast<int>(mpCffLocal->mnNominalWidth + mnValStack[0]);
+        maCharWidth = mpCffLocal->maNominalWidth + mnValStack[0];
         // remove bottom stack entry
         --mnStackIdx;
         for( int i = 0; i < mnStackIdx; ++i)
             mnValStack[ i] = mnValStack[ i+1];
     } else {
-        mnCharWidth = mpCffLocal->mnDefaultWidth;
+        maCharWidth = mpCffLocal->maDefaultWidth;
     }
 }
 
@@ -615,7 +616,7 @@ void CffSubsetterContext::readCharString( const U8* pTypeOps, int nTypeLen)
     mnStackIdx = 0;
     mnHintSize = 0;
     mnHorzHintSize = 0;
-    mnCharWidth = -1;
+    maCharWidth = -1;
 
     assert( nTypeLen >= 0);
 //	assert( nEnd <= getLength());
@@ -659,14 +660,14 @@ void CffSubsetterContext::readDictOp( void)
             nVal = popVal();
             nInt = static_cast<int>(nVal);
             switch( nOpId) {
-            case  10: mpCffLocal->mnStemStdHW = nInt;  break; 	// "StdHW"
-            case  11: mpCffLocal->mnStemStdVW = nInt; break; 	// "StdVW"
+            case  10: mpCffLocal->maStemStdHW = nVal; break; 	// "StdHW"
+            case  11: mpCffLocal->maStemStdVW = nVal; break; 	// "StdVW"
             case  15: mnCharsetBase = nInt; break;				// "charset"
             case  16: mnEncodingBase = nInt; break;				// "nEncoding"
             case  17: mnCharStrBase = nInt; break;				// "nCharStrings"
             case  19: mpCffLocal->mnLocalSubrOffs = nInt; break;// "nSubrs"
-            case  20: setDefaultWidth( nInt ); break;			// "defaultWidthX"
-            case  21: setNominalWidth( nInt ); break;			// "nominalWidthX"
+            case  20: setDefaultWidth( nVal ); break;			// "defaultWidthX"
+            case  21: setNominalWidth( nVal ); break;			// "nominalWidthX"
             case 909: mpCffLocal->mfBlueScale = nVal; break; 	// "BlueScale"
             case 910: mpCffLocal->mfBlueShift = nVal; break; 	// "BlueShift"
             case 911: mpCffLocal->mfBlueFuzz = nVal; break; 	// "BlueFuzz"
@@ -1477,7 +1478,7 @@ int CffSubsetterContext::convert2Type1Ops( CffLocal* pCffLocal, const U8* const
 mbSawError = false;
 mbNeedClose = false;
 mbIgnoreHints = false;
-mnHintSize=mnHorzHintSize=mnStackIdx=0; mnCharWidth=-1;//#######
+mnHintSize=mnHorzHintSize=mnStackIdx=0; maCharWidth=-1;//#######
 mnCntrMask = 0;
     while( mpReadPtr < mpReadEnd)
         convertOneTypeOp();
@@ -1673,10 +1674,10 @@ CffLocal::CffLocal( void)
 ,	mnLocalSubrBase( 0)
 ,	mnLocalSubrCount( 0)
 ,	mnLocalSubrBias( 0)
-,	mnNominalWidth( 0)
-,	mnDefaultWidth( 0)
-,	mnStemStdHW( 0)
-,	mnStemStdVW( 0)
+,	maNominalWidth( 0)
+,	maDefaultWidth( 0)
+,	maStemStdHW( 0)
+,	maStemStdVW( 0)
 ,	mfBlueScale( 0.0)
 ,	mfBlueShift( 0.0)
 ,	mfBlueFuzz( 0.0)
@@ -2296,8 +2297,8 @@ bool CffSubsetterContext::emitAsType1( Type1Emitter& rEmitter,
     nPrivEntryCount += (mpCffLocal->mfBlueShift != 0.0);
     nPrivEntryCount += (mpCffLocal->mfBlueFuzz != 0.0);
     // emit stem hints only if non-default values
-    nPrivEntryCount += (mpCffLocal->mnStemStdHW != 0);
-    nPrivEntryCount += (mpCffLocal->mnStemStdVW != 0);
+    nPrivEntryCount += (mpCffLocal->maStemStdHW != 0);
+    nPrivEntryCount += (mpCffLocal->maStemStdVW != 0);
     nPrivEntryCount += !mpCffLocal->maStemSnapH.empty();
     nPrivEntryCount += !mpCffLocal->maStemSnapV.empty();
     // emit other hints only if non-default values
@@ -2337,10 +2338,10 @@ bool CffSubsetterContext::emitAsType1( Type1Emitter& rEmitter,
         pOut += sprintf( pOut, "/BlueFuzz %.1f def\n", mpCffLocal->mfBlueFuzz);
 
     // emit stem hint related privdict entries
-    if( mpCffLocal->mnStemStdHW)
-        pOut += sprintf( pOut, "/StdHW [%d] def\n", mpCffLocal->mnStemStdHW);
-    if( mpCffLocal->mnStemStdVW)
-        pOut += sprintf( pOut, "/StdVW [%d] def\n", mpCffLocal->mnStemStdVW);
+    if( mpCffLocal->maStemStdHW)
+        pOut += sprintf( pOut, "/StdHW [%g] def\n", mpCffLocal->maStemStdHW);
+    if( mpCffLocal->maStemStdVW)
+        pOut += sprintf( pOut, "/StdVW [%g] def\n", mpCffLocal->maStemStdVW);
     rEmitter.emitValVector( "/StemSnapH [", "]ND\n", mpCffLocal->maStemSnapH);
     rEmitter.emitValVector( "/StemSnapV [", "]ND\n", mpCffLocal->maStemSnapV);
 
@@ -2413,8 +2414,12 @@ bool CffSubsetterContext::emitAsType1( Type1Emitter& rEmitter,
         pOut += sprintf( pOut, " ND\n");
         rEmitter.emitAllCrypted();
         // provide individual glyphwidths if requested
-        if( pGlyphWidths )
-            pGlyphWidths[i] = getCharWidth();
+        if( pGlyphWidths ) {
+            ValType aCharWidth = getCharWidth();
+            if( maFontMatrix.size() >= 4)
+                aCharWidth *= 1000.0F * maFontMatrix[0];
+            pGlyphWidths[i] = static_cast<GlyphWidth>(aCharWidth);
+        }
     }
     pOut += sprintf( pOut, "end end\nreadonly put\nput\n");
     pOut += sprintf( pOut, "dup/FontName get exch definefont pop\n");
@@ -2445,9 +2450,18 @@ bool CffSubsetterContext::emitAsType1( Type1Emitter& rEmitter,
         rEmitter.emitRawData( aPfxFooter+6, sizeof(aPfxFooter)-9);
 
     // provide details to the subset requesters, TODO: move into own method?
-    // note: Top and Bottom are flipped between Type1 and VCL 
-    rFSInfo.m_aFontBBox = Rectangle( Point( static_cast<long>(maFontBBox[0]), static_cast<long>(maFontBBox[1]) ),
-                                     Point( static_cast<long>(maFontBBox[2]), static_cast<long>(maFontBBox[3]) ) );
+    // note: Top and Bottom are flipped between Type1 and VCL
+    // note: the rest of VCL expects the details below to be scaled like for an emUnits==1000 font
+    ValType fXFactor = 1.0;
+    ValType fYFactor = 1.0;
+    if( maFontMatrix.size() >= 4) {
+        fXFactor = 1000.0F * maFontMatrix[0];
+        fYFactor = 1000.0F * maFontMatrix[3];
+    }
+    rFSInfo.m_aFontBBox = Rectangle( Point( static_cast<long>(maFontBBox[0] * fXFactor),
+                                        static_cast<long>(maFontBBox[1] * fYFactor) ),
+                                    Point( static_cast<long>(maFontBBox[2] * fXFactor),
+                                        static_cast<long>(maFontBBox[3] * fYFactor) ) );
     // PDF-Spec says the values below mean the ink bounds!
     // TODO: use better approximations for these ink bounds
     rFSInfo.m_nAscent  = +rFSInfo.m_aFontBBox.Bottom();	// for capital letters
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index afb9828..bd91f20 100755
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -95,11 +95,12 @@ bool IsDiacritic( sal_UCS4 nChar )
      if( nChar >= 0x2100 )
         return false;
 
+    // TODO: #i105058# use icu uchar.h's character classification instead of the handcrafted table
     struct DiaRange { sal_UCS4 mnMin, mnEnd;};
     static const DiaRange aRanges[] = {
         {0x0300, 0x0370},
-        {0x0590, 0x05C0}, {0x05C1, 0x05C3}, {0x05C3, 0x05C6}, {0x05C7, 0x05C8},
-        {0x0610, 0x061B}, {0x064B, 0x0660}, {0x0670, 0x0671}, {0x06D6, 0x06DC}, {0x06DF, 0x06EE},
+        {0x0590, 0x05BE}, {0x05BF, 0x05C0}, {0x05C1, 0x05C3}, {0x05C4, 0x05C6}, {0x05C7, 0x05C8},
+        {0x0610, 0x061B}, {0x064B, 0x0660}, {0x0670, 0x0671}, {0x06D6, 0x06DD}, {0x06DF, 0x06E5}, {0x06E7, 0x06E9}, {0x06EA,0x06EF},
         {0x0730, 0x074D}, {0x07A6, 0x07B1}, {0x07EB, 0x07F4},
 #if 0 // all known fonts have zero-width diacritics already, so no need to query it
         {0x0900, 0x0904}, {0x093C, 0x093D}, {0x0941, 0x0948}, {0x094D, 0x0950}, {0x0951, 0x0958},
@@ -107,7 +108,8 @@ bool IsDiacritic( sal_UCS4 nChar )
         {0x0A00, 0x0A05}, {0x0A3C, 0x0A59}, //...
 #endif
         {0x1DC0, 0x1E00},
-        {0x205F, 0x2070}, {0x20D0, 0x2100}
+        {0x205F, 0x2070}, {0x20D0, 0x2100},
+        {0xFB1E, 0xFB1F}
     };
 
     // TODO: almost anything is faster than an O(n) search
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 8650bfe..2f60089 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -6,9 +6,6 @@
  *
  * OpenOffice.org - a multi-platform office productivity suite
  *
- * $RCSfile: winlayout.cxx,v $
- * $Revision: 1.113.6.9 $
- *
  * This file is part of OpenOffice.org.
  *
  * OpenOffice.org is free software: you can redistribute it and/or modify
@@ -1385,7 +1382,7 @@ bool UniscribeLayout::LayoutText( ImplLayoutArgs& rArgs )
         mpScriptItems = NULL;
         if( nRC != E_OUTOFMEMORY )
             return false;
-        if( nItemCapacity > (nSubStringEnd - mnSubStringMin) )
+        if( nItemCapacity > (nSubStringEnd - mnSubStringMin) + 16 )
             return false;
     }
 
commit be2d0ef966188ec59821b85dcbda1018c2865cef
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date:   Tue Oct 27 14:01:25 2009 +0000

    CWS-TOOLING: integrate CWS impress178
    2009-10-16 19:54:41 +0200 sj  r276995 : removed warning
    2009-10-16 17:46:12 +0200 sj  r276993 : #i103757# applied patch (fixed crash if model changes)
    2009-10-16 16:06:07 +0200 sj  r276985 : CWS-TOOLING: rebase CWS impress178 to branches/OOO320 at 276942 (milestone: OOO320:m2)
    2009-10-08 13:51:23 +0200 sj  r276790 : #i105654# fixed closing of line geometry
    2009-10-07 17:26:56 +0200 sj  r276762 : #i105606# fixed object shadow
    2009-10-07 17:25:39 +0200 sj  r276761 : minor improvements
    2009-10-07 11:48:26 +0200 af  r276745 : #i103047# Prevent context menu of LayoutMenu from being shown when user clicks on background.
    2009-10-07 11:33:59 +0200 af  r276743 : #i99866# Set position of the design control manually.
    2009-10-06 17:18:23 +0200 sj  r276721 : minor improvements
    2009-10-05 18:34:23 +0200 sj  r276692 : #105606# fixed fontsize problem
    2009-10-05 17:26:21 +0200 af  r276691 : #i105354# Never process more than one request in a row.
    2009-10-02 13:24:25 +0200 af  r276639 : #i94242# Taking insertion position of slide sorter correctly into account.
    2009-10-01 13:46:47 +0200 aw  r276602 : #i102224# some Polygon/PolyPolygon usages in SVMConverter ignored the possible curve status of tools::Polygon; added at least an AdaptiveSubdivide
    2009-10-01 12:33:56 +0200 aw  r276588 : #i102224# ImplWritePolyPolygon killed the curve information at the PolyPolygon by NOT copying the flags
    2009-09-30 17:48:56 +0200 aw  r276567 : #i102224# removed GetSimple() from Polygon and PolyPolygon, replaced completely with AdaptiveSubdivide
    2009-09-30 15:45:46 +0200 aw  r276559 : #i102048# secured primitive creation for dimension lines with linestyle none
    2009-09-30 14:56:41 +0200 af  r276556 : #i105471# Reordered statements in ~SdModule.
    2009-09-30 14:47:12 +0200 aw  r276555 : #i105373# corrected curve ignoring places in MetaFile export

diff --git a/goodies/source/filter.vcl/eos2met/eos2met.cxx b/goodies/source/filter.vcl/eos2met/eos2met.cxx
index ace2019..1c57030 100644
--- a/goodies/source/filter.vcl/eos2met/eos2met.cxx
+++ b/goodies/source/filter.vcl/eos2met/eos2met.cxx
@@ -1753,7 +1753,7 @@ void METWriter::WriteOrders( const GDIMetaFile* pMTF )
                     Polygon aSimplePoly;
                     const Polygon& rPoly = pA->GetPolygon();
                     if ( rPoly.HasFlags() )
-                        rPoly.GetSimple( aSimplePoly );
+                        rPoly.AdaptiveSubdivide( aSimplePoly );
                     else
                         aSimplePoly = rPoly;
                     METLine( aSimplePoly );
@@ -1772,7 +1772,7 @@ void METWriter::WriteOrders( const GDIMetaFile* pMTF )
                 Polygon aSimplePoly;
                 const Polygon& rPoly = pA->GetPolygon();
                 if ( rPoly.HasFlags() )
-                    rPoly.GetSimple( aSimplePoly );
+                    rPoly.AdaptiveSubdivide( aSimplePoly );
                 else
                     aSimplePoly = rPoly;
                 if( aGDIFillColor != Color( COL_TRANSPARENT ) )
@@ -1809,7 +1809,7 @@ void METWriter::WriteOrders( const GDIMetaFile* pMTF )
                     if ( aSimplePolyPoly[ i ].HasFlags() )
                     {
                         Polygon aSimplePoly;
-                        aSimplePolyPoly[ i ].GetSimple( aSimplePoly );
+                        aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly );
                         aSimplePolyPoly[ i ] = aSimplePoly;
                     }
                 }
diff --git a/goodies/source/filter.vcl/epict/epict.cxx b/goodies/source/filter.vcl/epict/epict.cxx
index 160eaae..888ba97 100644
--- a/goodies/source/filter.vcl/epict/epict.cxx
+++ b/goodies/source/filter.vcl/epict/epict.cxx
@@ -1573,7 +1573,7 @@ void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF )
 
                     Polygon aSimplePoly;
                     if ( rPoly.HasFlags() )
-                        rPoly.GetSimple( aSimplePoly );
+                        rPoly.AdaptiveSubdivide( aSimplePoly );
                     else
                         aSimplePoly = rPoly;
 
@@ -1603,7 +1603,7 @@ void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF )
 
                 Polygon aSimplePoly;
                 if ( rPoly.HasFlags() )
-                    rPoly.GetSimple( aSimplePoly );
+                    rPoly.AdaptiveSubdivide( aSimplePoly );
                 else
                     aSimplePoly = rPoly;
 
@@ -1632,7 +1632,7 @@ void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF )
                     if ( aSimplePolyPoly[ i ].HasFlags() )
                     {
                         Polygon aSimplePoly;
-                        aSimplePolyPoly[ i ].GetSimple( aSimplePoly );
+                        aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly );
                         aSimplePolyPoly[ i ] = aSimplePoly;
                     }
                 }
diff --git a/svtools/source/filter.vcl/igif/decode.cxx b/svtools/source/filter.vcl/igif/decode.cxx
index ec63b4f..781bb43 100644
--- a/svtools/source/filter.vcl/igif/decode.cxx
+++ b/svtools/source/filter.vcl/igif/decode.cxx
@@ -51,7 +51,6 @@ GIFLZWDecompressor::GIFLZWDecompressor( BYTE cDataSize ) :
             bEOIFound			( FALSE ),
             nDataSize			( cDataSize )
 {
-    pTable = new GIFLZWTableEntry[ 4096 ];
     pOutBuf	= new BYTE[ 4096 ];
 
     nClearCode = 1 << nDataSize;
@@ -61,6 +60,8 @@ GIFLZWDecompressor::GIFLZWDecompressor( BYTE cDataSize ) :
     nOldCode = 0xffff;
     pOutBufData = pOutBuf + 4096;
 
+    pTable = new GIFLZWTableEntry[ 4098 ];
+
     for( USHORT i = 0; i < nTableSize; i++ )
     {
         pTable[i].pPrev = NULL;
diff --git a/svtools/source/filter.vcl/ixpm/xpmread.cxx b/svtools/source/filter.vcl/ixpm/xpmread.cxx
index 2e83712..ecad9ab 100644
--- a/svtools/source/filter.vcl/ixpm/xpmread.cxx
+++ b/svtools/source/filter.vcl/ixpm/xpmread.cxx
@@ -109,6 +109,10 @@ ReadState XPMReader::ReadXPM( Graphic& rGraphic )
                 mnColors = ImplGetULONG( 2 );
                 mnCpp = ImplGetULONG( 3 );
             }
+            if ( mnColors > ( SAL_MAX_UINT32 / ( 4 + mnCpp ) ) )
+                mbStatus = sal_False;
+            if ( ( mnWidth * mnCpp ) >= XPMSTRINGBUF )
+                mbStatus = sal_False;
             if ( mbStatus && mnWidth && mnHeight && mnColors && mnCpp )
             {
                 mnIdentifier = XPMCOLORS;
@@ -118,15 +122,20 @@ ReadState XPMReader::ReadXPM( Graphic& rGraphic )
                 //			    1    Byte	-> 0xff wenn Farbe transparent ist
                 //				3    Bytes  -> RGB Wert der Farbe
                 mpColMap = new BYTE[ mnColors * ( 4 + mnCpp ) ];
-
-                for ( ULONG i = 0; i < mnColors; i++ )
+                if ( mpColMap )
                 {
-                    if ( ImplGetColor( i ) == FALSE )
+                    for ( ULONG i = 0; i < mnColors; i++ )
                     {
-                        mbStatus = FALSE;
-                        break;
+                        if ( ImplGetColor( i ) == FALSE )
+                        {
+                            mbStatus = FALSE;
+                            break;
+                        }
                     }
                 }
+                else
+                    mbStatus = sal_False;
+
                 if ( mbStatus )
                 {
                     // bei mehr als 256 Farben wird eine 24 Bit Grafik erstellt
@@ -630,7 +639,7 @@ BOOL XPMReader::ImplGetString( void )
                 mnStatus &=~XPMSTRING;			// end of parameter by eol
                 break;
             }
-            if ( mnStringSize >= XPMSTRINGBUF )
+            if ( mnStringSize >= ( XPMSTRINGBUF - 1 ) )
             {
                 mbStatus = FALSE;
                 break;
diff --git a/svtools/source/filter.vcl/wmf/wmfwr.cxx b/svtools/source/filter.vcl/wmf/wmfwr.cxx
index dbf6ead..3105c40 100644
--- a/svtools/source/filter.vcl/wmf/wmfwr.cxx
+++ b/svtools/source/filter.vcl/wmf/wmfwr.cxx
@@ -755,7 +755,7 @@ void WMFWriter::WMFRecord_Polygon(const Polygon & rPoly)
 
     Polygon aSimplePoly;
     if ( rPoly.HasFlags() )
-        rPoly.GetSimple( aSimplePoly );
+        rPoly.AdaptiveSubdivide( aSimplePoly );
     else
         aSimplePoly = rPoly;
     nSize = aSimplePoly.GetSize();
@@ -770,7 +770,7 @@ void WMFWriter::WMFRecord_PolyLine(const Polygon & rPoly)
     USHORT nSize,i;
     Polygon aSimplePoly;
     if ( rPoly.HasFlags() )
-        rPoly.GetSimple( aSimplePoly );
+        rPoly.AdaptiveSubdivide( aSimplePoly );
     else
         aSimplePoly = rPoly;
     nSize=aSimplePoly.GetSize();
@@ -792,7 +792,7 @@ void WMFWriter::WMFRecord_PolyPolygon(const PolyPolygon & rPolyPoly)
         if ( aSimplePolyPoly[ i ].HasFlags() )
         {
             Polygon aSimplePoly;
-            aSimplePolyPoly[ i ].GetSimple( aSimplePoly );
+            aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly );
             aSimplePolyPoly[ i ] = aSimplePoly;
         }
     }
diff --git a/tools/inc/tools/poly.hxx b/tools/inc/tools/poly.hxx
index 58f1ac0..bb144b0 100644
--- a/tools/inc/tools/poly.hxx
+++ b/tools/inc/tools/poly.hxx
@@ -182,7 +182,6 @@ public:
     void                Clip( const Rectangle& rRect, BOOL bPolygon = TRUE );
     void				Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData = NULL );
 
-    void				GetSimple( Polygon& rResult ) const;
     /** Adaptive subdivision of polygons with curves
 
         This method adaptively subdivides bezier arcs within the
@@ -288,7 +287,6 @@ public:
     void                Clip( const Rectangle& rRect );
     void				Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData = NULL );
 
-    void				GetSimple( PolyPolygon& rResult ) const;
     /** Adaptive subdivision of polygons with curves
 
         This method adaptively subdivides bezier arcs within the
diff --git a/tools/source/generic/poly.cxx b/tools/source/generic/poly.cxx
index dd6d40e..8db18e9 100644
--- a/tools/source/generic/poly.cxx
+++ b/tools/source/generic/poly.cxx
@@ -957,59 +957,6 @@ void Polygon::Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData )
     }
 }
 
-// -----------------------------------------------------------------------
-
-void Polygon::GetSimple( Polygon& rResult ) const
-{
-    if( !mpImplPolygon->mpFlagAry )
-        rResult = *this;
-    else
-    {
-        ::std::vector< Point > aPointVector;
-
-        for( USHORT i = 0, nCount = GetSize(); i < nCount; )
-        {
-            if( ( ( i + 3 ) < nCount ) && 
-                ( POLY_NORMAL == mpImplPolygon->mpFlagAry[ i ] ) &&
-                ( POLY_CONTROL == mpImplPolygon->mpFlagAry[ i + 1 ] ) &&
-                ( POLY_CONTROL == mpImplPolygon->mpFlagAry[ i + 2 ] ) &&
-                ( POLY_NORMAL == mpImplPolygon->mpFlagAry[ i + 3 ] ) )
-            {
-                const USHORT	nSegmentPoints = 25;
-                const Polygon	aSegmentPoly( mpImplPolygon->mpPointAry[ i ], mpImplPolygon->mpPointAry[ i + 1 ],
-                                              mpImplPolygon->mpPointAry[ i + 3 ], mpImplPolygon->mpPointAry[ i + 2 ], 
-                                              nSegmentPoints );
-                const USHORT	nSegmentSize = aSegmentPoly.GetSize();
-
-                if( nSegmentSize )
-                {
-                    const Point*	pPointArray = aSegmentPoly.mpImplPolygon->mpPointAry;
-                    const Point*	pCur = pPointArray;
-                    const Point*	pLast;
-
-                    aPointVector.push_back( *( pLast = pCur ) );
-
-                    for( USHORT j = 1; j < nSegmentSize; j++ )
-                        if( *( pCur = pPointArray + j ) != *pLast )
-                            aPointVector.push_back( *( pLast = pCur ) );
-                }
-            
-                i += 3;
-            }
-            else
-                aPointVector.push_back( mpImplPolygon->mpPointAry[ i++ ] );
-        }
-
-        // fill result polygon
-        rResult = Polygon( (USHORT)aPointVector.size() );
-        ::std::vector< Point >::iterator aIter( aPointVector.begin() ), aEnd( aPointVector.end() );
-        Point* pPointArray = rResult.mpImplPolygon->mpPointAry;
-        USHORT nPoints = rResult.mpImplPolygon->mnPoints;
-        while( nPoints-- && aIter != aEnd )
-            *pPointArray++ = *aIter++;
-    }
-}
-
 // =======================================================================
 
 /* Recursively subdivide cubic bezier curve via deCasteljau. 
diff --git a/tools/source/generic/poly2.cxx b/tools/source/generic/poly2.cxx
index 803beaf..8b4722e 100644
--- a/tools/source/generic/poly2.cxx
+++ b/tools/source/generic/poly2.cxx
@@ -346,23 +346,6 @@ void PolyPolygon::Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData
 
 // -----------------------------------------------------------------------
 
-void PolyPolygon::GetSimple( PolyPolygon& rResult ) const
-{
-    DBG_CHKTHIS( PolyPolygon, NULL );
-
-    rResult.Clear();
-
-    Polygon aPolygon;
-
-    for( USHORT i = 0; i < mpImplPolyPolygon->mnCount; i++ )
-    {
-        mpImplPolyPolygon->mpPolyAry[ i ]->GetSimple( aPolygon );
-        rResult.Insert( aPolygon );
-    }
-}
-
-// -----------------------------------------------------------------------
-
 void PolyPolygon::AdaptiveSubdivide( PolyPolygon& rResult, const double d ) const
 {
     DBG_CHKTHIS( PolyPolygon, NULL );
diff --git a/vcl/source/gdi/cvtsvm.cxx b/vcl/source/gdi/cvtsvm.cxx
index de119d6..939caad 100644
--- a/vcl/source/gdi/cvtsvm.cxx
+++ b/vcl/source/gdi/cvtsvm.cxx
@@ -90,12 +90,17 @@ void ImplReadPoly( SvStream& rIStm, Polygon& rPoly )
 
 void ImplWritePoly( SvStream& rOStm, const Polygon& rPoly )
 {
-    INT32 nSize = rPoly.GetSize();
+    // #i102224# Here the evtl. curved nature of Polygon was
+    // ignored (for all those Years). Adapted to at least write
+    // a polygon representing the curve as good as possible
+    Polygon aSimplePoly;
+    rPoly.AdaptiveSubdivide(aSimplePoly);
+    INT32 nSize = aSimplePoly.GetSize();
 
     rOStm << nSize;
 
     for( INT32 i = 0; i < nSize; i++ )
-        rOStm << rPoly[ (USHORT) i ];
+        rOStm << aSimplePoly[ (USHORT) i ];
 }
 
 // ------------------------------------------------------------------------
@@ -131,13 +136,18 @@ void ImplWritePolyPolyAction( SvStream& rOStm, const PolyPolygon& rPolyPoly )
 
     for( n = 0; n < nPoly; n++ )
     {
+        // #i102224# Here the evtl. curved nature of Polygon was
+        // ignored (for all those Years). Adapted to at least write
+        // a polygon representing the curve as good as possible
         const Polygon&	rPoly = rPolyPoly[ n ];
-        const USHORT	nSize = rPoly.GetSize();
+        Polygon aSimplePoly;
+        rPoly.AdaptiveSubdivide(aSimplePoly);
+        const USHORT	nSize = aSimplePoly.GetSize();
 
         rOStm << (INT32) nSize;
 
         for( USHORT j = 0; j < nSize; j++ )
-            rOStm << rPoly[ j ];
+            rOStm << aSimplePoly[ j ];
     }
 }
 
@@ -1354,8 +1364,15 @@ ULONG SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf,
             {
                 MetaPolyLineAction* pAct = (MetaPolyLineAction*) pAction;
                 const Polygon&		rPoly = pAct->GetPolygon();
+                
+                // #i102224# Here the evtl. curved nature of Polygon was
+                // ignored (for all those Years). Adapted to at least write
+                // a polygon representing the curve as good as possible
+                Polygon aSimplePoly;
+                rPoly.AdaptiveSubdivide(aSimplePoly);
+
                 const LineInfo& 	rInfo = pAct->GetLineInfo();
-                const USHORT		nPoints = rPoly.GetSize();
+                const USHORT		nPoints = aSimplePoly.GetSize();
                 const BOOL			bFatLine = ( !rInfo.IsDefault() && ( LINE_NONE != rInfo.GetStyle() ) );
 
                 if( bFatLine )
@@ -1369,7 +1386,7 @@ ULONG SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf,
                 rOStm << (INT32) nPoints;
 
                 for( USHORT n = 0; n < nPoints; n++ )
-                    rOStm << rPoly[ n ];
+                    rOStm << aSimplePoly[ n ];
 
                 nCount++;
 
@@ -1385,14 +1402,21 @@ ULONG SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf,
             {
                 MetaPolygonAction*	pAct = (MetaPolygonAction*) pAction;
                 const Polygon&		rPoly = pAct->GetPolygon();
-                const USHORT		nPoints = rPoly.GetSize();
+                
+                // #i102224# Here the evtl. curved nature of Polygon was
+                // ignored (for all those Years). Adapted to at least write
+                // a polygon representing the curve as good as possible
+                Polygon aSimplePoly;
+                rPoly.AdaptiveSubdivide(aSimplePoly);
+                
+                const USHORT		nPoints = aSimplePoly.GetSize();
 
                 rOStm << (INT16) GDI_POLYGON_ACTION;
                 rOStm << (INT32) ( 8 + ( nPoints << 3 ) );
                 rOStm << (INT32) nPoints;
 
                 for( USHORT n = 0; n < nPoints; n++ )
-                    rOStm << rPoly[ n ];
+                    rOStm << aSimplePoly[ n ];
 
                 nCount++;
             }
diff --git a/vcl/source/gdi/metaact.cxx b/vcl/source/gdi/metaact.cxx
index 0d395e5..44f8661 100644
--- a/vcl/source/gdi/metaact.cxx
+++ b/vcl/source/gdi/metaact.cxx
@@ -989,7 +989,7 @@ void MetaPolyLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
     WRITE_BASE_COMPAT( rOStm, 3, pData );	
 
     Polygon aSimplePoly;
-    maPoly.GetSimple( aSimplePoly );
+    maPoly.AdaptiveSubdivide( aSimplePoly );
 
     rOStm << aSimplePoly;								// Version 1
     rOStm << maLineInfo;								// Version 2
@@ -1077,7 +1077,7 @@ void MetaPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
     WRITE_BASE_COMPAT( rOStm, 2, pData );
 
     Polygon aSimplePoly;							// Version 1
-    maPoly.GetSimple( aSimplePoly );
+    maPoly.AdaptiveSubdivide( aSimplePoly );
     rOStm << aSimplePoly;							
 
     sal_uInt8 bHasPolyFlags = maPoly.HasFlags();	// Version 2
@@ -1169,7 +1169,7 @@ void MetaPolyPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
         const Polygon& rPoly = maPolyPoly.GetObject( i );
         if ( rPoly.HasFlags() )
             nNumberOfComplexPolygons++;
-        rPoly.GetSimple( aSimplePoly );
+        rPoly.AdaptiveSubdivide( aSimplePoly );
         rOStm << aSimplePoly;
     }
 
@@ -2581,7 +2581,13 @@ sal_Bool MetaGradientExAction::Compare( const MetaAction& rMetaAction ) const
 void MetaGradientExAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
 {
     WRITE_BASE_COMPAT( rOStm, 1, pData );
-    rOStm << maPolyPoly << maGradient;
+
+    // #i105373# see comment at MetaTransparentAction::Write
+    PolyPolygon aNoCurvePolyPolygon;
+    maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon);
+
+    rOStm << aNoCurvePolyPolygon;
+    rOStm << maGradient;
 }
 
 // ------------------------------------------------------------------------
@@ -2649,7 +2655,13 @@ sal_Bool MetaHatchAction::Compare( const MetaAction& rMetaAction ) const
 void MetaHatchAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
 {
     WRITE_BASE_COMPAT( rOStm, 1, pData );
-    rOStm << maPolyPoly << maHatch;
+
+    // #i105373# see comment at MetaTransparentAction::Write
+    PolyPolygon aNoCurvePolyPolygon;
+    maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon);
+
+    rOStm << aNoCurvePolyPolygon;
+    rOStm << maHatch;
 }
 
 // ------------------------------------------------------------------------
@@ -3716,7 +3728,20 @@ sal_Bool MetaTransparentAction::Compare( const MetaAction& rMetaAction ) const
 void MetaTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
 {
     WRITE_BASE_COMPAT( rOStm, 1, pData );
-    rOStm << maPolyPoly;
+
+    // #i105373# The PolyPolygon in this action may be a curve; this
+    // was ignored until now what is an error. To make older office
+    // versions work with MetaFiles, i opt for applying AdaptiveSubdivide
+    // to the PolyPoylgon.
+    // The alternative would be to really write the curve information
+    // like in MetaPolyPolygonAction::Write (where someone extended it
+    // correctly, but not here :-( ).
+    // The golden solution would be to combine both, but i think it's
+    // not necessary; a good subdivision will be sufficient.
+    PolyPolygon aNoCurvePolyPolygon;
+    maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon);
+
+    rOStm << aNoCurvePolyPolygon;
     rOStm << mnTransPercent;
 }
 
diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx
index 3bd6031..476459d 100644
--- a/vcl/source/gdi/outdev3.cxx
+++ b/vcl/source/gdi/outdev3.cxx
@@ -4835,7 +4835,7 @@ void OutputDevice::ImplGetEmphasisMark( PolyPolygon& rPolyPoly, BOOL& rPolyLine,
                 double dScale = ((double)nDotSize)/1000.0;
                 aPoly.Scale( dScale, dScale );
                 Polygon aTemp;
-                aPoly.GetSimple( aTemp );
+                aPoly.AdaptiveSubdivide( aTemp );
                 Rectangle aBoundRect = aTemp.GetBoundRect();
                 rWidth = aBoundRect.GetWidth();
                 nDotSize = aBoundRect.GetHeight();
diff --git a/vcl/source/gdi/region.cxx b/vcl/source/gdi/region.cxx
index 0e9280e..5bf207f 100644
--- a/vcl/source/gdi/region.cxx
+++ b/vcl/source/gdi/region.cxx
@@ -2537,7 +2537,13 @@ SvStream& operator<<( SvStream& rOStrm, const Region& rRegion )
         rOStrm << bHasPolyPolygon;
 
         if( bHasPolyPolygon )
-            rOStrm << rRegion.GetPolyPolygon();
+        {
+            // #i105373#
+            PolyPolygon aNoCurvePolyPolygon;
+            rRegion.GetPolyPolygon().AdaptiveSubdivide(aNoCurvePolyPolygon);
+            
+            rOStrm << aNoCurvePolyPolygon;
+        }
     }
 
     return rOStrm;
commit ea745038f55e8f194374e175fc69638c62b864c8
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date:   Tue Oct 27 12:27:51 2009 +0000

    CWS-TOOLING: integrate CWS oooimprovement5
    2009-10-14 15:43:16 +0200 b_michaelsen  r276902 : #i105835# removing explict flushes in comphelper as logging::Logger handles flushing
    2009-10-14 15:40:00 +0200 b_michaelsen  r276901 : #i105835# logging::Filehandler::flush flushes, logging::Logger::publish flushes all handlers
    2009-10-14 14:56:03 +0200 b_michaelsen  r276900 : #i105835# flushing filehandler in uieventslogger after each logged record because of buffered i/o
    2009-10-14 14:52:32 +0200 b_michaelsen  r276899 : #i105835# loading the user feedback log readonly with the csv-filter (no need for an import dialog)
    2009-10-14 14:40:46 +0200 od  r276898 : #i105571# method <SwFntObj::GetCrsrOfst(..)>
              - skip character cells also for CJK

diff --git a/comphelper/source/misc/uieventslogger.cxx b/comphelper/source/misc/uieventslogger.cxx
index 2a109db..69864ec 100644
--- a/comphelper/source/misc/uieventslogger.cxx
+++ b/comphelper/source/misc/uieventslogger.cxx
@@ -182,7 +182,7 @@ namespace comphelper
     };
 }
 
-namespace comphelper 
+namespace comphelper
 {
     // consts
     const sal_Int32 UiEventsLogger_Impl::COLUMNS = 9;
@@ -383,6 +383,16 @@ namespace comphelper
             logdata[3] = URL_FILE;
         else
             logdata[3] = url.Main;
+        OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s",
+            OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr());
         m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata));
         m_SessionLogEventCount++;
     }
@@ -391,6 +401,16 @@ namespace comphelper
     {
         Sequence<OUString> logdata = Sequence<OUString>(COLUMNS);
         logdata[0] = ETYPE_ROTATED;
+        OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s",
+            OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr());
         m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata));
     }
 
@@ -412,6 +432,16 @@ namespace comphelper
         logdata[6] = id;
         logdata[7] = method;
         logdata[8] = param;
+        OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s",
+            OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(),
+            OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr());
         m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata));
         m_SessionLogEventCount++;
     }


More information about the ooo-build-commit mailing list