diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2010-01-29 15:36:08 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2010-01-29 15:36:08 +0000 |
commit | 0ea5581ebf8cf414717af74d22d647ed446d63d2 (patch) | |
tree | fa6698372a7ba38d0ef315b0bf5df69c0b6f3cf1 /canvas | |
parent | 04a59adcc7fd221ee6b7644aa1fa53fed8dd3c0e (diff) | |
parent | c0f197f920974f3fdaf8278dad16dc5ecb994d52 (diff) |
ab71: merge with DEV300_m63
Diffstat (limited to 'canvas')
-rw-r--r-- | canvas/source/cairo/cairo_canvasfont.cxx | 3 | ||||
-rw-r--r-- | canvas/source/cairo/cairo_textlayout.cxx | 6 | ||||
-rw-r--r-- | canvas/source/cairo/makefile.mk | 9 | ||||
-rwxr-xr-x | canvas/source/directx/dx_9rm.cxx | 42 | ||||
-rwxr-xr-x | canvas/source/directx/dx_surfacegraphics.cxx | 5 | ||||
-rwxr-xr-x | canvas/source/directx/dx_textlayout_drawhelper.cxx | 3 | ||||
-rwxr-xr-x | canvas/source/directx/dx_winstuff.hxx | 25 | ||||
-rw-r--r-- | canvas/source/directx/makefile.mk | 4 | ||||
-rw-r--r-- | canvas/source/factory/makefile.mk | 4 | ||||
-rw-r--r-- | canvas/source/null/makefile.mk | 4 | ||||
-rw-r--r-- | canvas/source/simplecanvas/makefile.mk | 3 | ||||
-rw-r--r-- | canvas/source/tools/makefile.mk | 4 | ||||
-rw-r--r-- | canvas/source/vcl/canvasfont.cxx | 19 | ||||
-rw-r--r-- | canvas/source/vcl/makefile.mk | 2 | ||||
-rw-r--r-- | canvas/source/vcl/textlayout.cxx | 100 |
15 files changed, 188 insertions, 45 deletions
diff --git a/canvas/source/cairo/cairo_canvasfont.cxx b/canvas/source/cairo/cairo_canvasfont.cxx index 3ef5db762c60..c6fa0847e660 100644 --- a/canvas/source/cairo/cairo_canvasfont.cxx +++ b/canvas/source/cairo/cairo_canvasfont.cxx @@ -37,6 +37,7 @@ #include <basegfx/numeric/ftools.hxx> #include <vcl/metric.hxx> +#include <i18npool/mslangid.hxx> #include "cairo_canvasfont.hxx" #include "cairo_textlayout.hxx" @@ -86,6 +87,8 @@ namespace cairocanvas maFont->SetWeight( static_cast<FontWeight>(rFontRequest.FontDescription.FontDescription.Weight) ); maFont->SetItalic( (rFontRequest.FontDescription.FontDescription.Letterform<=8) ? ITALIC_NONE : ITALIC_NORMAL ); + maFont->SetLanguage(MsLangId::convertLocaleToLanguage(rFontRequest.Locale)); + // adjust to stretched/shrinked font if( !::rtl::math::approxEqual( rFontMatrix.m00, rFontMatrix.m11) ) { diff --git a/canvas/source/cairo/cairo_textlayout.cxx b/canvas/source/cairo/cairo_textlayout.cxx index f822749cab20..08a4e7a70fa1 100644 --- a/canvas/source/cairo/cairo_textlayout.cxx +++ b/canvas/source/cairo/cairo_textlayout.cxx @@ -44,6 +44,12 @@ #include <tools/prewin.h> #include <windows.h> #include <tools/postwin.h> +#ifdef max +#undef max +#endif +#ifdef min +#undef min +#endif #endif #include <vcl/sysdata.hxx> diff --git a/canvas/source/cairo/makefile.mk b/canvas/source/cairo/makefile.mk index bd54254abf7e..27a1aeb6dcd7 100644 --- a/canvas/source/cairo/makefile.mk +++ b/canvas/source/cairo/makefile.mk @@ -49,7 +49,7 @@ DLLPRE = # --- X11 Mac build currently doesn't work with cairo ----------- .IF "$(OS)" == "MACOSX" && "$(GUIBASE)" == "unx" @all: - @echo "Cannot build cairocanvas with X11..." + @echo "Cannot build cairocanvas with X11..." .ENDIF .ENDIF @@ -65,7 +65,7 @@ CFLAGS+=-I$(SOLARINCDIR)/cairo .IF "$(verbose)"!="" || "$(VERBOSE)"!="" CDEFS+= -DVERBOSE .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/cairo_cachedbitmap.obj \ $(SLO)$/cairo_cairo.obj \ $(SLO)$/cairo_canvas.obj \ @@ -84,7 +84,7 @@ SLOFILES = $(SLO)$/cairo_cachedbitmap.obj \ SHL1TARGET=$(TARGET).uno -SHL1STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(TOOLSLIB) +SHL1STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(TOOLSLIB) $(I18NISOLANGLIB) .IF "$(GUI)"=="UNX" @@ -97,7 +97,6 @@ SHL1STDLIBS+= -lcairo .IF "$(GUIBASE)"=="aqua" # native Mac OS X (Quartz) SLOFILES+= $(SLO)$/cairo_quartz_cairo.obj -OBJCXXFLAGS=-x objective-c++ -fobjc-exceptions CFLAGSCXX+=$(OBJCXXFLAGS) .ELSE # "$(GUIBASE)"=="aqua" @@ -131,7 +130,7 @@ SHL1VERSIONMAP=exports.map DEF1NAME=$(SHL1TARGET) DEF1EXPORTFILE=exports.dxp - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/canvas/source/directx/dx_9rm.cxx b/canvas/source/directx/dx_9rm.cxx index 932a15e1f5c1..acef323ddc1b 100755 --- a/canvas/source/directx/dx_9rm.cxx +++ b/canvas/source/directx/dx_9rm.cxx @@ -956,11 +956,43 @@ namespace dxcanvas { if(hr != D3DERR_DEVICELOST) return false; - hr = mpDevice->Reset(&mad3dpp); - if(SUCCEEDED(hr)) - return true; - if(hr == D3DERR_DEVICELOST) - return true; + + // interestingly enough, sometimes the Reset() below + // *still* causes DeviceLost errors. So, cycle until + // DX was kind enough to really reset the device... + do + { + mpVertexBuffer.reset(); + hr = mpDevice->Reset(&mad3dpp); + if(SUCCEEDED(hr)) + { + IDirect3DVertexBuffer9 *pVB(NULL); + DWORD aFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1); + if( FAILED(mpDevice->CreateVertexBuffer(sizeof(dxvertex)*maNumVertices, + D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, + aFVF, + D3DPOOL_DEFAULT, + &pVB, + NULL)) ) + { + throw lang::NoSupportException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "Could not create DirectX device - out of memory!")),NULL); + } + mpVertexBuffer=COMReference<IDirect3DVertexBuffer9>(pVB); + + // retry after the restore + if(SUCCEEDED(mpSwapChain->Present(&aRect,&aRect,NULL,NULL,0))) + return true; + } + + TimeValue aTimeout; + aTimeout.Seconds=1; + aTimeout.Nanosec=0; + osl_waitThread(&aTimeout); + } + while(hr == D3DERR_DEVICELOST); + return false; } diff --git a/canvas/source/directx/dx_surfacegraphics.cxx b/canvas/source/directx/dx_surfacegraphics.cxx index 128095c1315d..8b9af6be6827 100755 --- a/canvas/source/directx/dx_surfacegraphics.cxx +++ b/canvas/source/directx/dx_surfacegraphics.cxx @@ -34,6 +34,8 @@ #include "dx_surfacegraphics.hxx" #include "dx_impltools.hxx" +using namespace ::com::sun::star; + namespace dxcanvas { namespace @@ -75,11 +77,12 @@ namespace dxcanvas tools::setupGraphics( *pGraphics ); pRet.reset(pGraphics, GraphicsDeleter(rSurface, aHDC)); + return pRet; } else rSurface->ReleaseDC( aHDC ); } - return pRet; + throw uno::RuntimeException(); } } diff --git a/canvas/source/directx/dx_textlayout_drawhelper.cxx b/canvas/source/directx/dx_textlayout_drawhelper.cxx index f44d8aa4a518..358bd1e9d74f 100755 --- a/canvas/source/directx/dx_textlayout_drawhelper.cxx +++ b/canvas/source/directx/dx_textlayout_drawhelper.cxx @@ -52,6 +52,7 @@ #include <canvas/debug.hxx> #include "dx_impltools.hxx" #include <vcl/sysdata.hxx> +#include <i18npool/mslangid.hxx> #include "dx_textlayout_drawhelper.hxx" #include "dx_bitmap.hxx" #include "dx_canvasfont.hxx" @@ -135,6 +136,8 @@ namespace dxcanvas aFont.SetWeight( static_cast<FontWeight>(rFontRequest.FontDescription.FontDescription.Weight) ); aFont.SetItalic( (rFontRequest.FontDescription.FontDescription.Letterform<=8) ? ITALIC_NONE : ITALIC_NORMAL ); + aFont.SetLanguage(MsLangId::convertLocaleToLanguage(rFontRequest.Locale)); + // setup font color aFont.SetColor( aColor ); aFont.SetFillColor( aColor ); diff --git a/canvas/source/directx/dx_winstuff.hxx b/canvas/source/directx/dx_winstuff.hxx index e5e7e4ffb4ae..1c64506c0f21 100755 --- a/canvas/source/directx/dx_winstuff.hxx +++ b/canvas/source/directx/dx_winstuff.hxx @@ -97,25 +97,18 @@ #undef DrawText -// Needed for #?$&/@ gdiplus header -#ifndef max -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#define __WORKAROUND_MAX_DEFINED__ -#endif - -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#define __WORKAROUND_MIN_DEFINED__ -#endif - +#ifdef __MINGW32__
+using ::std::max;
+using ::std::min;
+#endif
+
#include <gdiplus.h> -#ifdef __WORKAROUND_MAX_DEFINED__ -#undef max +#ifdef min +# undef min #endif - -#ifdef __WORKAROUND_MIN_DEFINED__ -#undef min +#ifdef max +# undef max #endif namespace dxcanvas diff --git a/canvas/source/directx/makefile.mk b/canvas/source/directx/makefile.mk index c1d210dfcf64..1a9db2ec51c0 100644 --- a/canvas/source/directx/makefile.mk +++ b/canvas/source/directx/makefile.mk @@ -96,7 +96,7 @@ GDIPLUS_SLOFILES = \ $(SLO)$/dx_canvas.obj GDIPLUS_SLOFILES += $(SHARED_SLOFILES) -STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) +STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) $(I18NISOLANGLIB) ######################################################## @@ -194,7 +194,7 @@ LIB3OBJFILES = $(GDIPLUS_SLOFILES) SHL3TARGET=$(TARGET3).uno # Links import libraries. -SHL3STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) +SHL3STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) $(I18NISOLANGLIB) # Specifies an import library to create. For Win32 only. SHL3IMPLIB=i$(TARGET3).lib diff --git a/canvas/source/factory/makefile.mk b/canvas/source/factory/makefile.mk index 3e9611412463..1051b953ae81 100644 --- a/canvas/source/factory/makefile.mk +++ b/canvas/source/factory/makefile.mk @@ -37,7 +37,7 @@ ENABLE_EXCEPTIONS = TRUE .INCLUDE : settings.mk DLLPRE = - +.IF "$(L10N_framework)"=="" SLOFILES = \ $(SLO)$/cf_service.obj @@ -55,6 +55,6 @@ SHL1LIBS = $(SLB)$/$(TARGET).lib SHL1DEF = $(MISC)$/$(SHL1TARGET).def DEF1NAME = $(SHL1TARGET) - +.ENDIF .INCLUDE : target.mk diff --git a/canvas/source/null/makefile.mk b/canvas/source/null/makefile.mk index 76e372c56fd7..99a6bbab93a4 100644 --- a/canvas/source/null/makefile.mk +++ b/canvas/source/null/makefile.mk @@ -45,7 +45,7 @@ DLLPRE = .IF "$(verbose)"!="" || "$(VERBOSE)"!="" CDEFS+= -DVERBOSE .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/null_canvasbitmap.obj \ $(SLO)$/null_canvascustomsprite.obj \ $(SLO)$/null_canvasfont.obj \ @@ -68,7 +68,7 @@ SHL1VERSIONMAP=exports.map DEF1NAME=$(SHL1TARGET) DEF1EXPORTFILE=exports.dxp - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/canvas/source/simplecanvas/makefile.mk b/canvas/source/simplecanvas/makefile.mk index 6417ddb0c650..c0a60250ab85 100644 --- a/canvas/source/simplecanvas/makefile.mk +++ b/canvas/source/simplecanvas/makefile.mk @@ -45,7 +45,7 @@ DLLPRE = .IF "$(verbose)"!="" || "$(VERBOSE)"!="" CDEFS+= -DVERBOSE .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/simplecanvasimpl.obj SHL1TARGET=$(TARGET).uno @@ -60,6 +60,7 @@ SHL1VERSIONMAP=exports.map DEF1NAME=$(SHL1TARGET) DEF1EXPORTFILE=exports.dxp +.ENDIF # ========================================================================== diff --git a/canvas/source/tools/makefile.mk b/canvas/source/tools/makefile.mk index bf99a00febfc..9dc9967fac82 100644 --- a/canvas/source/tools/makefile.mk +++ b/canvas/source/tools/makefile.mk @@ -51,7 +51,7 @@ CDEFS+= -DPROFILER #CFLAGS +:= /Ox /Ot # THIS IS IMPORTANT - +.IF "$(L10N_framework)"=="" SLOFILES = \ $(SLO)$/cachedprimitivebase.obj \ $(SLO)$/canvascustomspritehelper.obj \ @@ -95,7 +95,7 @@ DEFLIB1NAME =$(TARGET) .IF "$(GUI)" == "WNT" SHL1STDLIBS += $(WINMMLIB) $(KERNEL32LIB) .ENDIF - +.ENDIF # ========================================================================== diff --git a/canvas/source/vcl/canvasfont.cxx b/canvas/source/vcl/canvasfont.cxx index 9fb69875ecde..d5b276901594 100644 --- a/canvas/source/vcl/canvasfont.cxx +++ b/canvas/source/vcl/canvasfont.cxx @@ -35,7 +35,7 @@ #include <rtl/math.hxx> #include <basegfx/numeric/ftools.hxx> - +#include <i18npool/mslangid.hxx> #include <vcl/metric.hxx> #include "canvasfont.hxx" @@ -67,6 +67,8 @@ namespace vclcanvas maFont->SetWeight( static_cast<FontWeight>(rFontRequest.FontDescription.FontDescription.Weight) ); maFont->SetItalic( (rFontRequest.FontDescription.FontDescription.Letterform<=8) ? ITALIC_NONE : ITALIC_NORMAL ); + maFont->SetLanguage(MsLangId::convertLocaleToLanguage(rFontRequest.Locale)); + // adjust to stretched/shrinked font if( !::rtl::math::approxEqual( rFontMatrix.m00, rFontMatrix.m11) ) { @@ -125,8 +127,19 @@ namespace vclcanvas { tools::LocalGuard aGuard; - // TODO(F1) - return rendering::FontMetrics(); + OutputDevice& rOutDev = mpOutDevProvider->getOutDev(); + VirtualDevice aVDev( rOutDev ); + aVDev.SetFont(getVCLFont()); + const ::FontMetric& aMetric( aVDev.GetFontMetric() ); + + return rendering::FontMetrics( + aMetric.GetAscent(), + aMetric.GetDescent(), + aMetric.GetIntLeading(), + aMetric.GetExtLeading(), + 0, + aMetric.GetDescent() / 2.0, + aMetric.GetAscent() / 2.0); } uno::Sequence< double > SAL_CALL CanvasFont::getAvailableSizes( ) throw (uno::RuntimeException) diff --git a/canvas/source/vcl/makefile.mk b/canvas/source/vcl/makefile.mk index 781cd58d8b91..fdfdd62d16b8 100644 --- a/canvas/source/vcl/makefile.mk +++ b/canvas/source/vcl/makefile.mk @@ -73,7 +73,7 @@ SLOFILES = $(SLO)$/backbuffer.obj \ SHL1TARGET=$(TARGET).uno -SHL1STDLIBS= $(TOOLSLIB) $(TKLIB) $(CPPULIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(GOODIESLIB) +SHL1STDLIBS= $(TOOLSLIB) $(TKLIB) $(CPPULIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(GOODIESLIB) $(I18NISOLANGLIB) SHL1IMPLIB=i$(TARGET) SHL1LIBS=$(SLB)$/$(TARGET).lib diff --git a/canvas/source/vcl/textlayout.cxx b/canvas/source/vcl/textlayout.cxx index f9fa6f6dc4d2..5787f32cf4bf 100644 --- a/canvas/source/vcl/textlayout.cxx +++ b/canvas/source/vcl/textlayout.cxx @@ -35,6 +35,7 @@ #include <tools/diagnose_ex.h> #include <canvas/canvastools.hxx> +#include <com/sun/star/rendering/CompositeOperation.hpp> #include <com/sun/star/rendering/TextDirection.hpp> #include <vcl/metric.hxx> @@ -42,6 +43,7 @@ #include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/numeric/ftools.hxx> +#include <basegfx/tools/canvastools.hxx> #include "impltools.hxx" #include "textlayout.hxx" @@ -116,16 +118,104 @@ namespace vclcanvas { tools::LocalGuard aGuard; - // TODO(F1) - return uno::Sequence< uno::Reference< rendering::XPolyPolygon2D > >(); + OutputDevice& rOutDev = mpOutDevProvider->getOutDev(); + VirtualDevice aVDev( rOutDev ); + aVDev.SetFont( mpFont->getVCLFont() ); + + setupLayoutMode( aVDev, mnTextDirection ); + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + NULL); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,0,0,1,0), + NULL, + uno::Sequence<double>(4), + rendering::CompositeOperation::SOURCE); + + ::boost::scoped_array< sal_Int32 > aOffsets(new sal_Int32[maLogicalAdvancements.getLength()]); + setupTextOffsets(aOffsets.get(), maLogicalAdvancements, aViewState, aRenderState); + + uno::Sequence< uno::Reference< rendering::XPolyPolygon2D> > aOutlineSequence; + ::basegfx::B2DPolyPolygonVector aOutlines; + if (aVDev.GetTextOutlines( + aOutlines, + maText.Text, + ::canvas::tools::numeric_cast<USHORT>(maText.StartPosition), + ::canvas::tools::numeric_cast<USHORT>(maText.StartPosition), + ::canvas::tools::numeric_cast<USHORT>(maText.Length), + FALSE, + 0, + aOffsets.get())) + { + aOutlineSequence.realloc(aOutlines.size()); + sal_Int32 nIndex (0); + for (::basegfx::B2DPolyPolygonVector::const_iterator + iOutline(aOutlines.begin()), + iEnd(aOutlines.end()); + iOutline!=iEnd; + ++iOutline) + { + aOutlineSequence[nIndex++] = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( + mxDevice, + *iOutline); + } + } + + return aOutlineSequence; } uno::Sequence< geometry::RealRectangle2D > SAL_CALL TextLayout::queryInkMeasures( ) throw (uno::RuntimeException) { tools::LocalGuard aGuard; - // TODO(F1) - return uno::Sequence< geometry::RealRectangle2D >(); + + OutputDevice& rOutDev = mpOutDevProvider->getOutDev(); + VirtualDevice aVDev( rOutDev ); + aVDev.SetFont( mpFont->getVCLFont() ); + + setupLayoutMode( aVDev, mnTextDirection ); + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + NULL); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,0,0,1,0), + NULL, + uno::Sequence<double>(4), + rendering::CompositeOperation::SOURCE); + + ::boost::scoped_array< sal_Int32 > aOffsets(new sal_Int32[maLogicalAdvancements.getLength()]); + setupTextOffsets(aOffsets.get(), maLogicalAdvancements, aViewState, aRenderState); + + MetricVector aMetricVector; + uno::Sequence<geometry::RealRectangle2D> aBoundingBoxes; + if (aVDev.GetGlyphBoundRects( + Point(0,0), + maText.Text, + ::canvas::tools::numeric_cast<USHORT>(maText.StartPosition), + ::canvas::tools::numeric_cast<USHORT>(maText.Length), + ::canvas::tools::numeric_cast<USHORT>(maText.StartPosition), + aMetricVector)) + { + aBoundingBoxes.realloc(aMetricVector.size()); + sal_Int32 nIndex (0); + for (MetricVector::const_iterator + iMetric(aMetricVector.begin()), + iEnd(aMetricVector.end()); + iMetric!=iEnd; + ++iMetric) + { + aBoundingBoxes[nIndex++] = geometry::RealRectangle2D( + iMetric->getX(), + iMetric->getY(), + iMetric->getX() + iMetric->getWidth(), + iMetric->getY() + iMetric->getHeight()); + } + } + return aBoundingBoxes; } uno::Sequence< geometry::RealRectangle2D > SAL_CALL TextLayout::queryMeasures( ) throw (uno::RuntimeException) @@ -171,7 +261,7 @@ namespace vclcanvas setupLayoutMode( aVDev, mnTextDirection ); - const sal_Int32 nAboveBaseline( -aMetric.GetIntLeading() - aMetric.GetAscent() ); + const sal_Int32 nAboveBaseline( /*-aMetric.GetIntLeading()*/ - aMetric.GetAscent() ); const sal_Int32 nBelowBaseline( aMetric.GetDescent() ); if( maLogicalAdvancements.getLength() ) |