comparison src/image.c @ 80545:d4410031dce7

(PIX_MASK_DRAW, PIX_MASK_RETAIN) [USE_MAC_IMAGE_IO]: New definitions for Image I/O support. (XGetImage, XPutPixel, XGetPixel, XDestroyImage) (mac_create_cg_image_from_image, x_create_x_image_and_pixmap) [USE_MAC_IMAGE_IO]: Add implementations for Image I/O support. (mac_data_provider_release_data, image_load_image_io) [USE_MAC_IMAGE_IO]: New functions. (CGImageCreateWithPNGDataProviderProcType) [MAC_OSX]: Remove typedef. (MyCGImageCreateWithPNGDataProvider) [MAC_OSX]: Remove variable. (init_image_func_pointer) [MAC_OSX]: Remove function. (image_load_quartz2d) [MAC_OSX]: Check availability of CGImageCreateWithPNGDataProvider at compile time. Use lowercase `false' for boolean constant. (png_load, jpeg_load, tiff_load, gif_load) [USE_MAC_IMAGE_IO]: Use image_load_image_io. (png_load) [!USE_MAC_IMAGE_IO && MAC_OSX]: Don't check MyCGImageCreateWithPNGDataProvider. (init_image) [MAC_OSX && TARGET_API_MAC_CARBON]: Don't call init_image_func_pointer.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Fri, 02 May 2008 09:39:01 +0000
parents 296f5c781a2b
children 831994031d63
comparison
equal deleted inserted replaced
80544:39cd9edb6ed7 80545:d4410031dce7
113 #define GET_PIXEL(ximg, x, y) XGetPixel(ximg, x, y) 113 #define GET_PIXEL(ximg, x, y) XGetPixel(ximg, x, y)
114 #define NO_PIXMAP 0 114 #define NO_PIXMAP 0
115 115
116 #define RGB_PIXEL_COLOR unsigned long 116 #define RGB_PIXEL_COLOR unsigned long
117 117
118 #if USE_MAC_IMAGE_IO
119 #define PIX_MASK_DRAW 255
120 #define PIX_MASK_RETAIN 0
121 #else
118 /* A black pixel in a mask bitmap/pixmap means ``draw a source 122 /* A black pixel in a mask bitmap/pixmap means ``draw a source
119 pixel''. A white pixel means ``retain the current pixel''. */ 123 pixel''. A white pixel means ``retain the current pixel''. */
120 #define PIX_MASK_DRAW RGB_TO_ULONG(0,0,0) 124 #define PIX_MASK_DRAW RGB_TO_ULONG(0,0,0)
121 #define PIX_MASK_RETAIN RGB_TO_ULONG(255,255,255) 125 #define PIX_MASK_RETAIN RGB_TO_ULONG(255,255,255)
126 #endif
122 127
123 #define FRAME_X_VISUAL(f) FRAME_X_DISPLAY_INFO (f)->visual 128 #define FRAME_X_VISUAL(f) FRAME_X_DISPLAY_INFO (f)->visual
124 #define x_defined_color mac_defined_color 129 #define x_defined_color mac_defined_color
125 #define DefaultDepthOfScreen(screen) (one_mac_display_info.n_planes) 130 #define DefaultDepthOfScreen(screen) (one_mac_display_info.n_planes)
126 131
164 int x, y; /* not used */ 169 int x, y; /* not used */
165 unsigned int width, height; /* not used */ 170 unsigned int width, height; /* not used */
166 unsigned long plane_mask; /* not used */ 171 unsigned long plane_mask; /* not used */
167 int format; /* not used */ 172 int format; /* not used */
168 { 173 {
174 #if !USE_MAC_IMAGE_IO
169 #if GLYPH_DEBUG 175 #if GLYPH_DEBUG
170 xassert (x == 0 && y == 0); 176 xassert (x == 0 && y == 0);
171 { 177 {
172 Rect ri, rp; 178 Rect ri, rp;
173 SetRect (&ri, 0, 0, width, height); 179 SetRect (&ri, 0, 0, width, height);
175 } 181 }
176 xassert (! (pixelsLocked & GetPixelsState (GetGWorldPixMap (pixmap)))); 182 xassert (! (pixelsLocked & GetPixelsState (GetGWorldPixMap (pixmap))));
177 #endif 183 #endif
178 184
179 LockPixels (GetGWorldPixMap (pixmap)); 185 LockPixels (GetGWorldPixMap (pixmap));
186 #endif
180 187
181 return pixmap; 188 return pixmap;
182 } 189 }
183 190
184 static void 191 static void
185 XPutPixel (ximage, x, y, pixel) 192 XPutPixel (ximage, x, y, pixel)
186 XImagePtr ximage; 193 XImagePtr ximage;
187 int x, y; 194 int x, y;
188 unsigned long pixel; 195 unsigned long pixel;
189 { 196 {
197 #if USE_MAC_IMAGE_IO
198 if (ximage->bits_per_pixel == 32)
199 ((unsigned int *)(ximage->data + y * ximage->bytes_per_line))[x] = pixel;
200 else
201 ((unsigned char *)(ximage->data + y * ximage->bytes_per_line))[x] = pixel;
202 #else
190 PixMapHandle pixmap = GetGWorldPixMap (ximage); 203 PixMapHandle pixmap = GetGWorldPixMap (ximage);
191 short depth = GetPixDepth (pixmap); 204 short depth = GetPixDepth (pixmap);
192 205
193 #if defined (WORDS_BIG_ENDIAN) || !USE_CG_DRAWING 206 #if defined (WORDS_BIG_ENDIAN) || !USE_CG_DRAWING
194 if (depth == 32) 207 if (depth == 32)
225 238
226 SetCPixel (x, y, &color); 239 SetCPixel (x, y, &color);
227 240
228 SetGWorld (old_port, old_gdh); 241 SetGWorld (old_port, old_gdh);
229 } 242 }
243 #endif
230 } 244 }
231 245
232 static unsigned long 246 static unsigned long
233 XGetPixel (ximage, x, y) 247 XGetPixel (ximage, x, y)
234 XImagePtr ximage; 248 XImagePtr ximage;
235 int x, y; 249 int x, y;
236 { 250 {
251 #if USE_MAC_IMAGE_IO
252 if (ximage->bits_per_pixel == 32)
253 return ((unsigned int *)(ximage->data + y * ximage->bytes_per_line))[x];
254 else
255 return ((unsigned char *)(ximage->data + y * ximage->bytes_per_line))[x];
256 #else
237 PixMapHandle pixmap = GetGWorldPixMap (ximage); 257 PixMapHandle pixmap = GetGWorldPixMap (ximage);
238 short depth = GetPixDepth (pixmap); 258 short depth = GetPixDepth (pixmap);
239 259
240 #if defined (WORDS_BIG_ENDIAN) || !USE_CG_DRAWING 260 #if defined (WORDS_BIG_ENDIAN) || !USE_CG_DRAWING
241 if (depth == 32) 261 if (depth == 32)
269 GetCPixel (x, y, &color); 289 GetCPixel (x, y, &color);
270 290
271 SetGWorld (old_port, old_gdh); 291 SetGWorld (old_port, old_gdh);
272 return RGB_TO_ULONG (color.red >> 8, color.green >> 8, color.blue >> 8); 292 return RGB_TO_ULONG (color.red >> 8, color.green >> 8, color.blue >> 8);
273 } 293 }
294 #endif
274 } 295 }
275 296
276 static void 297 static void
277 XDestroyImage (ximg) 298 XDestroyImage (ximg)
278 XImagePtr ximg; 299 XImagePtr ximg;
279 { 300 {
301 #if !USE_MAC_IMAGE_IO
280 UnlockPixels (GetGWorldPixMap (ximg)); 302 UnlockPixels (GetGWorldPixMap (ximg));
303 #endif
281 } 304 }
282 305
283 #if USE_CG_DRAWING 306 #if USE_CG_DRAWING
307 #if USE_MAC_IMAGE_IO
308 void
309 mac_data_provider_release_data (info, data, size)
310 void *info;
311 const void *data;
312 size_t size;
313 {
314 xfree ((void *)data);
315 }
316 #endif
317
284 static CGImageRef 318 static CGImageRef
285 mac_create_cg_image_from_image (f, img) 319 mac_create_cg_image_from_image (f, img)
286 struct frame *f; 320 struct frame *f;
287 struct image *img; 321 struct image *img;
288 { 322 {
323 #if USE_MAC_IMAGE_IO
324 XImagePtr ximg = img->pixmap;
325 CGDataProviderRef provider;
326 CGImageRef result;
327
328 if (img->mask)
329 {
330 int x, y;
331 unsigned long color, alpha;
332
333 for (y = 0; y < ximg->height; y++)
334 for (x = 0; x < ximg->width; x++)
335 {
336 color = XGetPixel (ximg, x, y);
337 alpha = XGetPixel (img->mask, x, y);
338 XPutPixel (ximg, x, y,
339 ARGB_TO_ULONG (alpha,
340 RED_FROM_ULONG (color)
341 * alpha / PIX_MASK_DRAW,
342 GREEN_FROM_ULONG (color)
343 * alpha / PIX_MASK_DRAW,
344 BLUE_FROM_ULONG (color)
345 * alpha / PIX_MASK_DRAW));
346 }
347 xfree (img->mask->data);
348 img->mask->data = NULL;
349 }
350 BLOCK_INPUT;
351 provider = CGDataProviderCreateWithData (NULL, ximg->data,
352 ximg->bytes_per_line * ximg->height,
353 mac_data_provider_release_data);
354 ximg->data = NULL;
355 result = CGImageCreate (ximg->width, ximg->height, 8, 32,
356 ximg->bytes_per_line, mac_cg_color_space_rgb,
357 (img->mask ? kCGImageAlphaPremultipliedFirst
358 : kCGImageAlphaNoneSkipFirst)
359 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1040
360 | kCGBitmapByteOrder32Host
361 #endif
362 , provider, NULL, 0, kCGRenderingIntentDefault);
363 CGDataProviderRelease (provider);
364 UNBLOCK_INPUT;
365
366 return result;
367 #else
289 Pixmap mask; 368 Pixmap mask;
290 CGImageRef result = NULL; 369 CGImageRef result = NULL;
291 370
292 BLOCK_INPUT; 371 BLOCK_INPUT;
293 if (img->mask) 372 if (img->mask)
318 XFreePixmap (FRAME_X_DISPLAY (f), mask); 397 XFreePixmap (FRAME_X_DISPLAY (f), mask);
319 } 398 }
320 UNBLOCK_INPUT; 399 UNBLOCK_INPUT;
321 400
322 return result; 401 return result;
402 #endif
323 } 403 }
324 #endif /* USE_CG_DRAWING */ 404 #endif /* USE_CG_DRAWING */
325 #endif /* MAC_OS */ 405 #endif /* MAC_OS */
326 406
327 407
2278 *ximg = NULL; 2358 *ximg = NULL;
2279 image_error ("Unable to create X pixmap", Qnil, Qnil); 2359 image_error ("Unable to create X pixmap", Qnil, Qnil);
2280 return 0; 2360 return 0;
2281 } 2361 }
2282 2362
2363 #if !USE_MAC_IMAGE_IO
2283 LockPixels (GetGWorldPixMap (*pixmap)); 2364 LockPixels (GetGWorldPixMap (*pixmap));
2365 #endif
2284 *ximg = *pixmap; 2366 *ximg = *pixmap;
2285 return 1; 2367 return 1;
2286 2368
2287 #endif /* MAC_OS */ 2369 #endif /* MAC_OS */
2288 } 2370 }
2427 2509
2428 /*********************************************************************** 2510 /***********************************************************************
2429 MAC Image Load Functions 2511 MAC Image Load Functions
2430 ***********************************************************************/ 2512 ***********************************************************************/
2431 2513
2514 #if USE_MAC_IMAGE_IO
2515 static int
2516 image_load_image_io (f, img, type)
2517 struct frame *f;
2518 struct image *img;
2519 CFStringRef type;
2520 {
2521 CFDictionaryRef options, src_props = NULL, props = NULL;
2522 CFStringRef keys[2];
2523 CFTypeRef values[2];
2524 Lisp_Object specified_file, specified_data;
2525 CGImageSourceRef source = NULL;
2526 size_t count;
2527 CGImageRef image = NULL;
2528 int loop_count = -1;
2529 double delay_time = -1.0;
2530 int width, height;
2531 XImagePtr ximg = NULL;
2532 CGContextRef context;
2533 CGRect rectangle;
2534 int has_alpha_p, gif_p;
2535
2536 gif_p = UTTypeEqual (type, kUTTypeGIF);
2537
2538 keys[0] = kCGImageSourceTypeIdentifierHint;
2539 values[0] = (CFTypeRef) type;
2540 keys[1] = kCGImageSourceShouldCache;
2541 values[1] = (CFTypeRef) kCFBooleanFalse;
2542 options = CFDictionaryCreate (NULL, (const void **) keys,
2543 (const void **) values,
2544 sizeof (keys) / sizeof (keys[0]),
2545 &kCFTypeDictionaryKeyCallBacks,
2546 &kCFTypeDictionaryValueCallBacks);
2547 if (options == NULL)
2548 {
2549 image_error ("Error creating options for image `%s'", img->spec, Qnil);
2550 return 0;
2551 }
2552
2553 /* Open the file. */
2554 specified_file = image_spec_value (img->spec, QCfile, NULL);
2555 specified_data = image_spec_value (img->spec, QCdata, NULL);
2556
2557 if (NILP (specified_data))
2558 {
2559 Lisp_Object file;
2560 CFStringRef path;
2561 CFURLRef url;
2562
2563 file = x_find_image_file (specified_file);
2564 if (!STRINGP (file))
2565 {
2566 image_error ("Cannot find image file `%s'", specified_file, Qnil);
2567 return 0;
2568 }
2569 path = cfstring_create_with_utf8_cstring (SDATA (file));
2570 if (path)
2571 {
2572 url = CFURLCreateWithFileSystemPath (NULL, path,
2573 kCFURLPOSIXPathStyle, 0);
2574 CFRelease (path);
2575 if (url)
2576 {
2577 source = CGImageSourceCreateWithURL (url, NULL);
2578 CFRelease (url);
2579 }
2580 }
2581 }
2582 else
2583 {
2584 CFDataRef data = CFDataCreate (NULL, SDATA (specified_data),
2585 SBYTES (specified_data));
2586
2587 if (data)
2588 {
2589 source = CGImageSourceCreateWithData (data, options);
2590 CFRelease (data);
2591 }
2592 }
2593 CFRelease (options);
2594
2595 if (source)
2596 {
2597 CFStringRef real_type = CGImageSourceGetType (source);
2598
2599 if (real_type && UTTypeEqual (type, real_type))
2600 src_props = CGImageSourceCopyProperties (source, NULL);
2601 if (src_props)
2602 {
2603 EMACS_INT ino = 0;
2604
2605 count = CGImageSourceGetCount (source);
2606 if (gif_p)
2607 {
2608 Lisp_Object image = image_spec_value (img->spec, QCindex, NULL);
2609
2610 if (INTEGERP (image))
2611 ino = XFASTINT (image);
2612 }
2613 if (ino >= 0 && ino < count)
2614 {
2615 props = CGImageSourceCopyPropertiesAtIndex (source, ino, NULL);
2616 if (props)
2617 image = CGImageSourceCreateImageAtIndex (source, ino, NULL);
2618 }
2619 }
2620 CFRelease (source);
2621 }
2622
2623 if (image == NULL)
2624 {
2625 if (src_props)
2626 CFRelease (src_props);
2627 if (props)
2628 CFRelease (props);
2629 image_error ("Error reading image `%s'", img->spec, Qnil);
2630 return 0;
2631 }
2632 else
2633 {
2634 CFBooleanRef boolean;
2635
2636 if (CFDictionaryGetValueIfPresent (props, kCGImagePropertyHasAlpha,
2637 (const void **) &boolean))
2638 has_alpha_p = CFBooleanGetValue (boolean);
2639 if (gif_p)
2640 {
2641 CFDictionaryRef dict;
2642 CFNumberRef number;
2643
2644 dict = CFDictionaryGetValue (src_props,
2645 kCGImagePropertyGIFDictionary);
2646 if (dict
2647 && CFDictionaryGetValueIfPresent (dict,
2648 kCGImagePropertyGIFLoopCount,
2649 (const void **) &number))
2650 CFNumberGetValue (number, kCFNumberIntType, &loop_count);
2651
2652 dict = CFDictionaryGetValue (props, kCGImagePropertyGIFDictionary);
2653 if (dict
2654 && CFDictionaryGetValueIfPresent (dict,
2655 kCGImagePropertyGIFDelayTime,
2656 (const void **) &number))
2657 CFNumberGetValue (number, kCFNumberDoubleType, &delay_time);
2658 }
2659 CFRelease (src_props);
2660 CFRelease (props);
2661 }
2662
2663 width = img->width = CGImageGetWidth (image);
2664 height = img->height = CGImageGetHeight (image);
2665
2666 if (!check_image_size (f, width, height))
2667 {
2668 CGImageRelease (image);
2669 image_error ("Invalid image size", Qnil, Qnil);
2670 return 0;
2671 }
2672
2673 if (!x_create_x_image_and_pixmap (f, width, height, 0, &ximg, &img->pixmap))
2674 {
2675 CGImageRelease (image);
2676 image_error ("Out of memory (%s)", img->spec, Qnil);
2677 return 0;
2678 }
2679 rectangle = CGRectMake (0, 0, width, height);
2680
2681 context = CGBitmapContextCreate (ximg->data, ximg->width, ximg->height, 8,
2682 ximg->bytes_per_line,
2683 mac_cg_color_space_rgb,
2684 kCGImageAlphaNoneSkipFirst);
2685 if (has_alpha_p)
2686 {
2687 Lisp_Object specified_bg;
2688 XColor color;
2689
2690 specified_bg = image_spec_value (img->spec, QCbackground, NULL);
2691 if (!STRINGP (specified_bg)
2692 || !mac_defined_color (f, SDATA (specified_bg), &color, 0))
2693 {
2694 color.pixel = FRAME_BACKGROUND_PIXEL (f);
2695 color.red = RED16_FROM_ULONG (color.pixel);
2696 color.green = GREEN16_FROM_ULONG (color.pixel);
2697 color.blue = BLUE16_FROM_ULONG (color.pixel);
2698 }
2699 CGContextSetRGBFillColor (context, color.red / 65535.0,
2700 color.green / 65535.0,
2701 color.blue / 65535.0, 1.0);
2702 CGContextFillRect (context, rectangle);
2703 }
2704 CGContextDrawImage (context, rectangle, image);
2705 CGContextRelease (context);
2706 CGImageRelease (image);
2707
2708 /* Save GIF image extension data for `image-extension-data'.
2709 Format is (count IMAGES
2710 0xff "NETSCAPE2.0" 0x00 DATA_SUB_BLOCK_FOR_LOOP_COUNT
2711 0xf9 GRAPHIC_CONTROL_EXTENSION_BLOCK). */
2712 if (gif_p)
2713 {
2714 img->data.lisp_val = Qnil;
2715 if (delay_time >= 0)
2716 {
2717 Lisp_Object gce = make_uninit_string (4);
2718 int centisec = delay_time * 100.0 + 0.5;
2719
2720 /* Fill the delay time field. */
2721 SSET (gce, 1, centisec & 0xff);
2722 SSET (gce, 2, (centisec >> 8) & 0xff);
2723 /* We don't know about other fields. */
2724 SSET (gce, 0, 0);
2725 SSET (gce, 3, 0);
2726 img->data.lisp_val = Fcons (make_number (0xf9),
2727 Fcons (gce,
2728 img->data.lisp_val));
2729 }
2730 if (loop_count >= 0)
2731 {
2732 Lisp_Object data_sub_block = make_uninit_string (3);
2733
2734 SSET (data_sub_block, 0, 0x01);
2735 SSET (data_sub_block, 1, loop_count & 0xff);
2736 SSET (data_sub_block, 2, (loop_count >> 8) & 0xff);
2737 img->data.lisp_val = Fcons (make_number (0),
2738 Fcons (data_sub_block,
2739 img->data.lisp_val));
2740 img->data.lisp_val = Fcons (make_number (0xff),
2741 Fcons (build_string ("NETSCAPE2.0"),
2742 img->data.lisp_val));
2743 }
2744 if (count > 1)
2745 img->data.lisp_val = Fcons (Qcount,
2746 Fcons (make_number (count),
2747 img->data.lisp_val));
2748 }
2749
2750 /* Maybe fill in the background field while we have ximg handy. */
2751 if (NILP (image_spec_value (img->spec, QCbackground, NULL)))
2752 IMAGE_BACKGROUND (img, f, ximg);
2753
2754 /* Put the image into the pixmap. */
2755 x_put_x_image (f, ximg, img->pixmap, width, height);
2756 x_destroy_x_image (ximg);
2757 return 1;
2758 }
2759 #else /* !USE_MAC_IMAGE_IO */
2432 static int image_load_quicktime P_ ((struct frame *, struct image *img, 2760 static int image_load_quicktime P_ ((struct frame *, struct image *img,
2433 OSType)); 2761 OSType));
2434 #ifdef MAC_OSX 2762 #ifdef MAC_OSX
2435 static int image_load_quartz2d P_ ((struct frame *, struct image *img, int)); 2763 static int image_load_quartz2d P_ ((struct frame *, struct image *img, int));
2436 #endif 2764 #endif
2639 } 2967 }
2640 } 2968 }
2641 2969
2642 2970
2643 #ifdef MAC_OSX 2971 #ifdef MAC_OSX
2644 /* Load a PNG/JPEG image using Quartz 2D decoding routines.
2645 CGImageCreateWithPNGDataProvider is provided after Mac OS X 10.2.
2646 So don't use this function directly but determine at runtime
2647 whether it exists. */
2648 typedef CGImageRef (*CGImageCreateWithPNGDataProviderProcType)
2649 (CGDataProviderRef, const float [], bool, CGColorRenderingIntent);
2650 static CGImageCreateWithPNGDataProviderProcType MyCGImageCreateWithPNGDataProvider;
2651
2652
2653 static void
2654 init_image_func_pointer ()
2655 {
2656 if (NSIsSymbolNameDefined ("_CGImageCreateWithPNGDataProvider"))
2657 {
2658 MyCGImageCreateWithPNGDataProvider
2659 = (CGImageCreateWithPNGDataProviderProcType)
2660 NSAddressOfSymbol (NSLookupAndBindSymbol
2661 ("_CGImageCreateWithPNGDataProvider"));
2662 }
2663 else
2664 MyCGImageCreateWithPNGDataProvider = NULL;
2665 }
2666
2667
2668 static int 2972 static int
2669 image_load_quartz2d (f, img, png_p) 2973 image_load_quartz2d (f, img, png_p)
2670 struct frame *f; 2974 struct frame *f;
2671 struct image *img; 2975 struct image *img;
2672 int png_p; 2976 int png_p;
2710 } 3014 }
2711 else 3015 else
2712 source = CGDataProviderCreateWithData (NULL, SDATA (specified_data), 3016 source = CGDataProviderCreateWithData (NULL, SDATA (specified_data),
2713 SBYTES (specified_data), NULL); 3017 SBYTES (specified_data), NULL);
2714 3018
3019 #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
2715 if (png_p) 3020 if (png_p)
2716 image = (*MyCGImageCreateWithPNGDataProvider) (source, NULL, FALSE, 3021 image = CGImageCreateWithPNGDataProvider (source, NULL, false,
2717 kCGRenderingIntentDefault); 3022 kCGRenderingIntentDefault);
2718 else 3023 else
2719 image = CGImageCreateWithJPEGDataProvider (source, NULL, FALSE, 3024 #endif
3025 image = CGImageCreateWithJPEGDataProvider (source, NULL, false,
2720 kCGRenderingIntentDefault); 3026 kCGRenderingIntentDefault);
2721 3027
2722 CGDataProviderRelease (source); 3028 CGDataProviderRelease (source);
2723 if (image == NULL) 3029 if (image == NULL)
2724 { 3030 {
2778 x_destroy_x_image (ximg); 3084 x_destroy_x_image (ximg);
2779 UNGCPRO; 3085 UNGCPRO;
2780 return 1; 3086 return 1;
2781 } 3087 }
2782 #endif 3088 #endif
3089 #endif /* !USE_MAC_IMAGE_IO */
2783 3090
2784 #endif /* MAC_OS */ 3091 #endif /* MAC_OS */
2785 3092
2786 3093
2787 /*********************************************************************** 3094 /***********************************************************************
4248 /* gnus-pointer.xpm uses '-' in its identifier. 4555 /* gnus-pointer.xpm uses '-' in its identifier.
4249 sb-dir-plus.xpm uses '+' in its identifier. */ 4556 sb-dir-plus.xpm uses '+' in its identifier. */
4250 if (isalpha (c) || c == '_' || c == '-' || c == '+') 4557 if (isalpha (c) || c == '_' || c == '-' || c == '+')
4251 { 4558 {
4252 *beg = *s - 1; 4559 *beg = *s - 1;
4253 while (*s < end && 4560 while (*s < end
4254 (c = **s, isalnum (c) || c == '_' || c == '-' || c == '+')) 4561 && (c = **s, isalnum (c) || c == '_' || c == '-' || c == '+'))
4255 ++*s; 4562 ++*s;
4256 *len = *s - *beg; 4563 *len = *s - *beg;
4257 return XPM_TK_IDENT; 4564 return XPM_TK_IDENT;
4258 } 4565 }
4259 else if (c == '"') 4566 else if (c == '"')
6595 static int 6902 static int
6596 png_load (f, img) 6903 png_load (f, img)
6597 struct frame *f; 6904 struct frame *f;
6598 struct image *img; 6905 struct image *img;
6599 { 6906 {
6600 #ifdef MAC_OSX 6907 #if USE_MAC_IMAGE_IO
6601 if (MyCGImageCreateWithPNGDataProvider) 6908 return image_load_image_io (f, img, kUTTypePNG);
6602 return image_load_quartz2d (f, img, 1); 6909 #elif MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
6603 else 6910 return image_load_quartz2d (f, img, 1);
6911 #else
6912 return image_load_quicktime (f, img, kQTFileTypePNG);
6604 #endif 6913 #endif
6605 return image_load_quicktime (f, img, kQTFileTypePNG);
6606 } 6914 }
6607 #endif /* MAC_OS */ 6915 #endif /* MAC_OS */
6608 6916
6609 #endif /* !HAVE_PNG */ 6917 #endif /* !HAVE_PNG */
6610 6918
7173 static int 7481 static int
7174 jpeg_load (f, img) 7482 jpeg_load (f, img)
7175 struct frame *f; 7483 struct frame *f;
7176 struct image *img; 7484 struct image *img;
7177 { 7485 {
7178 #ifdef MAC_OSX 7486 #if USE_MAC_IMAGE_IO
7487 return image_load_image_io (f, img, kUTTypeJPEG);
7488 #elif defined (MAC_OSX)
7179 return image_load_quartz2d (f, img, 0); 7489 return image_load_quartz2d (f, img, 0);
7180 #else 7490 #else
7181 return image_load_quicktime (f, img, kQTFileTypeJPEG); 7491 return image_load_quicktime (f, img, kQTFileTypeJPEG);
7182 #endif 7492 #endif
7183 } 7493 }
7598 static int 7908 static int
7599 tiff_load (f, img) 7909 tiff_load (f, img)
7600 struct frame *f; 7910 struct frame *f;
7601 struct image *img; 7911 struct image *img;
7602 { 7912 {
7913 #if USE_MAC_IMAGE_IO
7914 return image_load_image_io (f, img, kUTTypeTIFF);
7915 #else
7603 return image_load_quicktime (f, img, kQTFileTypeTIFF); 7916 return image_load_quicktime (f, img, kQTFileTypeTIFF);
7917 #endif
7604 } 7918 }
7605 #endif /* MAC_OS */ 7919 #endif /* MAC_OS */
7606 7920
7607 #endif /* !HAVE_TIFF */ 7921 #endif /* !HAVE_TIFF */
7608 7922
8034 static int 8348 static int
8035 gif_load (f, img) 8349 gif_load (f, img)
8036 struct frame *f; 8350 struct frame *f;
8037 struct image *img; 8351 struct image *img;
8038 { 8352 {
8353 #if USE_MAC_IMAGE_IO
8354 return image_load_image_io (f, img, kUTTypeGIF);
8355 #else /* !USE_MAC_IMAGE_IO */
8039 Lisp_Object specified_file, file; 8356 Lisp_Object specified_file, file;
8040 Lisp_Object specified_data; 8357 Lisp_Object specified_data;
8041 OSErr err; 8358 OSErr err;
8042 Boolean graphic_p, movie_p, prefer_graphic_p; 8359 Boolean graphic_p, movie_p, prefer_graphic_p;
8043 Handle dh = NULL; 8360 Handle dh = NULL;
8162 goto error; 8479 goto error;
8163 } 8480 }
8164 time_scale = GetMediaTimeScale (media); 8481 time_scale = GetMediaTimeScale (media);
8165 8482
8166 specified_bg = image_spec_value (img->spec, QCbackground, NULL); 8483 specified_bg = image_spec_value (img->spec, QCbackground, NULL);
8167 if (!STRINGP (specified_bg) || 8484 if (!STRINGP (specified_bg)
8168 !mac_defined_color (f, SDATA (specified_bg), &color, 0)) 8485 || !mac_defined_color (f, SDATA (specified_bg), &color, 0))
8169 { 8486 {
8170 color.pixel = FRAME_BACKGROUND_PIXEL (f); 8487 color.pixel = FRAME_BACKGROUND_PIXEL (f);
8171 color.red = RED16_FROM_ULONG (color.pixel); 8488 color.red = RED16_FROM_ULONG (color.pixel);
8172 color.green = GREEN16_FROM_ULONG (color.pixel); 8489 color.green = GREEN16_FROM_ULONG (color.pixel);
8173 color.blue = BLUE16_FROM_ULONG (color.pixel); 8490 color.blue = BLUE16_FROM_ULONG (color.pixel);
8232 if (movie) 8549 if (movie)
8233 DisposeMovie (movie); 8550 DisposeMovie (movie);
8234 if (dh) 8551 if (dh)
8235 DisposeHandle (dh); 8552 DisposeHandle (dh);
8236 return 0; 8553 return 0;
8554 #endif /* !USE_MAC_IMAGE_IO */
8237 } 8555 }
8238 #endif /* MAC_OS */ 8556 #endif /* MAC_OS */
8239 8557
8240 #endif /* HAVE_GIF */ 8558 #endif /* HAVE_GIF */
8241 8559
8805 } 9123 }
8806 9124
8807 void 9125 void
8808 init_image () 9126 init_image ()
8809 { 9127 {
8810 #if defined (MAC_OSX) && TARGET_API_MAC_CARBON
8811 init_image_func_pointer ();
8812 #endif
8813 } 9128 }
8814 9129
8815 /* arch-tag: 123c2a5e-14a8-4c53-ab95-af47d7db49b9 9130 /* arch-tag: 123c2a5e-14a8-4c53-ab95-af47d7db49b9
8816 (do not change this comment) */ 9131 (do not change this comment) */