Mercurial > emacs
changeset 80547:06b5be2596c3
(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.
author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
---|---|
date | Fri, 02 May 2008 09:39:23 +0000 |
parents | 5eb403dc8e20 |
children | 7936a770db7a |
files | src/macterm.c |
diffstat | 1 files changed, 90 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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 }