# HG changeset patch # User YAMAMOTO Mitsuharu # Date 1209721163 0 # Node ID 06b5be2596c35836dd55706b1c25c01011b409f3 # Parent 5eb403dc8e2050b3f4592a5074f49c1447897893 (mac_cg_color_space_rgb) [USE_CG_DRAWING]: Make variable non-static. (XDrawLine, XCreatePixmap, XCreatePixmapFromBitmapData, XFreePixmap) [USE_MAC_IMAGE_IO]: Add implementations for Image I/O support. diff -r 5eb403dc8e20 -r 06b5be2596c3 src/macterm.c --- a/src/macterm.c Fri May 02 09:39:12 2008 +0000 +++ b/src/macterm.c Fri May 02 09:39:23 2008 +0000 @@ -316,7 +316,7 @@ static int max_fringe_bmp = 0; static CGImageRef *fringe_bmp = 0; -static CGColorSpaceRef mac_cg_color_space_rgb; +CGColorSpaceRef mac_cg_color_space_rgb; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 static CGColorRef mac_cg_color_black; #endif @@ -400,6 +400,44 @@ GC gc; int x1, y1, x2, y2; { +#if USE_MAC_IMAGE_IO + CGContextRef context; + XImagePtr ximg = p; + CGColorSpaceRef color_space; + CGImageAlphaInfo alpha_info; + CGFloat gx1 = x1, gy1 = y1, gx2 = x2, gy2 = y2; + + if (y1 != y2) + gx1 += 0.5f, gx2 += 0.5f; + if (x1 != x2) + gy1 += 0.5f, gy2 += 0.5f; + + if (ximg->bits_per_pixel == 32) + { + color_space = mac_cg_color_space_rgb; + alpha_info = kCGImageAlphaNoneSkipFirst; + } + else + { + color_space = NULL; + alpha_info = kCGImageAlphaOnly; + } + if (color_space == NULL) + return; + context = CGBitmapContextCreate (ximg->data, ximg->width, + ximg->height, 8, + ximg->bytes_per_line, color_space, + alpha_info); + if (ximg->bits_per_pixel == 32) + CG_SET_STROKE_COLOR_WITH_GC_FOREGROUND (context, gc); + else + CGContextSetGrayStrokeColor (context, gc->xgcv.foreground / 255.0f, 1.0); + CGContextMoveToPoint (context, gx1, gy1); + CGContextAddLineToPoint (context, gx2, gy2); + CGContextClosePath (context); + CGContextStrokePath (context); + CGContextRelease (context); +#else CGrafPtr old_port; GDHandle old_gdh; @@ -429,6 +467,7 @@ UnlockPixels (GetGWorldPixMap (p)); SetGWorld (old_port, old_gdh); +#endif } @@ -639,6 +678,17 @@ unsigned int width, height; unsigned int depth; { +#if USE_MAC_IMAGE_IO + XImagePtr ximg; + + ximg = xmalloc (sizeof (*ximg)); + ximg->width = width; + ximg->height = height; + ximg->bits_per_pixel = depth == 1 ? 8 : 32; + ximg->bytes_per_line = width * (ximg->bits_per_pixel / 8); + ximg->data = xmalloc (ximg->bytes_per_line * height); + return ximg; +#else Pixmap pixmap; Rect r; QDErr err; @@ -659,6 +709,7 @@ if (err != noErr) return NULL; return pixmap; +#endif } @@ -673,6 +724,34 @@ { Pixmap pixmap; BitMap bitmap; +#if USE_MAC_IMAGE_IO + CGDataProviderRef provider; + CGImageRef image_mask; + CGContextRef context; + + pixmap = XCreatePixmap (display, w, width, height, depth); + if (pixmap == NULL) + return NULL; + + mac_create_bitmap_from_bitmap_data (&bitmap, data, width, height); + provider = CGDataProviderCreateWithData (NULL, bitmap.baseAddr, + bitmap.rowBytes * height, NULL); + image_mask = CGImageMaskCreate (width, height, 1, 1, bitmap.rowBytes, + provider, NULL, 0); + CGDataProviderRelease (provider); + + context = CGBitmapContextCreate (pixmap->data, width, height, 8, + pixmap->bytes_per_line, + mac_cg_color_space_rgb, + kCGImageAlphaNoneSkipFirst); + + CG_SET_FILL_COLOR (context, fg); + CGContextFillRect (context, CGRectMake (0, 0, width, height)); + CG_SET_FILL_COLOR (context, bg); + CGContextDrawImage (context, CGRectMake (0, 0, width, height), image_mask); + CGContextRelease (context); + CGImageRelease (image_mask); +#else CGrafPtr old_port; GDHandle old_gdh; static GC gc = NULL; @@ -701,6 +780,7 @@ #endif /* not TARGET_API_MAC_CARBON */ UnlockPixels (GetGWorldPixMap (pixmap)); SetGWorld (old_port, old_gdh); +#endif mac_free_bitmap (&bitmap); return pixmap; @@ -712,7 +792,16 @@ Display *display; Pixmap pixmap; { +#if USE_MAC_IMAGE_IO + if (pixmap) + { + if (pixmap->data) + xfree (pixmap->data); + xfree (pixmap); + } +#else DisposeGWorld (pixmap); +#endif }