Mercurial > emacs
comparison src/xfns.c @ 28787:90e5b2abbd10
(Qcenter): New variable.
(enum image_value_type): Add IMAGE_ASCENT_VALUE.
(parse_image_spec): Handle IMAGE_ASCENT_VALUE.
(image_ascent): New function.
(lookup_image): Recognize `:ascent center'.
(xbm_format, xpm_format, pbm_format, png_format, jpeg_format)
(tiff_format, gif_format, gs_format): Use IMAGE_ASCENT_VALUE.
(xbm_load): Don't set image's ascent here.
(xbm_image_p, xpm_image_p, pbm_image_p, png_image_p)
(jpeg_image_p, tiff_image_p, gif_image_p, gs_image_p): Don't
check ascent values here.
(Fimagep, Flookup_image [GLYPH_DEBUG]: Removed.
(syms_of_xfns) [GLYPH_DEBUG]: Don't defsubr removed functions.
(syms_of_xfns): Initialize Qcenter.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Tue, 02 May 2000 20:03:32 +0000 |
parents | 6f90293e6ccb |
children | ee61d41ad789 |
comparison
equal
deleted
inserted
replaced
28786:e18bbe250122 | 28787:90e5b2abbd10 |
---|---|
234 Lisp_Object Qx_resource_name; | 234 Lisp_Object Qx_resource_name; |
235 Lisp_Object Quser_position; | 235 Lisp_Object Quser_position; |
236 Lisp_Object Quser_size; | 236 Lisp_Object Quser_size; |
237 extern Lisp_Object Qdisplay; | 237 extern Lisp_Object Qdisplay; |
238 Lisp_Object Qscroll_bar_foreground, Qscroll_bar_background; | 238 Lisp_Object Qscroll_bar_foreground, Qscroll_bar_background; |
239 Lisp_Object Qscreen_gamma, Qline_spacing; | 239 Lisp_Object Qscreen_gamma, Qline_spacing, Qcenter; |
240 | 240 |
241 /* The below are defined in frame.c. */ | 241 /* The below are defined in frame.c. */ |
242 | 242 |
243 extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth; | 243 extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth; |
244 extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate, Qtitle; | 244 extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate, Qtitle; |
5022 IMAGE_DONT_CHECK_VALUE_TYPE, | 5022 IMAGE_DONT_CHECK_VALUE_TYPE, |
5023 IMAGE_STRING_VALUE, | 5023 IMAGE_STRING_VALUE, |
5024 IMAGE_SYMBOL_VALUE, | 5024 IMAGE_SYMBOL_VALUE, |
5025 IMAGE_POSITIVE_INTEGER_VALUE, | 5025 IMAGE_POSITIVE_INTEGER_VALUE, |
5026 IMAGE_NON_NEGATIVE_INTEGER_VALUE, | 5026 IMAGE_NON_NEGATIVE_INTEGER_VALUE, |
5027 IMAGE_ASCENT_VALUE, | |
5027 IMAGE_INTEGER_VALUE, | 5028 IMAGE_INTEGER_VALUE, |
5028 IMAGE_FUNCTION_VALUE, | 5029 IMAGE_FUNCTION_VALUE, |
5029 IMAGE_NUMBER_VALUE, | 5030 IMAGE_NUMBER_VALUE, |
5030 IMAGE_BOOL_VALUE | 5031 IMAGE_BOOL_VALUE |
5031 }; | 5032 }; |
5124 case IMAGE_POSITIVE_INTEGER_VALUE: | 5125 case IMAGE_POSITIVE_INTEGER_VALUE: |
5125 if (!INTEGERP (value) || XINT (value) <= 0) | 5126 if (!INTEGERP (value) || XINT (value) <= 0) |
5126 return 0; | 5127 return 0; |
5127 break; | 5128 break; |
5128 | 5129 |
5130 case IMAGE_ASCENT_VALUE: | |
5131 if (SYMBOLP (value) && EQ (value, Qcenter)) | |
5132 break; | |
5133 else if (INTEGERP (value) | |
5134 && XINT (value) >= 0 | |
5135 && XINT (value) <= 100) | |
5136 break; | |
5137 return 0; | |
5138 | |
5129 case IMAGE_NON_NEGATIVE_INTEGER_VALUE: | 5139 case IMAGE_NON_NEGATIVE_INTEGER_VALUE: |
5130 if (!INTEGERP (value) || XINT (value) < 0) | 5140 if (!INTEGERP (value) || XINT (value) < 0) |
5131 return 0; | 5141 return 0; |
5132 break; | 5142 break; |
5133 | 5143 |
5285 type dependent loader function. */ | 5295 type dependent loader function. */ |
5286 if (img->pixmap == 0 && !img->load_failed_p) | 5296 if (img->pixmap == 0 && !img->load_failed_p) |
5287 img->load_failed_p = img->type->load (f, img) == 0; | 5297 img->load_failed_p = img->type->load (f, img) == 0; |
5288 } | 5298 } |
5289 | 5299 |
5300 | |
5301 /* Value is the number of pixels for the ascent of image IMG when | |
5302 drawn in face FACE. */ | |
5303 | |
5304 int | |
5305 image_ascent (img, face) | |
5306 struct image *img; | |
5307 struct face *face; | |
5308 { | |
5309 int height = img->height + img->margin; | |
5310 int ascent; | |
5311 | |
5312 if (img->ascent == CENTERED_IMAGE_ASCENT) | |
5313 { | |
5314 if (face->font) | |
5315 ascent = height / 2 - (face->font->descent - face->font->ascent) / 2; | |
5316 else | |
5317 ascent = height / 2; | |
5318 } | |
5319 else | |
5320 ascent = height * img->ascent / 100.0; | |
5321 | |
5322 return ascent; | |
5323 } | |
5324 | |
5290 | 5325 |
5291 | 5326 |
5292 /*********************************************************************** | 5327 /*********************************************************************** |
5293 Helper functions for X image types | 5328 Helper functions for X image types |
5294 ***********************************************************************/ | 5329 ***********************************************************************/ |
5538 ? XFASTINT (value) : DEFAULT_IMAGE_HEIGHT); | 5573 ? XFASTINT (value) : DEFAULT_IMAGE_HEIGHT); |
5539 } | 5574 } |
5540 else | 5575 else |
5541 { | 5576 { |
5542 /* Handle image type independent image attributes | 5577 /* Handle image type independent image attributes |
5543 `:ascent PERCENT', `:margin MARGIN', `:relief RELIEF'. */ | 5578 `:ascent ASCENT', `:margin MARGIN', `:relief RELIEF'. */ |
5544 Lisp_Object ascent, margin, relief, algorithm, heuristic_mask; | 5579 Lisp_Object ascent, margin, relief, algorithm, heuristic_mask; |
5545 Lisp_Object file; | 5580 Lisp_Object file; |
5546 | 5581 |
5547 ascent = image_spec_value (spec, QCascent, NULL); | 5582 ascent = image_spec_value (spec, QCascent, NULL); |
5548 if (INTEGERP (ascent)) | 5583 if (INTEGERP (ascent)) |
5549 img->ascent = XFASTINT (ascent); | 5584 img->ascent = XFASTINT (ascent); |
5585 else if (EQ (ascent, Qcenter)) | |
5586 img->ascent = CENTERED_IMAGE_ASCENT; | |
5550 | 5587 |
5551 margin = image_spec_value (spec, QCmargin, NULL); | 5588 margin = image_spec_value (spec, QCmargin, NULL); |
5552 if (INTEGERP (margin) && XINT (margin) >= 0) | 5589 if (INTEGERP (margin) && XINT (margin) >= 0) |
5553 img->margin = XFASTINT (margin); | 5590 img->margin = XFASTINT (margin); |
5554 | 5591 |
5853 {":width", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 5890 {":width", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
5854 {":height", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 5891 {":height", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
5855 {":data", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 5892 {":data", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
5856 {":foreground", IMAGE_STRING_VALUE, 0}, | 5893 {":foreground", IMAGE_STRING_VALUE, 0}, |
5857 {":background", IMAGE_STRING_VALUE, 0}, | 5894 {":background", IMAGE_STRING_VALUE, 0}, |
5858 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 5895 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
5859 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 5896 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
5860 {":relief", IMAGE_INTEGER_VALUE, 0}, | 5897 {":relief", IMAGE_INTEGER_VALUE, 0}, |
5861 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 5898 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
5862 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} | 5899 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} |
5863 }; | 5900 }; |
5993 } | 6030 } |
5994 else | 6031 else |
5995 return 0; | 6032 return 0; |
5996 } | 6033 } |
5997 | 6034 |
5998 /* Baseline must be a value between 0 and 100 (a percentage). */ | |
5999 if (kw[XBM_ASCENT].count | |
6000 && XFASTINT (kw[XBM_ASCENT].value) > 100) | |
6001 return 0; | |
6002 | |
6003 return 1; | 6035 return 1; |
6004 } | 6036 } |
6005 | 6037 |
6006 | 6038 |
6007 /* Scan a bitmap file. FP is the stream to read from. Value is | 6039 /* Scan a bitmap file. FP is the stream to read from. Value is |
6381 xassert (img->width > 0 && img->height > 0); | 6413 xassert (img->width > 0 && img->height > 0); |
6382 } | 6414 } |
6383 | 6415 |
6384 BLOCK_INPUT; | 6416 BLOCK_INPUT; |
6385 | 6417 |
6386 if (fmt[XBM_ASCENT].count) | |
6387 img->ascent = XFASTINT (fmt[XBM_ASCENT].value); | |
6388 | |
6389 /* Get foreground and background colors, maybe allocate colors. */ | 6418 /* Get foreground and background colors, maybe allocate colors. */ |
6390 if (fmt[XBM_FOREGROUND].count) | 6419 if (fmt[XBM_FOREGROUND].count) |
6391 foreground = x_alloc_image_color (f, img, fmt[XBM_FOREGROUND].value, | 6420 foreground = x_alloc_image_color (f, img, fmt[XBM_FOREGROUND].value, |
6392 foreground); | 6421 foreground); |
6393 if (fmt[XBM_BACKGROUND].count) | 6422 if (fmt[XBM_BACKGROUND].count) |
6486 static struct image_keyword xpm_format[XPM_LAST] = | 6515 static struct image_keyword xpm_format[XPM_LAST] = |
6487 { | 6516 { |
6488 {":type", IMAGE_SYMBOL_VALUE, 1}, | 6517 {":type", IMAGE_SYMBOL_VALUE, 1}, |
6489 {":file", IMAGE_STRING_VALUE, 0}, | 6518 {":file", IMAGE_STRING_VALUE, 0}, |
6490 {":data", IMAGE_STRING_VALUE, 0}, | 6519 {":data", IMAGE_STRING_VALUE, 0}, |
6491 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 6520 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
6492 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 6521 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
6493 {":relief", IMAGE_INTEGER_VALUE, 0}, | 6522 {":relief", IMAGE_INTEGER_VALUE, 0}, |
6494 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 6523 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
6495 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 6524 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
6496 {":color-symbols", IMAGE_DONT_CHECK_VALUE_TYPE, 0} | 6525 {":color-symbols", IMAGE_DONT_CHECK_VALUE_TYPE, 0} |
6542 /* Either `:file' or `:data' must be present. */ | 6571 /* Either `:file' or `:data' must be present. */ |
6543 && fmt[XPM_FILE].count + fmt[XPM_DATA].count == 1 | 6572 && fmt[XPM_FILE].count + fmt[XPM_DATA].count == 1 |
6544 /* Either no `:color-symbols' or it's a list of conses | 6573 /* Either no `:color-symbols' or it's a list of conses |
6545 whose car and cdr are strings. */ | 6574 whose car and cdr are strings. */ |
6546 && (fmt[XPM_COLOR_SYMBOLS].count == 0 | 6575 && (fmt[XPM_COLOR_SYMBOLS].count == 0 |
6547 || xpm_valid_color_symbols_p (fmt[XPM_COLOR_SYMBOLS].value)) | 6576 || xpm_valid_color_symbols_p (fmt[XPM_COLOR_SYMBOLS].value))); |
6548 && (fmt[XPM_ASCENT].count == 0 | |
6549 || XFASTINT (fmt[XPM_ASCENT].value) < 100)); | |
6550 } | 6577 } |
6551 | 6578 |
6552 | 6579 |
6553 /* Load image IMG which will be displayed on frame F. Value is | 6580 /* Load image IMG which will be displayed on frame F. Value is |
6554 non-zero if successful. */ | 6581 non-zero if successful. */ |
7185 static struct image_keyword pbm_format[PBM_LAST] = | 7212 static struct image_keyword pbm_format[PBM_LAST] = |
7186 { | 7213 { |
7187 {":type", IMAGE_SYMBOL_VALUE, 1}, | 7214 {":type", IMAGE_SYMBOL_VALUE, 1}, |
7188 {":file", IMAGE_STRING_VALUE, 0}, | 7215 {":file", IMAGE_STRING_VALUE, 0}, |
7189 {":data", IMAGE_STRING_VALUE, 0}, | 7216 {":data", IMAGE_STRING_VALUE, 0}, |
7190 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 7217 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
7191 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 7218 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
7192 {":relief", IMAGE_INTEGER_VALUE, 0}, | 7219 {":relief", IMAGE_INTEGER_VALUE, 0}, |
7193 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 7220 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
7194 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} | 7221 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} |
7195 }; | 7222 }; |
7214 { | 7241 { |
7215 struct image_keyword fmt[PBM_LAST]; | 7242 struct image_keyword fmt[PBM_LAST]; |
7216 | 7243 |
7217 bcopy (pbm_format, fmt, sizeof fmt); | 7244 bcopy (pbm_format, fmt, sizeof fmt); |
7218 | 7245 |
7219 if (!parse_image_spec (object, fmt, PBM_LAST, Qpbm) | 7246 if (!parse_image_spec (object, fmt, PBM_LAST, Qpbm)) |
7220 || (fmt[PBM_ASCENT].count | |
7221 && XFASTINT (fmt[PBM_ASCENT].value) > 100)) | |
7222 return 0; | 7247 return 0; |
7223 | 7248 |
7224 /* Must specify either :data or :file. */ | 7249 /* Must specify either :data or :file. */ |
7225 return fmt[PBM_DATA].count + fmt[PBM_FILE].count == 1; | 7250 return fmt[PBM_DATA].count + fmt[PBM_FILE].count == 1; |
7226 } | 7251 } |
7505 static struct image_keyword png_format[PNG_LAST] = | 7530 static struct image_keyword png_format[PNG_LAST] = |
7506 { | 7531 { |
7507 {":type", IMAGE_SYMBOL_VALUE, 1}, | 7532 {":type", IMAGE_SYMBOL_VALUE, 1}, |
7508 {":data", IMAGE_STRING_VALUE, 0}, | 7533 {":data", IMAGE_STRING_VALUE, 0}, |
7509 {":file", IMAGE_STRING_VALUE, 0}, | 7534 {":file", IMAGE_STRING_VALUE, 0}, |
7510 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 7535 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
7511 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 7536 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
7512 {":relief", IMAGE_INTEGER_VALUE, 0}, | 7537 {":relief", IMAGE_INTEGER_VALUE, 0}, |
7513 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 7538 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
7514 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} | 7539 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} |
7515 }; | 7540 }; |
7533 Lisp_Object object; | 7558 Lisp_Object object; |
7534 { | 7559 { |
7535 struct image_keyword fmt[PNG_LAST]; | 7560 struct image_keyword fmt[PNG_LAST]; |
7536 bcopy (png_format, fmt, sizeof fmt); | 7561 bcopy (png_format, fmt, sizeof fmt); |
7537 | 7562 |
7538 if (!parse_image_spec (object, fmt, PNG_LAST, Qpng) | 7563 if (!parse_image_spec (object, fmt, PNG_LAST, Qpng)) |
7539 || (fmt[PNG_ASCENT].count | |
7540 && XFASTINT (fmt[PNG_ASCENT].value) > 100)) | |
7541 return 0; | 7564 return 0; |
7542 | 7565 |
7543 /* Must specify either the :data or :file keyword. */ | 7566 /* Must specify either the :data or :file keyword. */ |
7544 return fmt[PNG_FILE].count + fmt[PNG_DATA].count == 1; | 7567 return fmt[PNG_FILE].count + fmt[PNG_DATA].count == 1; |
7545 } | 7568 } |
7991 static struct image_keyword jpeg_format[JPEG_LAST] = | 8014 static struct image_keyword jpeg_format[JPEG_LAST] = |
7992 { | 8015 { |
7993 {":type", IMAGE_SYMBOL_VALUE, 1}, | 8016 {":type", IMAGE_SYMBOL_VALUE, 1}, |
7994 {":data", IMAGE_STRING_VALUE, 0}, | 8017 {":data", IMAGE_STRING_VALUE, 0}, |
7995 {":file", IMAGE_STRING_VALUE, 0}, | 8018 {":file", IMAGE_STRING_VALUE, 0}, |
7996 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 8019 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
7997 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 8020 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
7998 {":relief", IMAGE_INTEGER_VALUE, 0}, | 8021 {":relief", IMAGE_INTEGER_VALUE, 0}, |
7999 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 8022 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
8000 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} | 8023 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} |
8001 }; | 8024 }; |
8020 { | 8043 { |
8021 struct image_keyword fmt[JPEG_LAST]; | 8044 struct image_keyword fmt[JPEG_LAST]; |
8022 | 8045 |
8023 bcopy (jpeg_format, fmt, sizeof fmt); | 8046 bcopy (jpeg_format, fmt, sizeof fmt); |
8024 | 8047 |
8025 if (!parse_image_spec (object, fmt, JPEG_LAST, Qjpeg) | 8048 if (!parse_image_spec (object, fmt, JPEG_LAST, Qjpeg)) |
8026 || (fmt[JPEG_ASCENT].count | |
8027 && XFASTINT (fmt[JPEG_ASCENT].value) > 100)) | |
8028 return 0; | 8049 return 0; |
8029 | 8050 |
8030 /* Must specify either the :data or :file keyword. */ | 8051 /* Must specify either the :data or :file keyword. */ |
8031 return fmt[JPEG_FILE].count + fmt[JPEG_DATA].count == 1; | 8052 return fmt[JPEG_FILE].count + fmt[JPEG_DATA].count == 1; |
8032 } | 8053 } |
8355 static struct image_keyword tiff_format[TIFF_LAST] = | 8376 static struct image_keyword tiff_format[TIFF_LAST] = |
8356 { | 8377 { |
8357 {":type", IMAGE_SYMBOL_VALUE, 1}, | 8378 {":type", IMAGE_SYMBOL_VALUE, 1}, |
8358 {":data", IMAGE_STRING_VALUE, 0}, | 8379 {":data", IMAGE_STRING_VALUE, 0}, |
8359 {":file", IMAGE_STRING_VALUE, 0}, | 8380 {":file", IMAGE_STRING_VALUE, 0}, |
8360 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 8381 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
8361 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 8382 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
8362 {":relief", IMAGE_INTEGER_VALUE, 0}, | 8383 {":relief", IMAGE_INTEGER_VALUE, 0}, |
8363 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 8384 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
8364 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} | 8385 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} |
8365 }; | 8386 }; |
8383 Lisp_Object object; | 8404 Lisp_Object object; |
8384 { | 8405 { |
8385 struct image_keyword fmt[TIFF_LAST]; | 8406 struct image_keyword fmt[TIFF_LAST]; |
8386 bcopy (tiff_format, fmt, sizeof fmt); | 8407 bcopy (tiff_format, fmt, sizeof fmt); |
8387 | 8408 |
8388 if (!parse_image_spec (object, fmt, TIFF_LAST, Qtiff) | 8409 if (!parse_image_spec (object, fmt, TIFF_LAST, Qtiff)) |
8389 || (fmt[TIFF_ASCENT].count | |
8390 && XFASTINT (fmt[TIFF_ASCENT].value) > 100)) | |
8391 return 0; | 8410 return 0; |
8392 | 8411 |
8393 /* Must specify either the :data or :file keyword. */ | 8412 /* Must specify either the :data or :file keyword. */ |
8394 return fmt[TIFF_FILE].count + fmt[TIFF_DATA].count == 1; | 8413 return fmt[TIFF_FILE].count + fmt[TIFF_DATA].count == 1; |
8395 } | 8414 } |
8682 static struct image_keyword gif_format[GIF_LAST] = | 8701 static struct image_keyword gif_format[GIF_LAST] = |
8683 { | 8702 { |
8684 {":type", IMAGE_SYMBOL_VALUE, 1}, | 8703 {":type", IMAGE_SYMBOL_VALUE, 1}, |
8685 {":data", IMAGE_STRING_VALUE, 0}, | 8704 {":data", IMAGE_STRING_VALUE, 0}, |
8686 {":file", IMAGE_STRING_VALUE, 0}, | 8705 {":file", IMAGE_STRING_VALUE, 0}, |
8687 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 8706 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
8688 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 8707 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
8689 {":relief", IMAGE_INTEGER_VALUE, 0}, | 8708 {":relief", IMAGE_INTEGER_VALUE, 0}, |
8690 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 8709 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
8691 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 8710 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
8692 {":image", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0} | 8711 {":image", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0} |
8711 Lisp_Object object; | 8730 Lisp_Object object; |
8712 { | 8731 { |
8713 struct image_keyword fmt[GIF_LAST]; | 8732 struct image_keyword fmt[GIF_LAST]; |
8714 bcopy (gif_format, fmt, sizeof fmt); | 8733 bcopy (gif_format, fmt, sizeof fmt); |
8715 | 8734 |
8716 if (!parse_image_spec (object, fmt, GIF_LAST, Qgif) | 8735 if (!parse_image_spec (object, fmt, GIF_LAST, Qgif)) |
8717 || (fmt[GIF_ASCENT].count | |
8718 && XFASTINT (fmt[GIF_ASCENT].value) > 100)) | |
8719 return 0; | 8736 return 0; |
8720 | 8737 |
8721 /* Must specify either the :data or :file keyword. */ | 8738 /* Must specify either the :data or :file keyword. */ |
8722 return fmt[GIF_FILE].count + fmt[GIF_DATA].count == 1; | 8739 return fmt[GIF_FILE].count + fmt[GIF_DATA].count == 1; |
8723 } | 8740 } |
8999 {":pt-width", IMAGE_POSITIVE_INTEGER_VALUE, 1}, | 9016 {":pt-width", IMAGE_POSITIVE_INTEGER_VALUE, 1}, |
9000 {":pt-height", IMAGE_POSITIVE_INTEGER_VALUE, 1}, | 9017 {":pt-height", IMAGE_POSITIVE_INTEGER_VALUE, 1}, |
9001 {":file", IMAGE_STRING_VALUE, 1}, | 9018 {":file", IMAGE_STRING_VALUE, 1}, |
9002 {":loader", IMAGE_FUNCTION_VALUE, 0}, | 9019 {":loader", IMAGE_FUNCTION_VALUE, 0}, |
9003 {":bounding-box", IMAGE_DONT_CHECK_VALUE_TYPE, 1}, | 9020 {":bounding-box", IMAGE_DONT_CHECK_VALUE_TYPE, 1}, |
9004 {":ascent", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0}, | 9021 {":ascent", IMAGE_ASCENT_VALUE, 0}, |
9005 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, | 9022 {":margin", IMAGE_POSITIVE_INTEGER_VALUE, 0}, |
9006 {":relief", IMAGE_INTEGER_VALUE, 0}, | 9023 {":relief", IMAGE_INTEGER_VALUE, 0}, |
9007 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, | 9024 {":algorithm", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, |
9008 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} | 9025 {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0} |
9009 }; | 9026 }; |
9044 Lisp_Object tem; | 9061 Lisp_Object tem; |
9045 int i; | 9062 int i; |
9046 | 9063 |
9047 bcopy (gs_format, fmt, sizeof fmt); | 9064 bcopy (gs_format, fmt, sizeof fmt); |
9048 | 9065 |
9049 if (!parse_image_spec (object, fmt, GS_LAST, Qpostscript) | 9066 if (!parse_image_spec (object, fmt, GS_LAST, Qpostscript)) |
9050 || (fmt[GS_ASCENT].count | |
9051 && XFASTINT (fmt[GS_ASCENT].value) > 100)) | |
9052 return 0; | 9067 return 0; |
9053 | 9068 |
9054 /* Bounding box must be a list or vector containing 4 integers. */ | 9069 /* Bounding box must be a list or vector containing 4 integers. */ |
9055 tem = fmt[GS_BOUNDING_BOX].value; | 9070 tem = fmt[GS_BOUNDING_BOX].value; |
9056 if (CONSP (tem)) | 9071 if (CONSP (tem)) |
10089 | 10104 |
10090 return unbind_to (count, file); | 10105 return unbind_to (count, file); |
10091 } | 10106 } |
10092 | 10107 |
10093 #endif /* USE_MOTIF */ | 10108 #endif /* USE_MOTIF */ |
10094 | |
10095 | |
10096 /*********************************************************************** | |
10097 Tests | |
10098 ***********************************************************************/ | |
10099 | |
10100 #if GLYPH_DEBUG | |
10101 | |
10102 DEFUN ("imagep", Fimagep, Simagep, 1, 1, 0, | |
10103 "Value is non-nil if SPEC is a valid image specification.") | |
10104 (spec) | |
10105 Lisp_Object spec; | |
10106 { | |
10107 return valid_image_p (spec) ? Qt : Qnil; | |
10108 } | |
10109 | |
10110 | |
10111 DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0, "") | |
10112 (spec) | |
10113 Lisp_Object spec; | |
10114 { | |
10115 int id = -1; | |
10116 | |
10117 if (valid_image_p (spec)) | |
10118 id = lookup_image (SELECTED_FRAME (), spec); | |
10119 | |
10120 debug_print (spec); | |
10121 return make_number (id); | |
10122 } | |
10123 | |
10124 #endif /* GLYPH_DEBUG != 0 */ | |
10125 | 10109 |
10126 | 10110 |
10127 | 10111 |
10128 /*********************************************************************** | 10112 /*********************************************************************** |
10129 Initialization | 10113 Initialization |
10204 staticpro (&Qscroll_bar_background); | 10188 staticpro (&Qscroll_bar_background); |
10205 Qscreen_gamma = intern ("screen-gamma"); | 10189 Qscreen_gamma = intern ("screen-gamma"); |
10206 staticpro (&Qscreen_gamma); | 10190 staticpro (&Qscreen_gamma); |
10207 Qline_spacing = intern ("line-spacing"); | 10191 Qline_spacing = intern ("line-spacing"); |
10208 staticpro (&Qline_spacing); | 10192 staticpro (&Qline_spacing); |
10193 Qcenter = intern ("center"); | |
10194 staticpro (&Qcenter); | |
10209 /* This is the end of symbol initialization. */ | 10195 /* This is the end of symbol initialization. */ |
10210 | 10196 |
10211 /* Text property `display' should be nonsticky by default. */ | 10197 /* Text property `display' should be nonsticky by default. */ |
10212 Vtext_property_default_nonsticky | 10198 Vtext_property_default_nonsticky |
10213 = Fcons (Fcons (Qdisplay, Qt), Vtext_property_default_nonsticky); | 10199 = Fcons (Fcons (Qdisplay, Qt), Vtext_property_default_nonsticky); |
10441 staticpro (&Qpng); | 10427 staticpro (&Qpng); |
10442 #endif | 10428 #endif |
10443 | 10429 |
10444 defsubr (&Sclear_image_cache); | 10430 defsubr (&Sclear_image_cache); |
10445 | 10431 |
10446 #if GLYPH_DEBUG | |
10447 defsubr (&Simagep); | |
10448 defsubr (&Slookup_image); | |
10449 #endif | |
10450 | |
10451 busy_cursor_atimer = NULL; | 10432 busy_cursor_atimer = NULL; |
10452 busy_cursor_shown_p = 0; | 10433 busy_cursor_shown_p = 0; |
10453 | 10434 |
10454 defsubr (&Sx_show_tip); | 10435 defsubr (&Sx_show_tip); |
10455 defsubr (&Sx_hide_tip); | 10436 defsubr (&Sx_hide_tip); |