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);