INTEGRATION: CWS aquavcl08 (1.71.32); FILE MERGED
2008/06/26 07:12:48 hdu 1.71.32.10: #i90879# fix opened/closed polygon path creation 2008/06/25 17:50:39 pl 1.71.32.9: check for NULL ptr 2008/06/25 17:19:31 pl 1.71.32.8: #i91012# one small error by pl, one big disaster for whole office 2008/06/25 15:37:06 pl 1.71.32.7: mpFrame is set on vdevs also 2008/06/19 12:14:59 hdu 1.71.32.6: #i90879# polylines should stay open 2008/06/19 09:48:34 pl 1.71.32.5: join aquabmpfix03 2008/06/05 12:36:53 pl 1.71.32.4: join aquabmpfix02 2008/06/03 13:58:30 hdu 1.71.32.3: #i90273# fix vertical writing 2008/06/02 09:05:49 pl 1.71.32.2: RESYNC: (1.71-1.73); FILE MERGED 2008/05/19 13:04:16 hdu 1.71.32.1: #i89545# Aqua: fix font descent and extleading calculation
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
* OpenOffice.org - a multi-platform office productivity suite
|
* OpenOffice.org - a multi-platform office productivity suite
|
||||||
*
|
*
|
||||||
* $RCSfile: salgdi.cxx,v $
|
* $RCSfile: salgdi.cxx,v $
|
||||||
* $Revision: 1.76 $
|
* $Revision: 1.77 $
|
||||||
*
|
*
|
||||||
* This file is part of OpenOffice.org.
|
* This file is part of OpenOffice.org.
|
||||||
*
|
*
|
||||||
@@ -361,7 +361,11 @@ void AquaSalGraphics::initResolution( NSWindow* pWin )
|
|||||||
if( pWin )
|
if( pWin )
|
||||||
pScreen = [pWin screen];
|
pScreen = [pWin screen];
|
||||||
if( pScreen == nil )
|
if( pScreen == nil )
|
||||||
pScreen = [NSScreen mainScreen];
|
{
|
||||||
|
NSArray* pScreens = [NSScreen screens];
|
||||||
|
if( pScreens )
|
||||||
|
pScreen = [pScreens objectAtIndex: 0];
|
||||||
|
}
|
||||||
|
|
||||||
mnRealDPIX = mnRealDPIY = 96;
|
mnRealDPIX = mnRealDPIY = 96;
|
||||||
if( pScreen )
|
if( pScreen )
|
||||||
@@ -441,7 +445,7 @@ USHORT AquaSalGraphics::GetBitCount()
|
|||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
static void AddPolygonToPath( CGMutablePathRef xPath,
|
static void AddPolygonToPath( CGMutablePathRef xPath,
|
||||||
const ::basegfx::B2DPolygon& rPolygon, bool bPixelSnap )
|
const ::basegfx::B2DPolygon& rPolygon, bool bClosePath, bool bPixelSnap )
|
||||||
{
|
{
|
||||||
// short circuit if there is nothing to do
|
// short circuit if there is nothing to do
|
||||||
const int nPointCount = rPolygon.count();
|
const int nPointCount = rPolygon.count();
|
||||||
@@ -453,9 +457,17 @@ static void AddPolygonToPath( CGMutablePathRef xPath,
|
|||||||
|
|
||||||
const bool bHasCurves = rPolygon.areControlPointsUsed();
|
const bool bHasCurves = rPolygon.areControlPointsUsed();
|
||||||
bool bPendingCurve = false;
|
bool bPendingCurve = false;
|
||||||
for( int nPointIdx = 0, nPrevIdx = 0; nPointIdx <= nPointCount; nPrevIdx = nPointIdx++ )
|
for( int nPointIdx = 0, nPrevIdx = 0;; nPrevIdx = nPointIdx++ )
|
||||||
{
|
{
|
||||||
const int nClosedIdx = (nPointIdx < nPointCount) ? nPointIdx : 0;
|
int nClosedIdx = nPointIdx;
|
||||||
|
if( nPointIdx >= nPointCount )
|
||||||
|
{
|
||||||
|
// prepare to close last curve segment if needed
|
||||||
|
if( bClosePath && (nPointIdx == nPointCount) )
|
||||||
|
nClosedIdx = 0;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
const ::basegfx::B2DPoint& rPoint = rPolygon.getB2DPoint( nClosedIdx );
|
const ::basegfx::B2DPoint& rPoint = rPolygon.getB2DPoint( nClosedIdx );
|
||||||
if( !nPointIdx ) // first point
|
if( !nPointIdx ) // first point
|
||||||
{
|
{
|
||||||
@@ -477,7 +489,8 @@ static void AddPolygonToPath( CGMutablePathRef xPath,
|
|||||||
bPendingCurve = rPolygon.isNextControlPointUsed( nClosedIdx );
|
bPendingCurve = rPolygon.isNextControlPointUsed( nClosedIdx );
|
||||||
}
|
}
|
||||||
|
|
||||||
CGPathCloseSubpath( xPath );
|
if( bClosePath )
|
||||||
|
CGPathCloseSubpath( xPath );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddPolyPolygonToPath( CGMutablePathRef xPath,
|
static void AddPolyPolygonToPath( CGMutablePathRef xPath,
|
||||||
@@ -491,7 +504,7 @@ static void AddPolyPolygonToPath( CGMutablePathRef xPath,
|
|||||||
for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx )
|
for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx )
|
||||||
{
|
{
|
||||||
const ::basegfx::B2DPolygon rPolygon = rPolyPoly.getB2DPolygon( nPolyIdx );
|
const ::basegfx::B2DPolygon rPolygon = rPolyPoly.getB2DPolygon( nPolyIdx );
|
||||||
AddPolygonToPath( xPath, rPolygon, bPixelSnap );
|
AddPolygonToPath( xPath, rPolygon, true, bPixelSnap );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -897,7 +910,7 @@ bool AquaSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPol
|
|||||||
for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx )
|
for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx )
|
||||||
{
|
{
|
||||||
const ::basegfx::B2DPolygon rPolygon = rPolyPoly.getB2DPolygon( nPolyIdx );
|
const ::basegfx::B2DPolygon rPolygon = rPolyPoly.getB2DPolygon( nPolyIdx );
|
||||||
AddPolygonToPath( xPath, rPolygon, false );
|
AddPolygonToPath( xPath, rPolygon, true, false );
|
||||||
}
|
}
|
||||||
CGContextSaveGState( mrContext );
|
CGContextSaveGState( mrContext );
|
||||||
CGContextBeginPath( mrContext );
|
CGContextBeginPath( mrContext );
|
||||||
@@ -928,7 +941,7 @@ bool AquaSalGraphics::drawPolyLine( const ::basegfx::B2DPolygon& rPolyLine,
|
|||||||
|
|
||||||
// setup poly-polygon path
|
// setup poly-polygon path
|
||||||
CGMutablePathRef xPath = CGPathCreateMutable();
|
CGMutablePathRef xPath = CGPathCreateMutable();
|
||||||
AddPolygonToPath( xPath, rPolyLine, false );
|
AddPolygonToPath( xPath, rPolyLine, false, false );
|
||||||
CGContextSaveGState( mrContext );
|
CGContextSaveGState( mrContext );
|
||||||
CGContextAddPath( mrContext, xPath );
|
CGContextAddPath( mrContext, xPath );
|
||||||
const CGRect aRefreshRect = CGPathGetBoundingBox( xPath );
|
const CGRect aRefreshRect = CGPathGetBoundingBox( xPath );
|
||||||
@@ -987,7 +1000,7 @@ void AquaSalGraphics::copyBits( const SalTwoRect *pPosAry, SalGraphics *pSrcGrap
|
|||||||
|
|
||||||
// accelerate trivial operations
|
// accelerate trivial operations
|
||||||
/*const*/ AquaSalGraphics* pSrc = static_cast<AquaSalGraphics*>(pSrcGraphics);
|
/*const*/ AquaSalGraphics* pSrc = static_cast<AquaSalGraphics*>(pSrcGraphics);
|
||||||
const bool bSameGraphics = (this == pSrc) || (mpFrame && (mpFrame == pSrc->mpFrame));
|
const bool bSameGraphics = (this == pSrc) || (mbWindow && mpFrame && pSrc->mbWindow && (mpFrame == pSrc->mpFrame));
|
||||||
if( bSameGraphics
|
if( bSameGraphics
|
||||||
&& (pPosAry->mnSrcWidth == pPosAry->mnDestWidth)
|
&& (pPosAry->mnSrcWidth == pPosAry->mnDestWidth)
|
||||||
&& (pPosAry->mnSrcHeight == pPosAry->mnDestHeight))
|
&& (pPosAry->mnSrcHeight == pPosAry->mnDestHeight))
|
||||||
@@ -1393,32 +1406,15 @@ void AquaSalGraphics::GetFontMetric( ImplFontMetricData* pMetric )
|
|||||||
// please see the comment in AquaSalGraphics::SetFont() for details
|
// please see the comment in AquaSalGraphics::SetFont() for details
|
||||||
const double fPixelSize = (mfFontScale * mfFakeDPIScale * fPointSize);
|
const double fPixelSize = (mfFontScale * mfFakeDPIScale * fPointSize);
|
||||||
pMetric->mnAscent = static_cast<long>(+aMetrics.ascent * fPixelSize + 0.5);
|
pMetric->mnAscent = static_cast<long>(+aMetrics.ascent * fPixelSize + 0.5);
|
||||||
pMetric->mnDescent = static_cast<long>((-aMetrics.descent + aMetrics.leading) * fPixelSize + 0.5);
|
pMetric->mnDescent = static_cast<long>(-aMetrics.descent * fPixelSize + 0.5);
|
||||||
|
const long nExtDescent = static_cast<long>((-aMetrics.descent + aMetrics.leading) * fPixelSize + 0.5);
|
||||||
|
pMetric->mnExtLeading = nExtDescent - pMetric->mnDescent;
|
||||||
pMetric->mnIntLeading = 0;
|
pMetric->mnIntLeading = 0;
|
||||||
pMetric->mnExtLeading = 0;
|
|
||||||
// ATSFontMetrics.avgAdvanceWidth is obsolete, so it is usually set to zero
|
// ATSFontMetrics.avgAdvanceWidth is obsolete, so it is usually set to zero
|
||||||
// since ImplFontMetricData::mnWidth is only used for stretching/squeezing fonts
|
// since ImplFontMetricData::mnWidth is only used for stretching/squeezing fonts
|
||||||
// setting this width to the pixel height of the fontsize is good enough
|
// setting this width to the pixel height of the fontsize is good enough
|
||||||
// it also makes the calculation of the stretch factor simple
|
// it also makes the calculation of the stretch factor simple
|
||||||
pMetric->mnWidth = static_cast<long>(mfFontStretch * fPixelSize + 0.5);
|
pMetric->mnWidth = static_cast<long>(mfFontStretch * fPixelSize + 0.5);
|
||||||
|
|
||||||
// apply the "CJK needs extra leading" heuristic if needed
|
|
||||||
#if 0 // #i85422# on MacOSX the CJK fonts have good metrics even without the heuristics below
|
|
||||||
if( mpMacFontData->HasCJKSupport() )
|
|
||||||
{
|
|
||||||
pMetric->mnIntLeading += pMetric->mnExtLeading;
|
|
||||||
|
|
||||||
const long nHalfTmpExtLeading = pMetric->mnExtLeading / 2;
|
|
||||||
const long nOtherHalfTmpExtLeading = pMetric->mnExtLeading - nHalfTmpExtLeading;
|
|
||||||
|
|
||||||
long nCJKExtLeading = static_cast<long>(0.30 * (pMetric->mnAscent + pMetric->mnDescent));
|
|
||||||
nCJKExtLeading -= pMetric->mnExtLeading;
|
|
||||||
pMetric->mnExtLeading = (nCJKExtLeading > 0) ? nCJKExtLeading : 0;
|
|
||||||
|
|
||||||
pMetric->mnAscent += nHalfTmpExtLeading;
|
|
||||||
pMetric->mnDescent += nOtherHalfTmpExtLeading;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
@@ -1689,10 +1685,16 @@ USHORT AquaSalGraphics::SetFont( ImplFontSelectData* pReqFont, int nFallbackLeve
|
|||||||
if( pReqFont->mbNonAntialiased )
|
if( pReqFont->mbNonAntialiased )
|
||||||
nStyleRenderingOptions |= kATSStyleNoAntiAliasing;
|
nStyleRenderingOptions |= kATSStyleNoAntiAliasing;
|
||||||
|
|
||||||
|
// set horizontal/vertical mode
|
||||||
|
ATSUVerticalCharacterType aVerticalCharacterType = kATSUStronglyHorizontal;
|
||||||
|
if( pReqFont->mbVertical )
|
||||||
|
aVerticalCharacterType = kATSUStronglyVertical;
|
||||||
|
|
||||||
// prepare ATS-fontid as type matching to the kATSUFontTag request
|
// prepare ATS-fontid as type matching to the kATSUFontTag request
|
||||||
ATSUFontID nFontID = static_cast<ATSUFontID>(pMacFont->GetFontId());
|
ATSUFontID nFontID = static_cast<ATSUFontID>(pMacFont->GetFontId());
|
||||||
|
|
||||||
// update ATSU style attributes with requested font parameters
|
// update ATSU style attributes with requested font parameters
|
||||||
|
// TODO: no need to set styles which are already defaulted
|
||||||
|
|
||||||
const ATSUAttributeTag aTag[] =
|
const ATSUAttributeTag aTag[] =
|
||||||
{
|
{
|
||||||
@@ -1700,7 +1702,8 @@ USHORT AquaSalGraphics::SetFont( ImplFontSelectData* pReqFont, int nFallbackLeve
|
|||||||
kATSUSizeTag,
|
kATSUSizeTag,
|
||||||
kATSUQDBoldfaceTag,
|
kATSUQDBoldfaceTag,
|
||||||
kATSUQDItalicTag,
|
kATSUQDItalicTag,
|
||||||
kATSUStyleRenderingOptionsTag
|
kATSUStyleRenderingOptionsTag,
|
||||||
|
kATSUVerticalCharacterTag
|
||||||
};
|
};
|
||||||
|
|
||||||
const ByteCount aValueSize[] =
|
const ByteCount aValueSize[] =
|
||||||
@@ -1709,7 +1712,8 @@ USHORT AquaSalGraphics::SetFont( ImplFontSelectData* pReqFont, int nFallbackLeve
|
|||||||
sizeof(fFixedSize),
|
sizeof(fFixedSize),
|
||||||
sizeof(bFakeBold),
|
sizeof(bFakeBold),
|
||||||
sizeof(bFakeItalic),
|
sizeof(bFakeItalic),
|
||||||
sizeof(nStyleRenderingOptions)
|
sizeof(nStyleRenderingOptions),
|
||||||
|
sizeof(aVerticalCharacterType)
|
||||||
};
|
};
|
||||||
|
|
||||||
const ATSUAttributeValuePtr aValue[] =
|
const ATSUAttributeValuePtr aValue[] =
|
||||||
@@ -1718,11 +1722,12 @@ USHORT AquaSalGraphics::SetFont( ImplFontSelectData* pReqFont, int nFallbackLeve
|
|||||||
&fFixedSize,
|
&fFixedSize,
|
||||||
&bFakeBold,
|
&bFakeBold,
|
||||||
&bFakeItalic,
|
&bFakeItalic,
|
||||||
&nStyleRenderingOptions
|
&nStyleRenderingOptions,
|
||||||
|
&aVerticalCharacterType
|
||||||
};
|
};
|
||||||
|
|
||||||
OSStatus eStatus = ATSUSetAttributes( maATSUStyle,
|
static const int nTagCount = sizeof(aTag) / sizeof(*aTag);
|
||||||
sizeof(aTag) / sizeof(ATSUAttributeTag),
|
OSStatus eStatus = ATSUSetAttributes( maATSUStyle, nTagCount,
|
||||||
aTag, aValueSize, aValue );
|
aTag, aValueSize, aValue );
|
||||||
DBG_ASSERT( (eStatus==noErr), "AquaSalGraphics::SetFont() : Could not set font attributes!\n");
|
DBG_ASSERT( (eStatus==noErr), "AquaSalGraphics::SetFont() : Could not set font attributes!\n");
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user