diff options
author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> | 2008-05-02 09:39:23 +0000 |
---|---|---|
committer | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> | 2008-05-02 09:39:23 +0000 |
commit | b03daa516d099def94c68b22009a94e148b94969 (patch) | |
tree | 91c9d4c1c51dd9cb3c3b5a70b91ffe8fc5d2f942 | |
parent | f5d13fd80a641339af86e00ba518ea2d5a6367f2 (diff) | |
download | emacs-b03daa516d099def94c68b22009a94e148b94969.tar.gz emacs-b03daa516d099def94c68b22009a94e148b94969.tar.bz2 emacs-b03daa516d099def94c68b22009a94e148b94969.zip |
(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.
-rw-r--r-- | src/macterm.c | 91 |
1 files changed, 90 insertions, 1 deletions
diff --git a/src/macterm.c b/src/macterm.c index 1efa2667f15..0023c8988a0 100644 --- a/src/macterm.c +++ b/src/macterm.c @@ -316,7 +316,7 @@ extern void mac_flush_display_optional P_ ((struct frame *)); 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 @@ XDrawLine (display, p, gc, x1, y1, x2, y2) 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 @@ XDrawLine (display, p, gc, x1, y1, x2, y2) UnlockPixels (GetGWorldPixMap (p)); SetGWorld (old_port, old_gdh); +#endif } @@ -639,6 +678,17 @@ XCreatePixmap (display, w, width, height, depth) 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 @@ XCreatePixmap (display, w, width, height, depth) if (err != noErr) return NULL; return pixmap; +#endif } @@ -673,6 +724,34 @@ XCreatePixmapFromBitmapData (display, w, data, width, height, fg, bg, depth) { 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 @@ XCreatePixmapFromBitmapData (display, w, data, width, height, fg, bg, depth) #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 @@ XFreePixmap (display, pixmap) Display *display; Pixmap pixmap; { +#if USE_MAC_IMAGE_IO + if (pixmap) + { + if (pixmap->data) + xfree (pixmap->data); + xfree (pixmap); + } +#else DisposeGWorld (pixmap); +#endif } |