Tk Source Code

Artifact [304e55f6b4]
Login

Artifact 304e55f6b4955e16137c794c59f3052364ef0085:

Attachment "tkMacOSXDrawCG.diff" to ticket [841244ffff] added by tigital 2004-11-19 06:28:51.
Index: tkMacOSXDraw.c
===================================================================
RCS file: /cvsroot/tktoolkit/tk/macosx/tkMacOSXDraw.c,v
retrieving revision 1.2.2.5
diff -r1.2.2.5 tkMacOSXDraw.c
117a118
> #if 0
147c148
<     
---
>  
191c192
<         int xOffset, yOffset;
---
>         int xOffset = 0, yOffset = 0;
215a217,344
> #else
> 	CGRect	srcCGRect, destRect;
>   CGRect * srcPtr, * dstPtr;
>   MacDrawable *srcDraw = (MacDrawable *) src;
>   MacDrawable *dstDraw = (MacDrawable *) dst;
>   CGrafPtr srcPort, destPort;
>   CGrafPtr saveWorld;
>   GDHandle saveDevice;
>   Rect clpRect;
> 	CGImageRef srcImage = NULL;
> 	CGAffineTransform coordsTransform;
> 	CGContextRef destContext;
> 	float sx, sy, dx, dy;
> 
>   destPort = TkMacOSXGetDrawablePort(dst);
>   srcPort = TkMacOSXGetDrawablePort(src);
> 	
> 	display->request++;
>   GetGWorld(&saveWorld, &saveDevice);
>   SetGWorld(destPort, NULL);
> 	if (tmpRgn2 == NULL) {
>         tmpRgn2 = NewRgn();
>   }
> 	srcPtr = &srcCGRect;
> 
> 	srcCGRect = CGRectMake(	(float)(srcDraw->xOff-src_x),
> 				(float)(srcDraw->yOff-src_y),
> 				(float)width,
> 				(float)height );
>   if (tkPictureIsOpen ) {
> 		dstPtr = &srcCGRect;
>   } else {
>       dstPtr = &destRect;
> 		destRect = CGRectMake(	(float)(dstDraw->xOff + dest_x),
> 				(float)(dstDraw->yOff + dest_y),
> 				(float)width,
> 				(float)height );
>   }
>   TkMacOSXSetUpClippingRgn(dst);
>     /*
>      *  We will change the clip rgn in this routine, so we need to 
>      *  be able to restore it when we exit.
>      */
>  
>     GetClip(tmpRgn2);
>     if (tkPictureIsOpen) {
>         /*
>          * When rendering into a picture, after a call to "OpenCPicture"
>          * the clipping is seriously WRONG and also INCONSISTENT with the
>          * clipping for single plane bitmaps.
>          * To circumvent this problem,  we clip to the whole window 
>          * In this case, would have also clipped to the srcRect
>          * ClipRect(&srcRect);
>          */
>         GetPortBounds(destPort,&clpRect);
>         dstPtr = &srcCGRect;
>         ClipRect(&clpRect);
>     }
>     if (!gc->clip_mask ) { 
>     } else if (((TkpClipMask*)gc->clip_mask)->type == TKP_CLIP_REGION) {
>         RgnHandle clipRgn = (RgnHandle)
>             ((TkpClipMask*)gc->clip_mask)->value.region;
>  
>         int xOffset = 0, yOffset = 0;
>         if (tmpRgn == NULL) {
>             tmpRgn = NewRgn();
>         }
>         if (!tkPictureIsOpen) {
>             xOffset = dstDraw->xOff + gc->clip_x_origin;
>             yOffset = dstDraw->yOff + gc->clip_y_origin;
>             OffsetRgn(clipRgn, xOffset, yOffset);
>         }
>         GetClip(tmpRgn);
>         SectRgn(tmpRgn, clipRgn, tmpRgn);
>         SetClip(tmpRgn);
>         if (!tkPictureIsOpen) {
>              OffsetRgn(clipRgn, -xOffset, -yOffset);
>         }
>     }
> 
> 	PixMapHandle pm = GetPortPixMap( srcPort );
>         
> 	TkMacOSXSetUpCGContext(dstDraw, destPort, gc, &destContext);
> 			
> 	size_t srcW = (size_t)width;
> 	size_t srcH = (size_t)height;
> 	size_t bytesPerRow = (size_t)GetPixRowBytes( pm );
> 	size_t totalBytes = srcH * bytesPerRow;
> 	unsigned char* bitmap = GetPixBaseAddr( pm );
> 	
> 	CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, bitmap, totalBytes, NULL );
> 	CGColorSpaceRef colorSpaceUserRGB = CGColorSpaceCreateDeviceRGB();
> 		
> 	srcImage = CGImageCreate( width, height,
> 						8,//bitsPerComponent
> 						32,//bitsPerPixel
> 						bytesPerRow,
> 						colorSpaceUserRGB,//colorspace
> 						kCGImageAlphaFirst, //alphaInfo
> 						provider, // dataProvider
> 						NULL, //decode array
> 						0, //shouldInterpolate?
> 						kCGRenderingIntentDefault); // CGColorRenderingIntent
> 	CGDataProviderRelease( provider );
> 	CGRect drawRect = CGRectMake ( (float)(dstDraw->xOff + dest_x),
> 								   (float)(dstDraw->yOff + dest_y),
> 								   width, height);
> 	if(!CGRectEqualToRect( srcCGRect, destRect ))
> 	{
> 		sx = CGRectGetWidth(destRect) / CGRectGetWidth(srcCGRect);
>       sy = CGRectGetHeight(destRect) / CGRectGetHeight(srcCGRect);
>       dx = CGRectGetMinX(destRect) - (CGRectGetMinX(srcCGRect) * sx);
> 		dy = CGRectGetMinY(destRect) - (CGRectGetMinY(srcCGRect) * sy);
> 
>       drawRect = CGRectMake (dx, dy, width*sx, height*sy);
>   }
> 	CGContextSaveGState( destContext );
> 	
> 	CGContextClipToRect( destContext, destRect );
> 	CGContextDrawImage( destContext, drawRect, srcImage );
> 	CGImageRelease( srcImage );
> 	CGContextRestoreGState( destContext );
> 	CGColorSpaceRelease( colorSpaceUserRGB );
> 	
> 	TkMacOSXReleaseCGContext(dstDraw, destPort, &destContext);
> 	SetClip(tmpRgn2);
> 	SetGWorld(saveWorld, saveDevice);
> #endif
250a380
> #if 0
348a479,588
> #else
> 	Rect srcRect, dstRect;
>     Rect * srcPtr, * dstPtr;
>     MacDrawable *srcDraw = (MacDrawable *) src;
>     MacDrawable *dstDraw = (MacDrawable *) dst;
>     CGrafPtr srcPort, destPort;
>     CGrafPtr saveWorld;
>     GDHandle saveDevice;
>     Rect clpRect;
> 	Rect boundsRect;
> 	CGImageRef srcImage = NULL;
> 	CGAffineTransform coordsTransform;
> 
>     destPort = TkMacOSXGetDrawablePort(dst);
>     srcPort = TkMacOSXGetDrawablePort(src);
> 	
> 	display->request++;
>     GetGWorld(&saveWorld, &saveDevice);
>     SetGWorld(destPort, NULL);
> 
> 	if (tmpRgn2 == NULL) {
>         tmpRgn2 = NewRgn();
>     }
>     TkMacOSXSetUpClippingRgn(dst);
>     /*
>      *  We will change the clip rgn in this routine, so we need to 
>      *  be able to restore it when we exit.
>      */
>  
>     GetClip(tmpRgn2);
>     if (tkPictureIsOpen) {
>         /*
>          * When rendering into a picture, after a call to "OpenCPicture"
>          * the clipping is seriously WRONG and also INCONSISTENT with the
>          * clipping for single plane bitmaps.
>          * To circumvent this problem,  we clip to the whole window 
>          * In this case, would have also clipped to the srcRect
>          * ClipRect(&srcRect);
>          */
>         GetPortBounds(destPort,&clpRect);
>         dstPtr = &srcRect;
>         ClipRect(&clpRect);
>     }
>     if (!gc->clip_mask ) { 
>     } else if (((TkpClipMask*)gc->clip_mask)->type == TKP_CLIP_REGION) {
>         RgnHandle clipRgn = (RgnHandle)
>             ((TkpClipMask*)gc->clip_mask)->value.region;
>  
>         int xOffset = 0, yOffset = 0;
>         if (tmpRgn == NULL) {
>             tmpRgn = NewRgn();
>         }
>         if (!tkPictureIsOpen) {
>             xOffset = dstDraw->xOff + gc->clip_x_origin;
>             yOffset = dstDraw->yOff + gc->clip_y_origin;
>             OffsetRgn(clipRgn, xOffset, yOffset);
>         }
>         GetClip(tmpRgn);
>         SectRgn(tmpRgn, clipRgn, tmpRgn);
>         SetClip(tmpRgn);
>         if (!tkPictureIsOpen) {
>              OffsetRgn(clipRgn, -xOffset, -yOffset);
>         }
>     }
> 
>         CGContextRef destContext;
> 		CGRect	srcCGRect, destRect;
> 		RgnHandle clipRgn;
> 		PixMapHandle pm = GetPortPixMap( srcPort );
> 		BitMap* srcBit = GetPortBitMapForCopyBits( srcPort );
>         
>         TkMacOSXSetUpCGContext(dstDraw, destPort, gc, &destContext);
> 
> 		srcCGRect = CGRectMake(	(float)(srcDraw->xOff + src_x),
> 				(float)(srcDraw->yOff + src_y),
> 				(float)width,
> 				(float)height );
> 		destRect = CGRectMake(	(float)(dstDraw->xOff + dest_x),
> 				(float)(dstDraw->yOff + dest_y),
> 				(float)width,
> 				(float)height );
> 				
> 		size_t srcW = (size_t)width;
> 		size_t srcH = (size_t)height;
> 		size_t bytesPerRow = (size_t)GetPixRowBytes( pm );
> 		size_t totalBytes = srcH * bytesPerRow;
> 		unsigned char* bitmap = GetPixBaseAddr( pm );
> 		CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, bitmap, totalBytes, NULL );
> 		CGColorSpaceRef colorSpaceUserRGB = CGColorSpaceCreateDeviceRGB();
> 		
> 		srcImage = CGImageCreate( width, height,
> 						8,//bitsPerComponent
> 						32,//bitsPerPixel
> 						bytesPerRow,
> 						colorSpaceUserRGB,//colorspace
> 						kCGImageAlphaNoneSkipFirst, //alphaInfo
> 						provider, // dataProvider
> 						NULL, //decode array
> 						0, //shouldInterpolate?
> 						kCGRenderingIntentDefault); // CGColorRenderingIntent
> 		CGDataProviderRelease( provider );
> 				
> 		CGContextSaveGState( destContext );
> 		CGContextDrawImage( destContext, destRect, srcImage );
> 		CGImageRelease( srcImage );
> 		CGContextRestoreGState( destContext );
> 		
>       TkMacOSXReleaseCGContext(dstDraw, destPort, &destContext);
> 		CGColorSpaceRelease( colorSpaceUserRGB );
> #endif
382a623
> #if 0
480a722,884
> #else
> 	Rect srcRect, dstRect;
>     Rect * srcPtr, * dstPtr;
>     CGrafPtr srcPort, destPort;
>     CGrafPtr saveWorld;
>     GDHandle saveDevice;
> 	MacDrawable *dstDraw = (MacDrawable *) d;
> 	BitMap bitmap;
> 	unsigned char *newData = NULL;
> 	int i, j;
>     Rect clpRect;
> 	Rect boundsRect;
> 	CGImageRef srcImage = NULL;
> 	CGAffineTransform coordsTransform;
> 	CGDataProviderRef provider;
> 	CGContextRef destContext;
> 	CGRect	srcCGRect, destRect;
> 	RgnHandle clipRgn;
> 
> 	destPort = TkMacOSXGetDrawablePort(d);
> 	display->request++;
> 	GetGWorld(&saveWorld, &saveDevice);
> 	SetGWorld(destPort, NULL);
> 	TkMacOSXSetUpClippingRgn(d);
> 		
> 	GetPortBounds(destPort, &boundsRect);
>         
> 	TkMacOSXSetUpCGContext(d, destPort, gc, &destContext);
> 
> 	srcCGRect = CGRectMake(	(float)src_x, (float)src_y,
> 							(float)width, (float)height );
> 								
> 	destRect = CGRectMake(	(float)(dstDraw->xOff + dest_x), (float)(dstDraw->yOff + dest_y),
> 							(float)width, (float)height );
> 	if (image->obdata) {
>         /* Image from XGetImage, copy from containing GWorld directly */
>         GWorldPtr srcPort = TkMacOSXGetDrawablePort((Drawable)image->obdata);
> 		PixMapHandle pm = GetPortPixMap( srcPort );
> 		size_t srcW = (size_t)width;
> 		size_t srcH = (size_t)height;
> 		size_t bytesPerRow = (size_t)GetPixRowBytes( pm );
> 		size_t totalBytes = srcH * bytesPerRow;
> 		unsigned char* bitmap = GetPixBaseAddr( pm );
> 		CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, bitmap, totalBytes, NULL );
> 		CGColorSpaceRef colorSpaceUserRGB = CGColorSpaceCreateDeviceRGB();
> 		
> 		srcImage = CGImageCreate( width, height,
> 						8,//bitsPerComponent
> 						32,//bitsPerPixel
> 						bytesPerRow,
> 						colorSpaceUserRGB,//colorspace
> 						kCGImageAlphaNoneSkipFirst, //alphaInfo
> 						provider, // dataProvider
> 						NULL, //decode array
> 						0, //shouldInterpolate?
> 						kCGRenderingIntentDefault); // CGColorRenderingIntent
> 		CGDataProviderRelease( provider );
> 				
> 		CGContextSaveGState( destContext );
> 		
> 		CGContextClipToRect( destContext, destRect );
> 		CGContextClearRect( destContext, destRect );
> 		CGContextSetShouldAntialias( destContext, 0 );
> 		CGContextDrawImage( destContext, srcCGRect, srcImage );
> 		CGImageRelease( srcImage );
> 		CGContextRestoreGState( destContext );
> 		
>       TkMacOSXReleaseCGContext(d, destPort, &destContext);
> 		CGColorSpaceRelease( colorSpaceUserRGB );
> 				
>     } else if (image->depth == 1) {
>         /* 
>          * This code assumes a pixel depth of 1 
>          */
> 		char *newData = NULL;
> 		int bytesPerLine = 0;
> 		
>         if ((image->bytes_per_line % 2) == 1) {
>             unsigned char *newPtr, *oldPtr;
> 			bytesPerLine = image->bytes_per_line + 1;
>             newData = (char *) malloc(image->height *
>                     bytesPerLine);
>             newPtr = newData;
>             oldPtr = image->data;
>             for (i = 0; i < image->height; i++) {
>                 for (j = 0; j < image->bytes_per_line; j++) {
>                     *newPtr = ~(InvertByte((unsigned char) *oldPtr));
>                     newPtr++, oldPtr++;
>                 }
>             *newPtr = 0;
>             newPtr++;
>             }
>         } else {
> 			bytesPerLine = image->bytes_per_line;
> 			newData = (unsigned char *) malloc(image->height * image->bytes_per_line);
>             for (i = 0; i < image->height * image->bytes_per_line; i++) {
>                 newData[i] = ~(InvertByte((unsigned char) image->data[i]));
>             }
>         }
> 		size_t totalBytes = (size_t)image->height * bytesPerLine;
> 		CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, newData, totalBytes, NULL );
> 		CGColorSpaceRef grayColorSpace = CGColorSpaceCreateDeviceGray();
> 		
> 		srcImage = CGImageCreate( (size_t)image->width, (size_t)image->height,
> 						1,//bitsPerComponent
> 						1,//bitsPerPixel
> 						bytesPerLine,
> 						grayColorSpace,//colorspace
> 						kCGImageAlphaNone, //alphaInfo
> 						provider, // dataProvider
> 						NULL, //decode array
> 						0, //shouldInterpolate?
> 						kCGRenderingIntentDefault); // CGColorRenderingIntent
> 				
> 		CGContextSaveGState( destContext );
> 		
> 		CGContextClipToRect( destContext, destRect );
> 		CGContextClearRect( destContext, destRect );
> 		CGContextSetShouldAntialias( destContext, 0 );
> 		CGContextDrawImage( destContext, srcCGRect, srcImage );
> 		CGImageRelease( srcImage );
> 		CGContextRestoreGState( destContext );
> 		
> 		CGDataProviderRelease( provider );
> 		CGColorSpaceRelease( grayColorSpace );
>       TkMacOSXReleaseCGContext(d, destPort, &destContext);
> 	}else{
> 	/* Color image */
> 		size_t srcW = (size_t)width;
> 		size_t srcH = (size_t)height;
> 		size_t bytesPerRow = (size_t)image->bytes_per_line;
> 		size_t totalBytes = srcH * bytesPerRow;
> 		CGDataProviderRef provider = CGDataProviderCreateWithData( NULL, (unsigned char*)image->data, 
> 																	totalBytes, NULL );
> 		CGColorSpaceRef colorSpaceUserRGB = CGColorSpaceCreateDeviceRGB();
> 		
> 		srcImage = CGImageCreate( srcW, srcH,
> 						8,//bitsPerComponent
> 						32,//bitsPerPixel
> 						bytesPerRow,
> 						colorSpaceUserRGB,//colorspace
> 						kCGImageAlphaNoneSkipFirst, //alphaInfo
> 						provider, // dataProvider
> 						NULL, //decode array
> 						0, //shouldInterpolate?
> 						kCGRenderingIntentDefault); // CGColorRenderingIntent
> 		CGDataProviderRelease( provider );
> 				
> 		CGContextSaveGState( destContext );
> 		
> 		CGContextClipToRect( destContext, destRect );
> 		CGContextDrawImage( destContext, srcCGRect, srcImage );
> 		CGImageRelease( srcImage );
> 		CGContextRestoreGState( destContext );
> 		
> 		CGColorSpaceRelease( colorSpaceUserRGB );
>       TkMacOSXReleaseCGContext(d, destPort, &destContext);
> 	}
> 	if (newData != NULL){
> 		free(newData);
> 	}
> 	SetGWorld(saveWorld, saveDevice);
> #endif
834a1239
> // needed for cgcontext or n
841c1246
< 	CGRect	rect;
---
> 		CGRect	rect;
845,849c1250,1254
< 	rect = CGRectMake((float) ((float) macWin->xOff + (float) x),
< 	        (float) ((float) macWin->yOff + (float) y),
< 	        (float) width,
< 		(float) height);
< 	CGContextStrokeRect(outContext, rect);
---
> 		rect = CGRectMake(	(float)((float)macWin->xOff + (float)x),
> 				(float)((float)macWin->yOff + (float)y),
> 				(float)width,
> 				(float)height );
> 		CGContextStrokeRect( outContext, rect );
916d1320
< 
919c1323
< 	CGRect	rect;
---
> 		CGRect	rect;
923,930c1327,1333
<         for (i = 0, rectPtr = rectArr; i < nRects; i++, rectPtr++) {
< 	    rect = CGRectMake((float) ((float) macWin->xOff 
<                     + (float) rectPtr->x),
< 		    (float) ((float) macWin->yOff + (float) rectPtr->y),
< 		    (float) rectPtr->width,
< 		    (float) rectPtr->height);
< 	    CGContextStrokeRect(outContext, rect);
< 	}
---
>         for (i=0, rectPtr = rectArr; i < nRects; i++, rectPtr++ ){
> 			rect = CGRectMake((float)((float)macWin->xOff + (float)rectPtr->x),
> 				    (float)((float)macWin->yOff + (float)rectPtr->y),
> 				    (float)rectPtr->width,
> 				    (float)rectPtr->height );
> 			CGContextStrokeRect( outContext, rect );
> 		}
933,934c1336
< 	TkMacOSXSetUpGraphicsPort(gc, destPort);
< 
---
> 		TkMacOSXSetUpGraphicsPort(gc, destPort);
1043d1444
< 
1701c2102
<  * TkMacOSXSetUpGraphicsPort --
---
>  * TkMacOSXSetUpCGContext --
1703c2104
<  *        Set up the graphics port from the given GC.
---
>  *        Set up the CGContext from the given GC.