ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m | 26 + vcl/quartz/salgdicommon.cxx | 147 +++++++++- vcl/quartz/salvd.cxx | 15 - 3 files changed, 184 insertions(+), 4 deletions(-)
New commits: commit 801a8cd336426327724b0157141a00c8d2a9ae96 Author: Tor Lillqvist <[email protected]> Date: Mon Apr 7 17:48:22 2014 +0300 Add somewhat ridiculous debug hacks for CoreGrahics drawing debugging on iOS When the environment variable DRAW_INCREMENTALLY_FROM is set to a number, we want TiledLibreOffice to loop, initially performing only that number of drawing operations in AquaSalGraphics, then wait for some seconds, and redraw. Next time perform one operation more. Repeat. Implemented in vcl by surrounding the entry and exit(s) of the drawing functions in AquaSalGraphics with macros. All this is active only for iOS and in a dbgutil build. diff --git a/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m index 80680dd..aafbd43 100644 --- a/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m +++ b/ios/experimental/TiledLibreOffice/TiledLibreOffice/TiledView.m @@ -82,6 +82,20 @@ static void updateTilesPerSecond(UILabel *label) } } +static int DBG_DRAW_DELAY = 10; +int DBG_DRAW_ROUNDS = -1; +int DBG_DRAW_COUNTER = 0; +int DBG_DRAW_ROUNDS_MAX = INT_MAX; + +- (void)redraw +{ + DBG_DRAW_ROUNDS++; + DBG_DRAW_COUNTER = 0; + [self setNeedsDisplay]; + if (DBG_DRAW_ROUNDS < DBG_DRAW_ROUNDS_MAX) + [NSTimer scheduledTimerWithTimeInterval:DBG_DRAW_DELAY target:self selector:@selector(redraw) userInfo:nil repeats:NO]; +} + - (id)initWithFrame:(CGRect)frame scale:(CGFloat)scale maxZoom:(int)maxZoom { self = [super initWithFrame:frame]; @@ -93,6 +107,13 @@ static void updateTilesPerSecond(UILabel *label) catl.levelsOfDetailBias = catl.levelsOfDetail - 1; [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTilesPerSecond) userInfo:nil repeats:YES]; + if (getenv("DRAW_INCREMENTALLY_FROM")) { + DBG_DRAW_ROUNDS = atoi(getenv("DRAW_INCREMENTALLY_FROM")); + if (getenv("DRAW_INCREMENTALLY_DELAY") && + atoi(getenv("DRAW_INCREMENTALLY_DELAY")) > 1) + DBG_DRAW_DELAY = atoi(getenv("DRAW_INCREMENTALLY_DELAY")); + [NSTimer scheduledTimerWithTimeInterval:DBG_DRAW_DELAY target:self selector:@selector(redraw) userInfo:nil repeats:NO]; + } } return self; } @@ -138,12 +159,13 @@ static bool tileMatches(const char *spec, CGRect bb) // as needed at the current zoom levels. I keep thinking about // "pixels" incorrectly. - if (!getenv("DRAW_ONLY_TILE") || tileMatches(getenv("DRAW_ONLY_TILE"), bb)) + if (!getenv("DRAW_ONLY_TILE") || tileMatches(getenv("DRAW_ONLY_TILE"), bb)) { + fprintf(stderr, "+++ rendering to context %p\n", ctx); touch_lo_draw_tile(ctx, tileSize.width, tileSize.height, CGPointMake(bb.origin.x/self.scale, bb.origin.y/self.scale), CGSizeMake(bb.size.width/self.scale, bb.size.height/self.scale)); - else { + } else { CGContextSetRGBFillColor(ctx, 1, 1, 1, 1); CGContextFillRect(ctx, CGRectMake(0, 0, bb.size.width, bb.size.height)); } diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx index 873f188..8591b63 100644 --- a/vcl/quartz/salgdicommon.cxx +++ b/vcl/quartz/salgdicommon.cxx @@ -40,6 +40,33 @@ #include <basegfx/range/b2ibox.hxx> #endif +#if defined(IOS) && defined(DBG_UTIL) + +// Variables in TiledView.m +extern int DBG_DRAW_ROUNDS, DBG_DRAW_COUNTER, DBG_DRAW_DEPTH; + +#define DBG_DRAW_OPERATION(s,v) \ + do { \ + if (DBG_DRAW_ROUNDS >= 0) { \ + if (DBG_DRAW_COUNTER++ > DBG_DRAW_ROUNDS) \ + return v; \ + SAL_DEBUG("===> " << s << " " << DBG_DRAW_COUNTER); \ + } \ + } while (false) + +#define DBG_DRAW_OPERATION_EXIT(s) \ + do { \ + if (DBG_DRAW_ROUNDS >= 0) \ + SAL_DEBUG("<=== " << s << " " << DBG_DRAW_COUNTER); \ + } while (false) + +#else + +#define DBG_DRAW_OPERATION(s) /* empty */ +#define DBG_DRAW_OPERATION_EXIT(s) /* empty */ + +#endif + using namespace vcl; typedef std::vector<unsigned char> ByteVector; @@ -539,15 +566,20 @@ bool AquaSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, const SalBitmap& rSrcBitmap, const SalBitmap& rAlphaBmp ) { + DBG_DRAW_OPERATION("drawAlphaBitmap", true); + // An image mask can't have a depth > 8 bits (should be 1 to 8 bits) if( rAlphaBmp.GetBitCount() > 8 ) { + DBG_DRAW_OPERATION_EXIT("drawAlphaBitmap"); return false; } + // are these two tests really necessary? (see vcl/unx/source/gdi/salgdi2.cxx) // horizontal/vertical mirroring not implemented yet if( rTR.mnDestWidth < 0 || rTR.mnDestHeight < 0 ) { + DBG_DRAW_OPERATION_EXIT("drawAlphaBitmap"); return false; } @@ -558,8 +590,10 @@ bool AquaSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, rTR.mnSrcHeight ); if( !xMaskedImage ) { + DBG_DRAW_OPERATION_EXIT("drawAlphaBitmap"); return false; } + if ( CheckContext() ) { const CGRect aDstRect = CGRectMake( rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight); @@ -570,6 +604,8 @@ bool AquaSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, CG_TRACE("CGImageRelease(" << xMaskedImage << ")"); CGImageRelease(xMaskedImage); + + DBG_DRAW_OPERATION_EXIT("drawAlphaBitmap"); return true; } @@ -577,8 +613,13 @@ bool AquaSalGraphics::drawTransformedBitmap( const basegfx::B2DPoint& rNull, const basegfx::B2DPoint& rX, const basegfx::B2DPoint& rY, const SalBitmap& rSrcBitmap, const SalBitmap* pAlphaBmp ) { + DBG_DRAW_OPERATION("drawTransformedBitmap", true); + if( !CheckContext() ) + { + DBG_DRAW_OPERATION_EXIT("drawTransformedBitmap"); return true; + } // get the Quartz image CGImageRef xImage = NULL; @@ -590,7 +631,10 @@ bool AquaSalGraphics::drawTransformedBitmap( else xImage = rSrcSalBmp.CreateWithMask( *pMaskSalBmp, 0, 0, (int)aSize.Width(), (int)aSize.Height() ); if( !xImage ) + { + DBG_DRAW_OPERATION_EXIT("drawTransformedBitmap"); return false; + } // setup the image transformation // using the rNull,rX,rY points as destinations for the (0,0),(0,Width),(Height,0) source points @@ -618,16 +662,22 @@ bool AquaSalGraphics::drawTransformedBitmap( // mark the destination as painted const CGRect aDstRect = CGRectApplyAffineTransform( aSrcRect, aCGMat ); RefreshRect( aDstRect ); + + DBG_DRAW_OPERATION_EXIT("drawTransformedBitmap"); return true; } bool AquaSalGraphics::drawAlphaRect( long nX, long nY, long nWidth, long nHeight, sal_uInt8 nTransparency ) { + DBG_DRAW_OPERATION("drawAlphaRect", true); + if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawAlphaRect"); return true; } + // save the current state CG_TRACE( "CGContextSaveGState(" << mrContext << ") " << ++mnContextStackDepth ); CGContextSaveGState( mrContext ); @@ -652,20 +702,27 @@ bool AquaSalGraphics::drawAlphaRect( long nX, long nY, long nWidth, CG_TRACE("CGContextRestoreGState(" << mrContext << ") " << mnContextStackDepth--); CGContextRestoreGState(mrContext); RefreshRect( aRect ); + + DBG_DRAW_OPERATION_EXIT("drawAlphaRect"); return true; } void AquaSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap ) { + DBG_DRAW_OPERATION("drawBitmap",); + if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawBitmap"); return; } + const QuartzSalBitmap& rBitmap = static_cast<const QuartzSalBitmap&>(rSalBitmap); CGImageRef xImage = rBitmap.CreateCroppedImage( (int)rPosAry.mnSrcX, (int)rPosAry.mnSrcY, (int)rPosAry.mnSrcWidth, (int)rPosAry.mnSrcHeight ); if( !xImage ) { + DBG_DRAW_OPERATION_EXIT("drawBitmap"); return; } @@ -675,6 +732,8 @@ void AquaSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rS CG_TRACE( "CGImageRelease(" << xImage << ")" ); CGImageRelease( xImage ); RefreshRect( aDstRect ); + + DBG_DRAW_OPERATION_EXIT("drawBitmap"); } void AquaSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap,SalColor ) @@ -686,16 +745,21 @@ void AquaSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rS void AquaSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap, const SalBitmap& rTransparentBitmap ) { + DBG_DRAW_OPERATION("drawBitmap",); + if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawBitmap"); return; } + const QuartzSalBitmap& rBitmap = static_cast<const QuartzSalBitmap&>(rSalBitmap); const QuartzSalBitmap& rMask = static_cast<const QuartzSalBitmap&>(rTransparentBitmap); CGImageRef xMaskedImage( rBitmap.CreateWithMask( rMask, rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight ) ); if( !xMaskedImage ) { + DBG_DRAW_OPERATION_EXIT("drawBitmap"); return; } @@ -705,6 +769,8 @@ void AquaSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rS CG_TRACE( "CGImageRelease(" << xMaskedImage << ")" ); CGImageRelease( xMaskedImage ); RefreshRect( aDstRect ); + + DBG_DRAW_OPERATION_EXIT("drawBitmap"); } #ifndef IOS @@ -761,17 +827,23 @@ bool AquaSalGraphics::drawEPS( long nX, long nY, long nWidth, long nHeight, void AquaSalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 ) { + DBG_DRAW_OPERATION("drawLine",); + if( nX1 == nX2 && nY1 == nY2 ) { // #i109453# platform independent code expects at least one pixel to be drawn drawPixel( nX1, nY1 ); + + DBG_DRAW_OPERATION_EXIT("drawLine"); return; } if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawLine"); return; } + CG_TRACE( "CGContextBeginPath(" << mrContext << ")" ); CGContextBeginPath( mrContext ); CG_TRACE( "CGContextMoveToPoint(" << mrContext << "," << static_cast<float>(nX1)+0.5 << "," << static_cast<float>(nY1)+0.5 << ")" ); @@ -784,20 +856,27 @@ void AquaSalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 ) Rectangle aRefreshRect( nX1, nY1, nX2, nY2 ); (void) aRefreshRect; // Is a call to RefreshRect( aRefreshRect ) missing here? + + DBG_DRAW_OPERATION_EXIT("drawLine"); } void AquaSalGraphics::drawMask( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap, SalColor nMaskColor ) { + DBG_DRAW_OPERATION("drawMask",); + if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawMask"); return; } + const QuartzSalBitmap& rBitmap = static_cast<const QuartzSalBitmap&>(rSalBitmap); CGImageRef xImage = rBitmap.CreateColorMask( rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight, nMaskColor ); if( !xImage ) { + DBG_DRAW_OPERATION_EXIT("drawMask"); return; } @@ -807,6 +886,8 @@ void AquaSalGraphics::drawMask( const SalTwoRect& rPosAry, const SalBitmap& rSal CG_TRACE( "CGImageRelease(" << xImage << ")" ); CGImageRelease( xImage ); RefreshRect( aDstRect ); + + DBG_DRAW_OPERATION_EXIT("drawMask"); } void AquaSalGraphics::drawPixel( long nX, long nY ) @@ -828,31 +909,41 @@ bool AquaSalGraphics::drawPolyLine( basegfx::B2DLineJoin eLineJoin, com::sun::star::drawing::LineCap eLineCap) { + DBG_DRAW_OPERATION("drawPolyLine", true); + // short circuit if there is nothing to do const int nPointCount = rPolyLine.count(); if( nPointCount <= 0 ) { + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); return true; } + // reject requests that cannot be handled yet if( rLineWidths.getX() != rLineWidths.getY() ) { + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); return false; } + #ifdef IOS if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); return false; } #endif + // #i101491# Aqua does not support B2DLINEJOIN_NONE; return false to use // the fallback (own geometry preparation) // #i104886# linejoin-mode and thus the above only applies to "fat" lines if( (basegfx::B2DLINEJOIN_NONE == eLineJoin) && (rLineWidths.getX() > 1.3) ) { + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); return false; } + // setup line attributes CGLineJoin aCGLineJoin = kCGLineJoinMiter; switch( eLineJoin ) @@ -922,6 +1013,7 @@ bool AquaSalGraphics::drawPolyLine( CG_TRACE( "CGPathRelease(" << xPath << ")" ); CGPathRelease( xPath ); + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); return true; } @@ -933,17 +1025,23 @@ bool AquaSalGraphics::drawPolyLineBezier( sal_uInt32, const SalPoint*, const sal bool AquaSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPoly, double fTransparency ) { + DBG_DRAW_OPERATION("drawPolyPolygon", true); + // short circuit if there is nothing to do const int nPolyCount = rPolyPoly.count(); if( nPolyCount <= 0 ) { + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); return true; } + // ignore invisible polygons if( (fTransparency >= 1.0) || (fTransparency < 0) ) { + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); return true; } + // setup poly-polygon path CGMutablePathRef xPath = CGPathCreateMutable(); CG_TRACE( "CGPathCreateMutable() = " << xPath ); @@ -954,6 +1052,7 @@ bool AquaSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPol } const CGRect aRefreshRect = CGPathGetBoundingBox( xPath ); + CG_TRACE( "CGPathGetBoundingBox(" << xPath << ") = " << aRefreshRect ); // #i97317# workaround for Quartz having problems with drawing small polygons if( ! ((aRefreshRect.size.width <= 0.125) && (aRefreshRect.size.height <= 0.125)) ) { @@ -976,6 +1075,7 @@ bool AquaSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPol SAL_WARN( "vcl.quartz", "Neither pen nor brush visible" ); CG_TRACE( "CGPathRelease(" << xPath << ")" ); CGPathRelease( xPath ); + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); return true; } @@ -1003,15 +1103,25 @@ bool AquaSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPol CG_TRACE( "CGPathRelease(" << xPath << ")" ); CGPathRelease( xPath ); + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); return true; } void AquaSalGraphics::drawPolyPolygon( sal_uInt32 nPolyCount, const sal_uInt32 *pPoints, PCONSTSALPOINT *ppPtAry ) { + DBG_DRAW_OPERATION("drawPolyPolygon",); + if( nPolyCount <= 0 ) + { + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); return; + } + if( !CheckContext() ) + { + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); return; + } // find bound rect long leftX = 0, topY = 0, maxWidth = 0, maxHeight = 0; @@ -1056,8 +1166,11 @@ void AquaSalGraphics::drawPolyPolygon( sal_uInt32 nPolyCount, const sal_uInt32 * } else { + SAL_WARN( "vcl.quartz", "Neither pen nor brush visible" ); + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); return; } + // convert to CGPath CG_TRACE( "CGContextBeginPath(" << mrContext << ")" ); CGContextBeginPath( mrContext ); @@ -1117,14 +1230,25 @@ void AquaSalGraphics::drawPolyPolygon( sal_uInt32 nPolyCount, const sal_uInt32 * CGContextDrawPath( mrContext, eMode ); RefreshRect( leftX, topY, maxWidth, maxHeight ); + + DBG_DRAW_OPERATION_EXIT("drawPolyPolygon"); } void AquaSalGraphics::drawPolygon( sal_uInt32 nPoints, const SalPoint *pPtAry ) { + DBG_DRAW_OPERATION("drawPolygon",); + if( nPoints <= 1 ) + { + DBG_DRAW_OPERATION_EXIT("drawPolygon"); return; + } + if( !CheckContext() ) + { + DBG_DRAW_OPERATION_EXIT("drawPolygon"); return; + } long nX = 0, nY = 0, nWidth = 0, nHeight = 0; getBoundRect( nPoints, pPtAry, nX, nY, nWidth, nHeight ); @@ -1144,8 +1268,10 @@ void AquaSalGraphics::drawPolygon( sal_uInt32 nPoints, const SalPoint *pPtAry ) } else { + SAL_WARN( "vcl.quartz", "Neither pen nor brush visible" ); return; } + CG_TRACE( "CGContextBeginPath(" << mrContext << ")" ); CGContextBeginPath( mrContext ); @@ -1180,6 +1306,8 @@ void AquaSalGraphics::drawPolygon( sal_uInt32 nPoints, const SalPoint *pPtAry ) CG_TRACE( "CGContextDrawPath(" << mrContext << "," << eMode << ")" ); CGContextDrawPath( mrContext, eMode ); RefreshRect( nX, nY, nWidth, nHeight ); + + DBG_DRAW_OPERATION_EXIT("drawPolygon"); } bool AquaSalGraphics::drawPolygonBezier( sal_uInt32, const SalPoint*, const sal_uInt8* ) @@ -1195,10 +1323,14 @@ bool AquaSalGraphics::drawPolyPolygonBezier( sal_uInt32, const sal_uInt32*, void AquaSalGraphics::drawRect( long nX, long nY, long nWidth, long nHeight ) { + DBG_DRAW_OPERATION("drawRect",); + if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawRect"); return; } + CGRect aRect( CGRectMake(nX, nY, nWidth, nHeight) ); if( IsPenVisible() ) { @@ -1219,16 +1351,23 @@ void AquaSalGraphics::drawRect( long nX, long nY, long nWidth, long nHeight ) CGContextStrokeRect( mrContext, aRect ); } RefreshRect( nX, nY, nWidth, nHeight ); + + DBG_DRAW_OPERATION_EXIT("drawRect"); } void AquaSalGraphics::drawPolyLine( sal_uInt32 nPoints, const SalPoint *pPtAry ) { + DBG_DRAW_OPERATION("drawPolyLine",); + if( nPoints < 1 ) { + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); return; } + if( !CheckContext() ) { + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); return; } @@ -1252,6 +1391,8 @@ void AquaSalGraphics::drawPolyLine( sal_uInt32 nPoints, const SalPoint *pPtAry ) CGContextDrawPath( mrContext, kCGPathStroke ); RefreshRect( nX, nY, nWidth, nHeight ); + + DBG_DRAW_OPERATION_EXIT("drawPolyLine"); } sal_uInt16 AquaSalGraphics::GetBitCount() const commit 57b44c3c66668794b5a180cc91f82e25a8fae92d Author: Tor Lillqvist <[email protected]> Date: Mon Apr 7 17:25:40 2014 +0300 Log correct depth for the created CGBitmapContext Change-Id: Icbcc4027d3fd9cb195c5fc6fd50f1ffaa7ce0d28 diff --git a/vcl/quartz/salvd.cxx b/vcl/quartz/salvd.cxx index e980aa1..ee75417 100644 --- a/vcl/quartz/salvd.cxx +++ b/vcl/quartz/salvd.cxx @@ -244,6 +244,7 @@ bool AquaSalVirtualDevice::SetSize( long nDX, long nDY ) #endif mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY, 8, nBytesPerRow, aCGColorSpace, aCGBmpInfo ); + CG_TRACE( "CGBitmapContextCreate(" << nDX << "x" << nDY << "x32) = " << mxBitmapContext ); xCGContext = mxBitmapContext; } } @@ -260,7 +261,7 @@ bool AquaSalVirtualDevice::SetSize( long nDX, long nDY ) #endif mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY, 8, nBytesPerRow, aCGColorSpace, aCGBmpInfo ); - CG_TRACE( "CGBitmapContextCreate(" << nDX << "x" << nDY << "x8) = " << mxBitmapContext ); + CG_TRACE( "CGBitmapContextCreate(" << nDX << "x" << nDY << "x32) = " << mxBitmapContext ); xCGContext = mxBitmapContext; #endif } commit 7bda773a967ae71302695cd1c5d3a780fa1d52ef Author: Tor Lillqvist <[email protected]> Date: Mon Apr 7 17:10:31 2014 +0300 Fill these buffers, too, with easily recognizable junk in dbgutil mode Change-Id: I7ad8ae6b4995b45deea18270348f6ce626aa1ed6 diff --git a/vcl/quartz/salvd.cxx b/vcl/quartz/salvd.cxx index 5894ce1..e980aa1 100644 --- a/vcl/quartz/salvd.cxx +++ b/vcl/quartz/salvd.cxx @@ -189,6 +189,10 @@ bool AquaSalVirtualDevice::SetSize( long nDX, long nDY ) const int nBytesPerRow = (mnBitmapDepth * nDX + 7) / 8; void* pRawData = rtl_allocateMemory( nBytesPerRow * nDY ); +#ifdef DBG_UTIL + for (ssize_t i = 0; i < nBytesPerRow * nDY; i++) + ((sal_uInt8*)pRawData)[i] = (i & 0xFF); +#endif mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY, mnBitmapDepth, nBytesPerRow, aCGColorSpace, aCGBmpInfo ); CG_TRACE( "CGBitmapContextCreate(" << nDX << "x" << nDY << "x" << mnBitmapDepth << ") = " << mxBitmapContext ); @@ -234,6 +238,10 @@ bool AquaSalVirtualDevice::SetSize( long nDX, long nDY ) const int nBytesPerRow = (mnBitmapDepth * nDX) / 8; void* pRawData = rtl_allocateMemory( nBytesPerRow * nDY ); +#ifdef DBG_UTIL + for (ssize_t i = 0; i < nBytesPerRow * nDY; i++) + ((sal_uInt8*)pRawData)[i] = (i & 0xFF); +#endif mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY, 8, nBytesPerRow, aCGColorSpace, aCGBmpInfo ); xCGContext = mxBitmapContext; @@ -246,6 +254,10 @@ bool AquaSalVirtualDevice::SetSize( long nDX, long nDY ) const int nBytesPerRow = (mnBitmapDepth * nDX) / 8; void* pRawData = rtl_allocateMemory( nBytesPerRow * nDY ); +#ifdef DBG_UTIL + for (ssize_t i = 0; i < nBytesPerRow * nDY; i++) + ((sal_uInt8*)pRawData)[i] = (i & 0xFF); +#endif mxBitmapContext = CGBitmapContextCreate( pRawData, nDX, nDY, 8, nBytesPerRow, aCGColorSpace, aCGBmpInfo ); CG_TRACE( "CGBitmapContextCreate(" << nDX << "x" << nDY << "x8) = " << mxBitmapContext ); commit 0e0014ded0fc746fb715baeac30d940cf99a2b50 Author: Tor Lillqvist <[email protected]> Date: Mon Apr 7 16:12:24 2014 +0300 Don't bother logging the CGContextSetLineWidth() here either Change-Id: I95860cd9edec474b656a7f4cc2847ef48868d699 diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx index 72a44b9..873f188 100644 --- a/vcl/quartz/salgdicommon.cxx +++ b/vcl/quartz/salgdicommon.cxx @@ -909,7 +909,6 @@ bool AquaSalGraphics::drawPolyLine( CGContextSetAlpha( mrContext, 1.0 - fTransparency ); CGContextSetLineJoin( mrContext, aCGLineJoin ); CGContextSetLineCap( mrContext, aCGLineCap ); - CG_TRACE( "CGContextSetLineWidth(" << mrContext << "," << rLineWidths.getX() << ")" ); CGContextSetLineWidth( mrContext, rLineWidths.getX() ); CG_TRACE( "CGContextDrawPath(" << mrContext << ",kCGPathStroke)" ); CGContextDrawPath( mrContext, kCGPathStroke ); commit 3ecab6fd717a910bcff488bbd1a30ab4cc86d8fd Author: Tor Lillqvist <[email protected]> Date: Mon Apr 7 16:11:06 2014 +0300 I think we should begin a new path in drawPolyLine() Change-Id: I113ab237561ae83a2d256be7ff14bea6432f0d06 diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx index ee1232a..72a44b9 100644 --- a/vcl/quartz/salgdicommon.cxx +++ b/vcl/quartz/salgdicommon.cxx @@ -899,6 +899,8 @@ bool AquaSalGraphics::drawPolyLine( // use the path to prepare the graphics context CG_TRACE( "CGContextSaveGState(" << mrContext << ") " << ++mnContextStackDepth ); CGContextSaveGState( mrContext ); + CG_TRACE( "CGContextBeginPath(" << mrContext << ")" ); + CGContextBeginPath( mrContext ); CG_TRACE( "CGContextAddPath(" << mrContext << "," << xPath << ")" ); CGContextAddPath( mrContext, xPath ); // draw path with antialiased line commit cd0417890db3a40311351a4a820dfc81335bf519 Author: Tor Lillqvist <[email protected]> Date: Mon Apr 7 16:09:27 2014 +0300 Add a couple of CG_TRACEs Change-Id: If1f3f4aafd6fde4fcf916b31e7447667baa1bfd0 diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx index 69ba6bb..ee1232a 100644 --- a/vcl/quartz/salgdicommon.cxx +++ b/vcl/quartz/salgdicommon.cxx @@ -398,7 +398,9 @@ void AquaSalGraphics::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSrcGrap static void DrawPattern50( void*, CGContextRef rContext ) { static const CGRect aRects[2] = { { {0,0}, { 2, 2 } }, { { 2, 2 }, { 2, 2 } } }; + CG_TRACE( "CGContextAddRects(" << rContext << ",aRects,2 )" ); CGContextAddRects( rContext, aRects, 2 ); + CG_TRACE( "CGContextFillPath(" << rContext << ")" ); CGContextFillPath( rContext ); } @@ -890,6 +892,7 @@ bool AquaSalGraphics::drawPolyLine( AddPolygonToPath( xPath, rPolyLine, rPolyLine.isClosed(), !getAntiAliasB2DDraw(), true ); const CGRect aRefreshRect = CGPathGetBoundingBox( xPath ); + CG_TRACE( "CGPathGetBoundingBox(" << xPath << ") = " << aRefreshRect ); // #i97317# workaround for Quartz having problems with drawing small polygons if( ! ((aRefreshRect.size.width <= 0.125) && (aRefreshRect.size.height <= 0.125)) ) { _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
