Hi,
attached you'll find a changed implementation for AquaSalGraphics. This
implements the new way of only painting to a back buffer and only
updating to the window if a system event requests it (or the frame is
flushed).
I found no more problems in comparison to the aquavcl01 checked in
version and an outdevgrind test (vcl's performance measuring tool to be
found in vcl/workben) shows that performance almost over the board is
considerably better. However since it's a quite invasive patch I'd like
people to play with it and find severe problems before I commit it.
Unless someone objects until tomorrow evening (german time) I'll commit
this patch.
Kind regards, pl
--
If you give someone a program, you will frustrate them for a day;
if you teach them how to program, you will frustrate them for a lifetime.
-- Author unknown
Index: inc/salbmp.h
===================================================================
RCS file: /cvs/gsl/vcl/aqua/inc/Attic/salbmp.h,v
retrieving revision 1.1.2.7
diff -r1.1.2.7 salbmp.h
140,141c140,144
< bool Create( CGContextRef xContext, int nX, int nY,
int nWidth, int nHeight );
< bool Create( sal_uInt32 nWidth, sal_uInt32 nHeight,
sal_uInt16 nBits, sal_uInt32 nBytesPerRow, sal_uInt8* pBuffer, sal_uInt32 nX,
sal_uInt32 nY, sal_uInt32 nDX, sal_uInt32 nDY );
---
> bool Create( CGContextRef xContext, int nX, int nY,
> int nWidth, int nHeight, bool bMirrorVert = true );
> bool Create( sal_uInt32 nWidth, sal_uInt32 nHeight,
> sal_uInt16 nBits, sal_uInt32 nBytesPerRow, sal_uInt8* pBuffer,
> sal_uInt32 nX, sal_uInt32 nY, sal_uInt32 nDX,
> sal_uInt32 nDY,
> bool bMirrorVert = true
> );
Index: inc/salframe.h
===================================================================
RCS file: /cvs/gsl/vcl/aqua/inc/salframe.h,v
retrieving revision 1.15.112.21
diff -r1.15.112.21 salframe.h
161a162,164
>
> // trigger painting of the window
> void SendPaintEvent();
Index: inc/salgdi.h
===================================================================
RCS file: /cvs/gsl/vcl/aqua/inc/salgdi.h,v
retrieving revision 1.28.112.28
diff -r1.28.112.28 salgdi.h
94d93
< CGContextRef mrBitmapContext; // bitmap
graphics context (either from a virtual device(mrBitmapContext==mrContext) or
an offscreen copy of mrContext
96,97d94
< CGLayerRef mrCGLayer;
// CGLayer to store what we draw to mrContext and be able to repaint (replace
mrBitmapContext)
< CGContextRef mrCGLayerContext; // Context of
CGLayer, used for drawing
124,125d120
< sal_Int32 mnGraphics;
// guards BeginGraphics and EndGraphics from multiple calls
<
131,134d125
< #if DEBUGLEVEL>1
< bool mbQDCG; //true if in QDCG
< #endif
<
156d146
< bool isOffscreenCopy() const;
157a148,149
> bool CheckContext();
> void UpdateWindow();
159,164d150
< // set up and release graphics context, required for any drawing operation
< // the view will be be flipped like the HIView coordinate system
< // i.e. (0,0) is top left and the y-axis points to the bottom
< bool BeginGraphics();
< bool EndGraphics();
< void InitContextForPainting( CGContextRef
xContext );
167a154,155
>
> void SetState();
343,347d330
< inline bool AquaSalGraphics::isOffscreenCopy() const
< {
< return mrBitmapContext && (mrBitmapContext != mrContext);
< }
<
Index: source/gdi/salatslayout.cxx
===================================================================
RCS file: /cvs/gsl/vcl/aqua/source/gdi/Attic/salatslayout.cxx,v
retrieving revision 1.1.2.15
diff -r1.1.2.15 salatslayout.cxx
335,339c335
< ATSUAttributeTag theTagsOff[10];
< ByteCount theSizesOff[10];
< ATSUAttributeValuePtr theValuesOff[10];
< ItemCount numcontrolsOff = 0;
< long height;
---
> long height = 0;
347c343
< if ( mpGraphics->BeginGraphics() )
---
> if ( mpGraphics->CheckContext() )
349,383c345,359
< // Get windows dimensions
< GetWindowPortBounds( mpGraphics->mrWindow, &windowBounds );
< height = windowBounds.bottom - windowBounds.top;
< // Modify Y for flipped view
< aPos.Y() = height - aPos.Y();
<
< if(mpGraphics->mrContext != NULL){
< // the flipped view leads to flipped glyphs as well
< // so apply another transformation that flips back and
adjust y-pos accordingly
<
< CGContextTranslateCTM ( mpGraphics->mrContext, 0,
height );
< CGContextScaleCTM ( mpGraphics->mrContext, 1.0, -1.0 );
<
< if (mpGraphics->isOffscreenCopy())
< {
< CGContextTranslateCTM (
mpGraphics->mrBitmapContext, 0, height );
< CGContextScaleCTM (
mpGraphics->mrBitmapContext, 1.0, -1.0 );
< }
<
<
< theTags[numcontrols] = kATSUCGContextTag;
< theSizes[numcontrols] = sizeof( CGContextRef );
< theValues[numcontrols++] = &(mpGraphics->mrContext);
<
< }
< else
< {
< AquaLog("-->%s : mpGraphics->mrContext is
NULL\n",__func__);
< }
<
< if (mpGraphics->isOffscreenCopy()){
< theTagsOff[numcontrolsOff] = kATSUCGContextTag;
< theSizesOff[numcontrolsOff] = sizeof( CGContextRef );
< theValuesOff[numcontrolsOff++] =
&(mpGraphics->mrBitmapContext);
< }
---
> CGContextSaveGState( mpGraphics->mrContext );
> // Get windows dimensions
> height = CGBitmapContextGetHeight( mpGraphics->mrContext ); //
> returns 0 in not a bitmap context case
> // Modify Y for flipped view
> aPos.Y() = height - aPos.Y();
>
> // the flipped view leads to flipped glyphs as well
> // so apply another transformation that flips back and adjust y-pos
> accordingly
>
> CGContextTranslateCTM ( mpGraphics->mrContext, 0, height );
> CGContextScaleCTM ( mpGraphics->mrContext, 1.0, -1.0 );
>
> theTags[numcontrols] = kATSUCGContextTag;
> theSizes[numcontrols] = sizeof( CGContextRef );
> theValues[numcontrols++] = &(mpGraphics->mrContext);
392,399d367
<
<
< if (mpGraphics->isOffscreenCopy())
< {
< theTagsOff[numcontrolsOff] =
kATSULineRotationTag;
< theSizesOff[numcontrolsOff] = sizeof( Fixed );
< theValuesOff[numcontrolsOff++] = &theAngle;
< }
427,435d394
<
< if (mpGraphics->isOffscreenCopy())
< {
< ATSUSetLayoutControls( maATSULayout,
numcontrolsOff, theTagsOff, theSizesOff, theValuesOff );
<
< theErr = ATSUDrawText( maATSULayout, mnTextOfs,
mnTextLen, Long2Fix(aPos.X()), Long2Fix(aPos.Y()));
< if( theErr != noErr )
< AquaLog( "ATSLayout::DrawText(0x%p) :
ATSUDrawText failed for offscreen copy!\n", this );
< }
437,438c396
<
< mpGraphics->EndGraphics();
---
> CGContextRestoreGState( mpGraphics->mrContext );
Index: source/gdi/salbmp.cxx
===================================================================
RCS file: /cvs/gsl/vcl/aqua/source/gdi/salbmp.cxx,v
retrieving revision 1.23.112.19
diff -r1.23.112.19 salbmp.cxx
84c84
< bool AquaSalBitmap::Create( CGContextRef xContext, int nX, int nY, int
nWidth, int nHeight )
---
> bool AquaSalBitmap::Create( CGContextRef xContext, int nX, int nY, int
> nWidth, int nHeight, bool bMirrorVert )
89c89
< nX, nY, nWidth, nHeight );
---
> nX, nY, nWidth, nHeight, bMirrorVert );
95c95
< bool AquaSalBitmap::Create( sal_uInt32 nWidth, sal_uInt32 nHeight, sal_uInt16
nBits, sal_uInt32 nBytesPerRow, sal_uInt8* pBuffer, sal_uInt32 nX, sal_uInt32
nY, sal_uInt32 nDX, sal_uInt32 nDY )
---
> bool AquaSalBitmap::Create( sal_uInt32 nWidth, sal_uInt32 nHeight, sal_uInt16
> nBits, sal_uInt32 nBytesPerRow, sal_uInt8* pBuffer, sal_uInt32 nX, sal_uInt32
> nY, sal_uInt32 nDX, sal_uInt32 nDY, bool bMirrorVert )
112,121c112,137
< nY = nHeight - nY - nDY;
< pSource += nBytesPerRow * nY;
<
< sal_uInt32 y = nDY;
< while( y-- )
< {
< memcpy( pDest, pSource, mnBytesPerRow );
< pDest += mnBytesPerRow;
< pSource += nBytesPerRow;
< }
---
> if( bMirrorVert )
> {
> nY = nHeight - nY - nDY;
> pSource += nBytesPerRow * nY;
>
> sal_uInt32 y = nDY;
> while( y-- )
> {
> memcpy( pDest, pSource, mnBytesPerRow );
> pDest += mnBytesPerRow;
> pSource += nBytesPerRow;
> }
> }
> else
> {
> pSource += nBytesPerRow * nY;
> pDest += mnBytesPerRow * (nDY-1);
>
> sal_uInt32 y = nDY;
> while( y-- )
> {
> memcpy( pDest, pSource, mnBytesPerRow );
> pDest -= mnBytesPerRow;
> pSource += nBytesPerRow;
> }
> }
Index: source/gdi/salgdi.cxx
===================================================================
RCS file: /cvs/gsl/vcl/aqua/source/gdi/salgdi.cxx,v
retrieving revision 1.59.112.44
diff -r1.59.112.44 salgdi.cxx
99,103d98
< mrBitmapContext = NULL;
<
< #if DEBUGLEVEL>1
< mbQDCG=false;
< #endif
134d128
< mnGraphics = 0;
141,142d134
< DBG_ASSERT( mnGraphics == 0, "vcl::AquaSalGraphics::~AquaSalGraphics(),
BeginGraphics and EndGraphics calls do not match!" );
<
154c146
< if( mrBitmapContext && (mrBitmapContext != mrContext) )
---
> if( mrContext && mrWindow != 0 )
157,159c149,151
< void * pBuffer = CGBitmapContextGetData(mrBitmapContext);
< CFRelease( mrBitmapContext );
< mrBitmapContext = 0;
---
> void * pBuffer = CGBitmapContextGetData(mrContext);
> CFRelease( mrContext );
> mrContext = 0;
161c153
< free( pBuffer );
---
> rtl_freeMemory( pBuffer );
210,221c202
< if ( mrWindow )
< {
< return static_cast<USHORT>( CGDisplayBitsPerPixel(
GetWindowDisplayID() ) );
< }
< else if( mrBitmapContext )
< {
< return static_cast<USHORT>(
CGBitmapContextGetBitsPerPixel(mrBitmapContext) );
< }
< else
< {
< return 32;
< }
---
> return static_cast<USHORT>( CheckContext() ?
> CGBitmapContextGetBitsPerPixel(mrContext) : 0 );
230a212,213
> if( CheckContext() )
> SetState();
293a277,278
> if( CheckContext() )
> SetState();
300a286,287
>
> CGContextSetStrokeColor( mrContext, mpLineColor );
310a298,299
>
> CGContextSetStrokeColor( mrContext, mpLineColor );
317a307,308
>
> CGContextSetFillColor( mrContext, mpFillColor );
327a319,320
>
> CGContextSetFillColor( mrContext, mpFillColor );
337a331,340
> static SalColor ImplGetROPSalColor( SalROPColor nROPColor )
> {
> SalColor nSalColor;
> if ( nROPColor == SAL_ROP_0 )
> nSalColor = MAKE_SALCOLOR( 0, 0, 0 );
> else
> nSalColor = MAKE_SALCOLOR( 255, 255, 255 );
> return nSalColor;
> }
>
339a343
> SetLineColor( ImplGetROPSalColor( nROPColor ) );
345a350
> SetFillColor( ImplGetROPSalColor( nROPColor ) );
352,358c357,359
< // save fill color and replace it with the desired color
< float oldFillColor[4];
< memcpy( (void*) oldFillColor, (void*) mpFillColor, sizeof( oldFillColor )
);
< memcpy( (void*) mpFillColor, (void*) pColor, sizeof( oldFillColor ) );
<
< if ( BeginGraphics() )
< {
---
> if ( CheckContext() )
> {
> CGContextSetFillColor( mrContext, pColor );
360,369c361,363
< CGContextFillRect (mrContext, CGRectMake (nX, nY, 1, 1));
<
< if( isOffscreenCopy() )
< CGContextFillRect (mrBitmapContext, CGRectMake (nX, nY,
1, 1));
< EndGraphics();
< }
<
< // restore fill color
< memcpy( (void*) mpFillColor, (void*) oldFillColor, sizeof( oldFillColor )
);
<
---
> CGContextFillRect( mrContext, CGRectMake (nX, nY, 1, 1) );
> CGContextSetFillColor( mrContext, mpFillColor );
> }
375c369,370
< ImplDrawPixel( nX, nY, mpLineColor );
---
> ImplDrawPixel( nX, nY, mpLineColor );
> RefreshRect( nX, nY, 1, 1 );
389a385
> RefreshRect( nX, nY, 1, 1 );
404,405c400
< if ( BeginGraphics() )
< {
---
> if ( CheckContext() )
407,410c402,405
< if( isOffscreenCopy() )
< implDrawLine( mrBitmapContext, nX1, nY1, nX2, nY2 );
< EndGraphics();
< }
---
>
> Rectangle aRefreshRect( nX1, nY1, nX2, nY2 );
> aRefreshRect.Justify();
> RefreshRect( aRefreshRect.Left(), aRefreshRect.Top(),
> aRefreshRect.GetWidth(), aRefreshRect.GetHeight() );
415,422d409
< static void implDrawRect( CGContextRef& xContext, long nX, long nY, long
nWidth, long nHeight, bool bFilled )
< {
< if( bFilled )
< CGContextStrokeRect(xContext, CGRectMake (nX, nY, nWidth,
nHeight));
< else
< CGContextFillRect(xContext, CGRectMake (nX, nY, nWidth,
nHeight));
< }
<
425c412
< if ( BeginGraphics() )
---
> if ( CheckContext() )
427c414,417
< const bool bFilled = IsBrushTransparent();
---
> CGRect aRect( CGRectMake(nX, nY, nWidth, nHeight) );
>
> if( ! IsBrushTransparent() )
> CGContextFillRect( mrContext, aRect );
429,432c419,422
< implDrawRect( mrContext, nX, nY, nWidth, nHeight, bFilled );
< if( isOffscreenCopy() )
< implDrawRect( mrBitmapContext, nX, nY, nWidth, nHeight,
bFilled );
< EndGraphics();
---
> if( ! IsPenTransparent() )
> CGContextStrokeRect( mrContext, aRect );
>
> RefreshRect( nX, nY, nWidth, nHeight );
450c440
< if( (nPoints > 1) && BeginGraphics() )
---
> if( (nPoints > 1) && CheckContext() )
453,455c443
< if( isOffscreenCopy() )
< implDrawPolyLine( mrBitmapContext, nPoints, pPtAry );
< EndGraphics();
---
> RefreshWindow();
461c449
< static void ImplDrawPolygone( CGContextRef& xContext, ULONG nPoints, const
SalPoint *pPtAry, float* pFillColor, float* pLineColor )
---
> static void ImplDrawPolygon( CGContextRef& xContext, ULONG nPoints, const
> SalPoint *pPtAry, float* pFillColor, float* pLineColor )
481,487c469,471
< if( (nPoints > 1) && BeginGraphics() )
< {
< ImplDrawPolygone( mrContext, nPoints, pPtAry, mpFillColor,
mpLineColor );
< if( isOffscreenCopy() )
< ImplDrawPolygone( mrBitmapContext, nPoints, pPtAry,
mpFillColor, mpLineColor );
< EndGraphics();
< }
---
> if( (nPoints > 1) && CheckContext() )
> ImplDrawPolygon( mrContext, nPoints, pPtAry, mpFillColor,
> mpLineColor );
> RefreshWindow();
492c476
< static void ImplDrawPolyPolygone( CGContextRef& xContext, ULONG nPolyCount,
const ULONG *pPoints, PCONSTSALPOINT *ppPtAry )
---
> static void ImplDrawPolyPolygon( CGContextRef& xContext, ULONG nPolyCount,
> const ULONG *pPoints, PCONSTSALPOINT *ppPtAry )
514,520c498,499
< if( nPolyCount && ( mpFillColor[3] > 0.0 ) && BeginGraphics() )
< {
< ImplDrawPolyPolygone( mrContext, nPolyCount, pPoints, ppPtAry );
< if( isOffscreenCopy() )
< ImplDrawPolyPolygone( mrBitmapContext, nPolyCount,
pPoints, ppPtAry );
< EndGraphics();
< }
---
> if( nPolyCount && ( mpFillColor[3] > 0.0 ) && CheckContext() )
> ImplDrawPolyPolygon( mrContext, nPolyCount, pPoints, ppPtAry );
526a506
> RefreshWindow();
607c587
< if ( BeginGraphics() )
---
> if( CheckContext() )
612,613d591
< if( isOffscreenCopy() )
< CGContextDrawImage(mrBitmapContext, CGRectMake
((int)pPosAry->mnDestX, (int)pPosAry->mnDestY, (int)pPosAry->mnDestWidth,
(int)pPosAry->mnDestHeight), xImage);
618d595
< EndGraphics();
636c613
< if ( BeginGraphics() )
---
> if( CheckContext() )
645,646d621
< if( isOffscreenCopy() )
< CGContextDrawImage(mrBitmapContext, CGRectMake
(pPosAry->mnDestX, pPosAry->mnDestY, pPosAry->mnDestWidth,
pPosAry->mnDestHeight), xMaskedImage);
649c624
< EndGraphics();
---
> RefreshWindow();
659c634
< if ( BeginGraphics() )
---
> if ( CheckContext() )
668,669d642
< if( isOffscreenCopy() )
< CGContextDrawImage(mrBitmapContext, CGRectMake
(pPosAry->mnDestX, pPosAry->mnDestY, pPosAry->mnDestWidth,
pPosAry->mnDestHeight), xImage);
672d644
< EndGraphics();
687c659
< if( mrBitmapContext )
---
> if( mrContext )
690c662
< if( !pBitmap->Create( mrBitmapContext, nX, nY, nDX, nDY ) )
---
> if( !pBitmap->Create( mrContext, nX, nY, nDX, nDY, mrWindow ==
> 0 ) )
715c687
< if ( BeginGraphics() )
---
> if ( CheckContext() )
745d716
< EndGraphics();
748,751d718
< else
< {
< AquaLog( ">>>>> AquaSalGraphics::invert - failed BeginGraphics\n" );
< }
759c726
< if ( BeginGraphics() )
---
> if ( CheckContext() )
789,790d755
< EndGraphics();
< RefreshRect(pRect.origin.x, pRect.origin.y, pRect.size.width,
pRect.size.height);
791a757
> RefreshRect(pRect.origin.x, pRect.origin.y, pRect.size.width,
> pRect.size.height);
839c805
< if ( BeginGraphics() )
---
> if ( CheckContext() )
841d806
<
843,847c808
<
< if( isOffscreenCopy() )
< CGContextDrawImage(mrBitmapContext, CGRectMake( rTR.mnDestX,
rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight), xMaskedImage );
<
< EndGraphics();
---
> RefreshRect(rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth,
> rTR.mnDestHeight);
859c820
< if ( BeginGraphics() )
---
> if ( CheckContext() )
866a828
> mpFillColor[3] = oldAlpha; // reset the old value
869d830
< EndGraphics();
871d831
< mpFillColor[3] = oldAlpha; // reset the old value
1055c1015
< else if( mrBitmapContext )
---
> else if( mrContext )
Index: source/gdi/salgdiutils.cxx
===================================================================
RCS file: /cvs/gsl/vcl/aqua/source/gdi/salgdiutils.cxx,v
retrieving revision 1.7.112.23
diff -r1.7.112.23 salgdiutils.cxx
80c80,86
< mrBitmapContext = xContext;
---
> if( mrContext )
> {
> CGContextSetFillColorSpace( mrContext, mrRGBColorSpace );
> CGContextSetStrokeColorSpace( mrContext, mrRGBColorSpace );
> CGContextSaveGState( mrContext );
> SetState();
> }
85c91
< void AquaSalGraphics::InitContextForPainting( CGContextRef xContext )
---
> void AquaSalGraphics::SetState()
86a93,94
> CGContextRestoreGState( mrContext );
> CGContextSaveGState( mrContext );
90,92c98,100
< CGContextBeginPath( xContext ); // discard any
existing path
< CGContextAddPath( xContext, mrClippingPath ); // set the
current path to the clipping path
< CGContextClip( xContext ); // use it for
clipping
---
> CGContextBeginPath( mrContext ); // discard any
> existing path
> CGContextAddPath( mrContext, mrClippingPath ); // set the
> current path to the clipping path
> CGContextClip( mrContext ); // use it for
> clipping
96,99c104,105
< CGContextSetFillColorSpace( xContext, mrRGBColorSpace );
< CGContextSetFillColor( xContext, mpFillColor );
< CGContextSetStrokeColorSpace( xContext, mrRGBColorSpace );
< CGContextSetStrokeColor( xContext, mpLineColor );
---
> CGContextSetFillColor( mrContext, mpFillColor );
> CGContextSetStrokeColor( mrContext, mpLineColor );
104c110
< bool AquaSalGraphics::BeginGraphics ()
---
> bool AquaSalGraphics::CheckContext()
106,166c112,117
< if( mnGraphics++ == 0 )
< {
< if( mrWindow != NULL && mrContext == 0)
< {
< Rect windowBounds;
< GetWindowPortBounds ( mrWindow, &windowBounds);
< const unsigned int nWidth = windowBounds.right -
windowBounds.left;
< const unsigned int nHeight = windowBounds.bottom -
windowBounds.top;
<
< if( mrBitmapContext )
< {
< // check if window size changed and we need to
create a new bitmap context
< if( (CGBitmapContextGetWidth(mrBitmapContext)
!= nWidth) || (CGBitmapContextGetHeight(mrBitmapContext) != nHeight) )
< {
< void* pBuffer =
CGBitmapContextGetData(mrBitmapContext);
< CFRelease( mrBitmapContext );
< mrBitmapContext = 0;
< free( pBuffer );
< }
< }
<
< if( !mrBitmapContext )
< {
< void* pData = malloc( nWidth * 4 * nHeight );
< if (pData )
< {
< mrBitmapContext =
CGBitmapContextCreate( pData, nWidth, nHeight, 8, nWidth * 4, mrRGBColorSpace,
kCGImageAlphaNoneSkipFirst );
<
< if( !mrBitmapContext )
< {
< free( pData );
< }
< }
< }
<
< SetPortWindowPort (mrWindow);
< if( noErr == QDBeginCGContext (GetWindowPort
(mrWindow), &mrContext))
< {
< #if DEBUGLEVEL>1
< mbQDCG = true;
< #endif
< if( mrBitmapContext )
< {
< CGContextSaveGState( mrBitmapContext );
< InitContextForPainting( mrBitmapContext
);
< }
<
< CGContextTranslateCTM (mrContext, 0, nHeight);
< CGContextScaleCTM (mrContext, 1.0, -1.0);
<
< InitContextForPainting( mrContext );
<
< //RefreshWindow();
< }
< }
< else if( mbVirDev )
< {
< CGContextSaveGState( mrBitmapContext );
< InitContextForPainting( mrBitmapContext );
< }
< }
---
> if( mrWindow != NULL )
> {
> Rect windowBounds;
> GetWindowPortBounds( mrWindow, &windowBounds );
> const unsigned int nWidth = windowBounds.right - windowBounds.left;
> const unsigned int nHeight = windowBounds.bottom - windowBounds.top;
167a119,153
> if( mrContext )
> {
> // check if window size changed and we need to create a new
> bitmap context
> if( (CGBitmapContextGetWidth(mrContext) != nWidth) ||
> (CGBitmapContextGetHeight(mrContext) != nHeight) )
> {
> void* pBuffer = CGBitmapContextGetData(mrContext);
> CFRelease( mrContext );
> mrContext = 0;
> rtl_freeMemory( pBuffer );
> }
> }
>
> if( !mrContext )
> {
> void* pData = rtl_allocateMemory( nWidth * 4 * nHeight );
> if (pData )
> {
> mrContext = CGBitmapContextCreate( pData, nWidth, nHeight, 8,
> nWidth * 4, mrRGBColorSpace, kCGImageAlphaNoneSkipFirst );
>
> if( !mrContext )
> {
> rtl_freeMemory( pData );
> }
> else
> {
> CGContextTranslateCTM( mrContext, 0, nHeight );
> CGContextScaleCTM( mrContext, 1.0, -1.0 );
> CGContextSetFillColorSpace( mrContext, mrRGBColorSpace );
> CGContextSetStrokeColorSpace( mrContext, mrRGBColorSpace
> );
> CGContextSaveGState( mrContext );
> SetState();
> }
> }
> }
> }
174c160
< AquaLog("<<<WARNING>>> AquaSalGraphics::BeginGraphics()
FAILED!!!!\n" );
---
> AquaLog("<<<WARNING>>> AquaSalGraphics::CheckContext()
> FAILED!!!!\n" );
184a171,173
> myRect.right -= myRect.left;
> myRect.bottom -= myRect.top;
> myRect.left = myRect.top = 0;
203a193,199
>
> Rect aRect;
> aRect.left = (short)lX;
> aRect.top = (short)lY;
> aRect.right = (short)(lX + lWidth );
> aRect.bottom = (short)(lY + lHeight );
> InvalWindowRect(mrWindow, &aRect);
214a211
> RefreshWindow();
221,227c218
< bool bAcquireContext = (mrContext == NULL);
< if( bAcquireContext )
< bAcquireContext = BeginGraphics();
< if( mrContext )
< CGContextFlush(mrContext);
< if( bAcquireContext )
< EndGraphics();
---
> UpdateWindow();
249,289c240
< bool AquaSalGraphics::EndGraphics ()
< {
< if( (mnGraphics > 0) && (--mnGraphics == 0) )
< {
< if( mrContext != NULL && mrWindow != NULL )
< {
< /* TODO: Optimize this so we synchronize only on user event?
< if( !mnUpdateGraphicsEvent )
< mnUpdateGraphicsEvent = Application::PostUserEvent(
LINK( this, AquaSalGraphics, UpdateGraphics), 0 );
< */
< //RefreshWindow();
< //CGContextSynchronize(mrContext);
<
< QDEndCGContext (GetWindowPort(mrWindow), &mrContext);
< #if DEBUGLEVEL>1
< mbQDCG = false;
< #endif
< mrContext = 0;
<
< if( mrBitmapContext )
< CGContextRestoreGState( mrBitmapContext );
< }
< else if( mbVirDev )
< {
< if( mrBitmapContext )
< CGContextRestoreGState( mrBitmapContext );
< }
< }
< #if DEBUGLEVEL>1
< if(mbQDCG)
< AquaLog("-->%s unmatched QDEndCGContext\n",__func__);
< else
< AquaLog("-->%s OK\n",__func__);
< #endif
< return true;
< }
<
< // -----------------------------------------------------------------------
<
< /*
< IMPL_LINK( AquaSalGraphics, UpdateGraphics, void*, EMPTYARG )
---
> void AquaSalGraphics::UpdateWindow()
291,292d241
< mnUpdateGraphicsEvent = 0;
<
295,296c244,246
< SetPortWindowPort (mrWindow);
< if( noErr == QDBeginCGContext (GetWindowPort (mrWindow),
&mrWindowContext))
---
> SetPortWindowPort(mrWindow);
> CGContextRef xWindowContext = 0;
> if( noErr == QDBeginCGContext (GetWindowPort (mrWindow),
> &xWindowContext))
299c249
< GetWindowPortBounds ( mrWindow, &windowBounds);
---
> GetWindowPortBounds( mrWindow, &windowBounds);
301c251
< CGContextDrawImage(mrWindowContext, CGRectMake
(windowBounds.left, windowBounds.top, windowBounds.right - windowBounds.left,
windowBounds.bottom - windowBounds.top ), xImage);
---
> CGContextDrawImage(xWindowContext,
> CGRectMake(windowBounds.left, windowBounds.top, windowBounds.right -
> windowBounds.left, windowBounds.bottom - windowBounds.top ), xImage);
303,305c253,254
< CGContextSynchronize(mrWindowContext);
< QDEndCGContext (GetWindowPort(mrWindow),
&mrWindowContext);
< mrWindowContext = 0;
---
> CGContextFlush( xWindowContext );
> QDEndCGContext (GetWindowPort(mrWindow),
> &xWindowContext);
308d256
< return 0;
310d257
< */
Index: source/gdi/salnativewidgets.cxx
===================================================================
RCS file: /cvs/gsl/vcl/aqua/source/gdi/Attic/salnativewidgets.cxx,v
retrieving revision 1.1.2.33
diff -r1.1.2.33 salnativewidgets.cxx
279c279,280
< if( nPart == PART_ENTIRE_CONTROL )
---
> #if 0
> if( nPart == PART_ENTIRE_CONTROL ) // we don't currently support
> the tooltip
280a282
> #endif
476,477c478,482
< BOOL bOk = FALSE;
<
---
> BOOL bOK = FALSE;
>
> if( ! CheckContext() )
> return false;
>
478a484
> RefreshRect( buttonRect.Left(), buttonRect.Top(), buttonRect.GetWidth(),
> buttonRect.GetHeight() );
485c491
<
---
>
487,488c493,494
< PART_BUTTON_UP 101
< PART_BUTTON_DOWN 102
---
> PART_BUTTON_UP 101
> PART_BUTTON_DOWN 102
492c498
<
---
>
495,496c501,502
< **/
<
---
> **/
>
500,503c506,509
< //case CTRL_FIXEDBORDER:
< //case CTRL_TAB_PANE:
< //case CTRL_TAB_BODY:
< case CTRL_TOOLBAR:
---
> //case CTRL_FIXEDBORDER:
> //case CTRL_TAB_PANE:
> //case CTRL_TAB_BODY:
> case CTRL_TOOLBAR:
505c511,532
< if( BeginGraphics() )
---
> HIThemeMenuItemDrawInfo aMenuItemDrawInfo;
> aMenuItemDrawInfo.version = 0;
> aMenuItemDrawInfo.state = kThemeMenuActive;
> aMenuItemDrawInfo.itemType = kThemeMenuItemHierBackground;
>
> HIThemeDrawMenuItem(&rc,&rc,&aMenuItemDrawInfo,mrContext,kHIThemeOrientationNormal,NULL);
> bOK = true;
> }
> break;
>
> case CTRL_MENU_POPUP:
> {
> if ((nPart == PART_ENTIRE_CONTROL) || (nPart == PART_MENU_ITEM
> )|| (nPart == HAS_BACKGROUND_TEXTURE ))
> {
> HIThemeMenuDrawInfo aMenuInfo;
> aMenuInfo.version = 0;
> aMenuInfo.menuType = kThemeMenuTypePullDown;
>
> HIThemeMenuItemDrawInfo aMenuItemDrawInfo;
> // the Aqua grey theme when the item is selected is drawn
> here.
> aMenuItemDrawInfo.itemType = kThemeMenuItemPlain;
>
> if ((nPart == PART_MENU_ITEM ))
507,508c534,539
< HIThemeMenuItemDrawInfo aMenuItemDrawInfo;
< aMenuItemDrawInfo.version = 0;
---
> // the blue theme when the item is selected is drawn here.
> aMenuItemDrawInfo.state = kThemeMenuSelected;
> }
> else
> {
> // normal color for non selected item
510,515d540
< aMenuItemDrawInfo.itemType = kThemeMenuItemHierBackground;
<
HIThemeDrawMenuItem(&rc,&rc,&aMenuItemDrawInfo,mrContext,kHIThemeOrientationNormal,NULL);
< if ( isOffscreenCopy() )
<
HIThemeDrawMenuItem(&rc,&rc,&aMenuItemDrawInfo,mrBitmapContext,kHIThemeOrientationNormal,NULL);
< EndGraphics();
< return true;
517,518c542,550
< else
< return false;
---
>
> // repaints the background of the pull down menu
>
> HIThemeDrawMenuBackground(&rc,&aMenuInfo,mrContext,kHIThemeOrientationNormal);
>
> // repaints the item either blue (selected) and/or Aqua grey
> (active only)
>
> HIThemeDrawMenuItem(&rc,&rc,&aMenuItemDrawInfo,mrContext,kHIThemeOrientationNormal,&rc);
>
> bOK = true;
> }
520,569c552,553
< break;
<
< case CTRL_MENU_POPUP:
< {
< if ((nPart == PART_ENTIRE_CONTROL) || (nPart == PART_MENU_ITEM
)|| (nPart == HAS_BACKGROUND_TEXTURE ))
< {
< HIThemeMenuDrawInfo aMenuInfo;
< aMenuInfo.version = 0;
< aMenuInfo.menuType =
kThemeMenuTypePullDown;
<
< HIThemeMenuItemDrawInfo
aMenuItemDrawInfo;
< // the Aqua grey theme when the item is
selected is drawn here.
< aMenuItemDrawInfo.itemType =
kThemeMenuItemPlain;
<
< if ((nPart == PART_MENU_ITEM ))
< {
< // the blue theme when
the item is selected is drawn here.
< aMenuItemDrawInfo.state
= kThemeMenuSelected;
< }
< else
< {
< // normal color for non
selected item
< aMenuItemDrawInfo.state
= kThemeMenuActive;
< }
<
< if( BeginGraphics() )
< {
<
< // repaints the background of the pull down menu
<
HIThemeDrawMenuBackground(&rc,&aMenuInfo,mrContext,kHIThemeOrientationNormal);
<
< // repaints the item either blue (selected)
and/or Aqua grey (active only)
<
HIThemeDrawMenuItem(&rc,&rc,&aMenuItemDrawInfo,mrContext,kHIThemeOrientationNormal,&rc);
<
< // Draw POPUP menu item to the offscreen bitmap
< if ( isOffscreenCopy() )
< {
<
HIThemeDrawMenuBackground(&rc,&aMenuInfo,mrBitmapContext,kHIThemeOrientationNormal);
<
HIThemeDrawMenuItem(&rc,&rc,&aMenuItemDrawInfo,mrBitmapContext,kHIThemeOrientationNormal,&rc);
< }
<
< EndGraphics();
< return true;
< }
< else
< return false;
< }
< }
< break;
<
---
> break;
>
571,572c555
< {
<
---
> {
575c558
<
---
>
578c561
<
---
>
586c569
<
---
>
589c572
<
---
>
591,592c574,575
< kThemeAdornmentDefault :
< kThemeAdornmentNone;
---
> kThemeAdornmentDefault :
> kThemeAdornmentNone;
594,606c577,580
< aBevelInfo.adornment |= kThemeAdornmentFocus;
<
< if( BeginGraphics() )
< {
< HIThemeDrawButton( &rc, &aBevelInfo, mrContext,
kHIThemeOrientationNormal, NULL );
< if ( isOffscreenCopy() )
< HIThemeDrawButton( &rc, &aBevelInfo, mrBitmapContext,
kHIThemeOrientationNormal, NULL );
< EndGraphics();
< return true;
< }
< else
< return false;
< break;
---
> aBevelInfo.adornment |= kThemeAdornmentFocus;
>
> HIThemeDrawButton( &rc, &aBevelInfo, mrContext,
> kHIThemeOrientationNormal, NULL );
> bOK = true;
622c596
<
---
>
626c600
<
---
>
628c602
<
---
>
630c604
<
---
>
632,633c606,607
< kThemeAdornmentDefault :
< kThemeAdornmentNone;
---
> kThemeAdornmentDefault :
> kThemeAdornmentNone;
635,636c609,610
< aPushInfo.adornment |= kThemeAdornmentFocus;
<
---
> aPushInfo.adornment |= kThemeAdornmentFocus;
>
639,649c613,615
<
< if( BeginGraphics() )
< {
< HIThemeDrawButton( &rc, &aPushInfo, mrContext,
kHIThemeOrientationNormal, NULL );
< if ( isOffscreenCopy() )
< HIThemeDrawButton( &rc, &aPushInfo,
mrBitmapContext, kHIThemeOrientationNormal, NULL );
< EndGraphics();
< return true;
< }
< else
< return false;
---
>
> HIThemeDrawButton( &rc, &aPushInfo, mrContext,
> kHIThemeOrientationNormal, NULL );
> bOK = true;
651d616
< break;
653,655c618,621
< }
<
< case CTRL_RADIOBUTTON:
---
> }
> break;
>
> case CTRL_RADIOBUTTON:
661,664c627,630
< case CTRL_RADIOBUTTON: aInfo.kind = kThemeRadioButton;
< break;
< case CTRL_CHECKBOX: aInfo.kind = kThemeCheckBox;
< break;
---
> case CTRL_RADIOBUTTON: aInfo.kind = kThemeRadioButton;
> break;
> case CTRL_CHECKBOX: aInfo.kind = kThemeCheckBox;
> break;
666c632
<
---
>
668c634
<
---
>
671c637
<
---
>
673,674c639,640
< kThemeAdornmentDefault :
< kThemeAdornmentNone;
---
> kThemeAdornmentDefault :
> kThemeAdornmentNone;
677c643,653
< if( BeginGraphics() )
---
> HIThemeDrawButton( &rc, &aInfo, mrContext,
> kHIThemeOrientationNormal, NULL );
> bOK = true;
> }
> break;
>
> case CTRL_SCROLLBAR:
> {
> ScrollbarValue* pScrollbarVal = (ScrollbarValue
> *)(aValue.getOptionalVal());
>
> if( nPart == PART_DRAW_BACKGROUND_VERT ||
> nPart == PART_DRAW_BACKGROUND_HORZ )
679,683c655,693
< HIThemeDrawButton( &rc, &aInfo, mrContext,
kHIThemeOrientationNormal, NULL );
< if ( isOffscreenCopy() )
< HIThemeDrawButton( &rc, &aInfo, mrBitmapContext,
kHIThemeOrientationNormal, NULL );
< EndGraphics();
< return true;
---
> HIThemeTrackDrawInfo aTrackDraw;
> aTrackDraw.version = 0;
> aTrackDraw.kind = kThemeMediumScrollBar;
> aTrackDraw.bounds = rc;
> aTrackDraw.min = pScrollbarVal->mnMin;
> aTrackDraw.max = pScrollbarVal->mnMax -
> pScrollbarVal->mnVisibleSize;
> aTrackDraw.value = pScrollbarVal->mnCur;
> aTrackDraw.reserved = 0;
> aTrackDraw.attributes = kThemeTrackShowThumb;
> if( nPart == PART_DRAW_BACKGROUND_HORZ )
> aTrackDraw.attributes |= kThemeTrackHorizontal;
> aTrackDraw.enableState = kThemeTrackActive;
>
> ScrollBarTrackInfo aScrollInfo;
> aScrollInfo.viewsize = pScrollbarVal->mnVisibleSize;
> aScrollInfo.pressState = 0;
>
> if ( pScrollbarVal->mnButton1State & CTRL_STATE_ENABLED )
> {
> if ( pScrollbarVal->mnButton1State & CTRL_STATE_PRESSED )
> aScrollInfo.pressState = kThemeTopOutsideArrowPressed;
> }
>
> if ( pScrollbarVal->mnButton2State & CTRL_STATE_ENABLED )
> {
> if ( pScrollbarVal->mnButton2State & CTRL_STATE_PRESSED )
> aScrollInfo.pressState =
> kThemeBottomOutsideArrowPressed;
> }
>
> if ( pScrollbarVal->mnThumbState & CTRL_STATE_ENABLED )
> {
> if ( pScrollbarVal->mnThumbState & CTRL_STATE_PRESSED )
> aScrollInfo.pressState = kThemeThumbPressed;
> }
>
> aTrackDraw.trackInfo.scrollbar = aScrollInfo;
>
> HIThemeDrawTrack( &aTrackDraw, NULL, mrContext,
> kHIThemeOrientationNormal );
> bOK = true;
685,686d694
< else
< return false;
688,745d695
< break;
<
< case CTRL_SCROLLBAR:
< {
< ScrollbarValue* pScrollbarVal = (ScrollbarValue
*)(aValue.getOptionalVal());
<
< if( nPart == PART_DRAW_BACKGROUND_VERT ||
< nPart == PART_DRAW_BACKGROUND_HORZ )
< {
< HIThemeTrackDrawInfo aTrackDraw;
< aTrackDraw.version = 0;
< aTrackDraw.kind = kThemeMediumScrollBar;
< aTrackDraw.bounds = rc;
< aTrackDraw.min = pScrollbarVal->mnMin;
< aTrackDraw.max = pScrollbarVal->mnMax -
pScrollbarVal->mnVisibleSize;
< aTrackDraw.value = pScrollbarVal->mnCur;
< aTrackDraw.reserved = 0;
< aTrackDraw.attributes = kThemeTrackShowThumb;
< if( nPart == PART_DRAW_BACKGROUND_HORZ )
< aTrackDraw.attributes |=
kThemeTrackHorizontal;
< aTrackDraw.enableState = kThemeTrackActive;
<
< ScrollBarTrackInfo aScrollInfo;
< aScrollInfo.viewsize =
pScrollbarVal->mnVisibleSize;
< aScrollInfo.pressState = 0;
<
< if ( pScrollbarVal->mnButton1State &
CTRL_STATE_ENABLED )
< {
< if ( pScrollbarVal->mnButton1State &
CTRL_STATE_PRESSED )
< aScrollInfo.pressState =
kThemeTopOutsideArrowPressed;
< }
<
< if ( pScrollbarVal->mnButton2State &
CTRL_STATE_ENABLED )
< {
< if ( pScrollbarVal->mnButton2State &
CTRL_STATE_PRESSED )
< aScrollInfo.pressState =
kThemeBottomOutsideArrowPressed;
< }
<
< if ( pScrollbarVal->mnThumbState &
CTRL_STATE_ENABLED )
< {
< if ( pScrollbarVal->mnThumbState &
CTRL_STATE_PRESSED )
< aScrollInfo.pressState =
kThemeThumbPressed;
< }
<
< aTrackDraw.trackInfo.scrollbar = aScrollInfo;
<
< if ( BeginGraphics() )
< {
< HIThemeDrawTrack( &aTrackDraw, NULL,
mrContext, kHIThemeOrientationNormal );
< if ( isOffscreenCopy() )
< HIThemeDrawTrack( &aTrackDraw, NULL, mrBitmapContext,
kHIThemeOrientationNormal );
< EndGraphics();
< return true;
< }
< else
< return false;
< }
< }
747c697,698
< return bOk;
---
>
> return bOK;
Index: source/window/salframe.cxx
===================================================================
RCS file: /cvs/gsl/vcl/aqua/source/window/salframe.cxx,v
retrieving revision 1.46.112.88
diff -r1.46.112.88 salframe.cxx
305a306,316
> void AquaSalFrame::SendPaintEvent()
> {
> SalPaintEvent aPaintEvt;
> aPaintEvt.mnBoundX = 0;
> aPaintEvt.mnBoundY = 0;
> aPaintEvt.mnBoundWidth = maGeometry.nWidth;
> aPaintEvt.mnBoundHeight = maGeometry.nHeight;
>
> CallCallback(SALEVENT_PAINT, &aPaintEvt);
> }
>
336,340c347,349
< if( ! mbShown )
< {
< Rect aRect = { 0, 0, mnWidth, mnHeight };
< InvalWindowRect( mrWindow, &aRect );
< }
---
>
> // trigger filling out backbuffer
> SendPaintEvent();
1432,1446d1440
<
< Rect contentBounds;
< GetWindowBounds( pSalFrame->mrWindow, kWindowContentRgn, &contentBounds
);
<
< SalPaintEvent aPaintEvt;
< aPaintEvt.mnBoundX = 0;
< aPaintEvt.mnBoundY = 0;
< aPaintEvt.mnBoundWidth = pSalFrame->mnWidth;
< aPaintEvt.mnBoundHeight = pSalFrame->mnHeight;
<
< AquaLog( "Full paint event: (%ld, %ld, %ld, %ld)\n",
< aPaintEvt.mnBoundX, aPaintEvt.mnBoundY,
< aPaintEvt.mnBoundWidth, aPaintEvt.mnBoundHeight);
<
< pSalFrame->CallCallback(SALEVENT_PAINT, &aPaintEvt);
1447a1442,1444
> if( pSalFrame->mpGraphics )
> pSalFrame->mpGraphics->UpdateWindow();
>
1460,1474c1457,1459
< Rect portBounds;
< GetWindowBounds (pSalFrame->mrWindow, kWindowContentRgn, &portBounds );
<
< SalPaintEvent aPaintEvt;
< aPaintEvt.mnBoundX = 0;
< aPaintEvt.mnBoundY = 0;
< aPaintEvt.mnBoundWidth = pSalFrame->mnWidth;
< aPaintEvt.mnBoundHeight = pSalFrame->mnHeight;
<
< AquaLog( "Paint event: (%ld, %ld, %ld, %ld)\n",
< aPaintEvt.mnBoundX, aPaintEvt.mnBoundY,
< aPaintEvt.mnBoundWidth, aPaintEvt.mnBoundHeight);
<
< pSalFrame->CallCallback(SALEVENT_PAINT, &aPaintEvt);
<
---
> if( pSalFrame->mpGraphics )
> pSalFrame->mpGraphics->UpdateWindow();
>
1498a1484,1487
>
> pSalFrame->UpdateFrameGeometry();
> pSalFrame->SendPaintEvent();
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]