Update to tk 8.5.19
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
|
||||
* Copyright 2001-2009, Apple Inc.
|
||||
* Copyright (c) 2005-2009 Daniel A. Steffen <das@users.sourceforge.net>
|
||||
* Copyright 2014 Marc Culler.
|
||||
*
|
||||
* See the file "license.terms" for information on usage and redistribution
|
||||
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
@@ -141,7 +142,7 @@ TkpOpenDisplay(
|
||||
static NSRect maxBounds = {{0, 0}, {0, 0}};
|
||||
static char vendor[25] = "";
|
||||
NSArray *cgVers;
|
||||
NSAutoreleasePool *pool;
|
||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
||||
|
||||
if (gMacDisplay != NULL) {
|
||||
if (strcmp(gMacDisplay->display->display_name, display_name) == 0) {
|
||||
@@ -165,7 +166,6 @@ TkpOpenDisplay(
|
||||
display->default_screen = 0;
|
||||
display->display_name = (char *) macScreenName;
|
||||
|
||||
pool = [NSAutoreleasePool new];
|
||||
cgVers = [[[NSBundle bundleWithIdentifier:@"com.apple.CoreGraphics"]
|
||||
objectForInfoDictionaryKey:@"CFBundleShortVersionString"]
|
||||
componentsSeparatedByString:@"."];
|
||||
@@ -176,12 +176,25 @@ TkpOpenDisplay(
|
||||
display->proto_minor_version = [[cgVers objectAtIndex:2] integerValue];
|
||||
}
|
||||
if (!vendor[0]) {
|
||||
snprintf(vendor, sizeof(vendor), "Apple AppKit %s %g",
|
||||
([NSGarbageCollector defaultCollector] ? "GC" : "RR"),
|
||||
snprintf(vendor, sizeof(vendor), "Apple AppKit %g",
|
||||
NSAppKitVersionNumber);
|
||||
}
|
||||
display->vendor = vendor;
|
||||
Gestalt(gestaltSystemVersion, (SInt32 *) &display->release);
|
||||
{
|
||||
int major, minor, patch;
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 10100
|
||||
Gestalt(gestaltSystemVersionMajor, (SInt32*)&major);
|
||||
Gestalt(gestaltSystemVersionMinor, (SInt32*)&minor);
|
||||
Gestalt(gestaltSystemVersionBugFix, (SInt32*)&patch);
|
||||
#else
|
||||
NSOperatingSystemVersion systemVersion = [[NSProcessInfo processInfo] operatingSystemVersion];
|
||||
major = systemVersion.majorVersion;
|
||||
minor = systemVersion.minorVersion;
|
||||
patch = systemVersion.patchVersion;
|
||||
#endif
|
||||
display->release = major << 16 | minor << 8 | patch;
|
||||
}
|
||||
|
||||
/*
|
||||
* These screen bits never change
|
||||
@@ -809,7 +822,6 @@ XCreateImage(
|
||||
int bytes_per_line)
|
||||
{
|
||||
XImage *ximage;
|
||||
|
||||
display->request++;
|
||||
ximage = (XImage *) ckalloc(sizeof(XImage));
|
||||
|
||||
@@ -819,6 +831,7 @@ XCreateImage(
|
||||
ximage->xoffset = offset;
|
||||
ximage->format = format;
|
||||
ximage->data = data;
|
||||
ximage->obdata = NULL;
|
||||
|
||||
if (format == ZPixmap) {
|
||||
ximage->bits_per_pixel = 32;
|
||||
@@ -850,7 +863,6 @@ XCreateImage(
|
||||
ximage->red_mask = 0x00FF0000;
|
||||
ximage->green_mask = 0x0000FF00;
|
||||
ximage->blue_mask = 0x000000FF;
|
||||
ximage->obdata = NULL;
|
||||
ximage->f.create_image = NULL;
|
||||
ximage->f.destroy_image = DestroyImage;
|
||||
ximage->f.get_pixel = ImageGetPixel;
|
||||
@@ -869,8 +881,9 @@ XCreateImage(
|
||||
* This function copies data from a pixmap or window into an XImage.
|
||||
*
|
||||
* Results:
|
||||
* Returns a newly allocated image containing the data from the given
|
||||
* rectangle of the given drawable.
|
||||
* Returns a newly allocated XImage containing the data from the given
|
||||
* rectangle of the given drawable, or NULL if the XImage could not be
|
||||
* constructed.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
@@ -889,60 +902,84 @@ XGetImage(
|
||||
unsigned long plane_mask,
|
||||
int format)
|
||||
{
|
||||
MacDrawable *macDraw = (MacDrawable *) d;
|
||||
XImage * imagePtr = NULL;
|
||||
Pixmap pixmap = (Pixmap) NULL;
|
||||
Tk_Window win = (Tk_Window) macDraw->winPtr;
|
||||
GC gc;
|
||||
char * data = NULL;
|
||||
int depth = 32;
|
||||
int offset = 0;
|
||||
int bitmap_pad = 0;
|
||||
int bytes_per_line = 0;
|
||||
|
||||
NSBitmapImageRep *bitmap_rep;
|
||||
NSUInteger bitmap_fmt;
|
||||
XImage * imagePtr = NULL;
|
||||
char * bitmap = NULL;
|
||||
char * image_data=NULL;
|
||||
int depth = 32;
|
||||
int offset = 0;
|
||||
int bitmap_pad = 0;
|
||||
int bytes_per_row = 4*width;
|
||||
int size;
|
||||
TkMacOSXDbgMsg("XGetImage");
|
||||
if (format == ZPixmap) {
|
||||
if (width > 0 && height > 0) {
|
||||
/*
|
||||
* Tk_GetPixmap fails for zero width or height.
|
||||
*/
|
||||
|
||||
pixmap = Tk_GetPixmap(display, d, width, height, depth);
|
||||
if (width == 0 || height == 0) {
|
||||
/* This happens all the time.
|
||||
TkMacOSXDbgMsg("XGetImage: empty image requested");
|
||||
*/
|
||||
return NULL;
|
||||
}
|
||||
if (win) {
|
||||
XGCValues values;
|
||||
|
||||
gc = Tk_GetGC(win, 0, &values);
|
||||
} else {
|
||||
gc = XCreateGC(display, pixmap, 0, NULL);
|
||||
bitmap_rep = BitmapRepFromDrawableRect(d, x, y,width, height);
|
||||
bitmap_fmt = [bitmap_rep bitmapFormat];
|
||||
|
||||
if ( bitmap_rep == Nil ||
|
||||
(bitmap_fmt != 0 && bitmap_fmt != 1) ||
|
||||
[bitmap_rep samplesPerPixel] != 4 ||
|
||||
[bitmap_rep isPlanar] != 0 ) {
|
||||
TkMacOSXDbgMsg("XGetImage: Failed to construct NSBitmapRep");
|
||||
return NULL;
|
||||
}
|
||||
if (pixmap) {
|
||||
CGContextRef context;
|
||||
|
||||
XCopyArea(display, d, pixmap, gc, x, y, width, height, 0, 0);
|
||||
context = ((MacDrawable *) pixmap)->context;
|
||||
if (context) {
|
||||
data = CGBitmapContextGetData(context);
|
||||
bytes_per_line = CGBitmapContextGetBytesPerRow(context);
|
||||
NSSize image_size = NSMakeSize(width, height);
|
||||
NSImage* ns_image = [[NSImage alloc]initWithSize:image_size];
|
||||
[ns_image addRepresentation:bitmap_rep];
|
||||
|
||||
/* Assume premultiplied nonplanar data with 4 bytes per pixel.*/
|
||||
if ( [bitmap_rep isPlanar ] == 0 &&
|
||||
[bitmap_rep samplesPerPixel] == 4 ) {
|
||||
bytes_per_row = [bitmap_rep bytesPerRow];
|
||||
size = bytes_per_row*height;
|
||||
image_data = (char*)[bitmap_rep bitmapData];
|
||||
if ( image_data ) {
|
||||
int row, n, m;
|
||||
bitmap = ckalloc(size);
|
||||
/*
|
||||
Oddly enough, the bitmap has the top row at the beginning,
|
||||
and the pixels are in BGRA or ABGR format.
|
||||
*/
|
||||
if (bitmap_fmt == 0) {
|
||||
/* BGRA */
|
||||
for (row=0, n=0; row<height; row++, n+=bytes_per_row) {
|
||||
for (m=n; m<n+bytes_per_row; m+=4) {
|
||||
*(bitmap+m) = *(image_data+m+2);
|
||||
*(bitmap+m+1) = *(image_data+m+1);
|
||||
*(bitmap+m+2) = *(image_data+m);
|
||||
*(bitmap+m+3) = *(image_data+m+3);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* ABGR */
|
||||
for (row=0, n=0; row<height; row++, n+=bytes_per_row) {
|
||||
for (m=n; m<n+bytes_per_row; m+=4) {
|
||||
*(bitmap+m) = *(image_data+m+3);
|
||||
*(bitmap+m+1) = *(image_data+m+2);
|
||||
*(bitmap+m+2) = *(image_data+m+1);
|
||||
*(bitmap+m+3) = *(image_data+m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data) {
|
||||
if (bitmap) {
|
||||
imagePtr = XCreateImage(display, NULL, depth, format, offset,
|
||||
data, width, height, bitmap_pad, bytes_per_line);
|
||||
|
||||
/*
|
||||
* Track Pixmap underlying the XImage in the unused obdata field
|
||||
* so that we can treat XImages coming from XGetImage specially.
|
||||
*/
|
||||
|
||||
imagePtr->obdata = (XPointer) pixmap;
|
||||
} else if (pixmap) {
|
||||
Tk_FreePixmap(display, pixmap);
|
||||
}
|
||||
if (!win) {
|
||||
XFreeGC(display, gc);
|
||||
(char*)bitmap, width, height, bitmap_pad, bytes_per_row);
|
||||
[ns_image removeRepresentation:bitmap_rep]; /*releases the rep*/
|
||||
[ns_image release];
|
||||
}
|
||||
} else {
|
||||
TkMacOSXDbgMsg("Invalid image format");
|
||||
TkMacOSXDbgMsg("Could not extract image from drawable.");
|
||||
}
|
||||
return imagePtr;
|
||||
}
|
||||
@@ -968,9 +1005,7 @@ DestroyImage(
|
||||
XImage *image)
|
||||
{
|
||||
if (image) {
|
||||
if (image->obdata) {
|
||||
Tk_FreePixmap((Display*) gMacDisplay, (Pixmap) image->obdata);
|
||||
} else if (image->data) {
|
||||
if (image->data) {
|
||||
ckfree(image->data);
|
||||
}
|
||||
ckfree((char*) image);
|
||||
|
||||
Reference in New Issue
Block a user