aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Moellmann2000-05-02 20:03:32 +0000
committerGerd Moellmann2000-05-02 20:03:32 +0000
commit7c7ff7f5d18ebe74842db645eb6ff4b63e778f0b (patch)
treeb9d492ccd2bdff0b8bf53e55826cc9adb536f9ca
parentbdda7eb03333d00ba96f29d52cef712b38c3fcb1 (diff)
downloademacs-7c7ff7f5d18ebe74842db645eb6ff4b63e778f0b.tar.gz
emacs-7c7ff7f5d18ebe74842db645eb6ff4b63e778f0b.zip
(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.
-rw-r--r--src/xfns.c131
1 files changed, 56 insertions, 75 deletions
diff --git a/src/xfns.c b/src/xfns.c
index be2f63c32c1..7c991d28265 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -236,7 +236,7 @@ Lisp_Object Quser_position;
236Lisp_Object Quser_size; 236Lisp_Object Quser_size;
237extern Lisp_Object Qdisplay; 237extern Lisp_Object Qdisplay;
238Lisp_Object Qscroll_bar_foreground, Qscroll_bar_background; 238Lisp_Object Qscroll_bar_foreground, Qscroll_bar_background;
239Lisp_Object Qscreen_gamma, Qline_spacing; 239Lisp_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
@@ -5024,6 +5024,7 @@ enum image_value_type
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,
@@ -5126,6 +5127,15 @@ parse_image_spec (spec, keywords, nkeywords, type)
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;
@@ -5288,6 +5298,31 @@ prepare_image_for_display (f, img)
5288} 5298}
5289 5299
5290 5300
5301/* Value is the number of pixels for the ascent of image IMG when
5302 drawn in face FACE. */
5303
5304int
5305image_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
5325
5291 5326
5292/*********************************************************************** 5327/***********************************************************************
5293 Helper functions for X image types 5328 Helper functions for X image types
@@ -5540,13 +5575,15 @@ lookup_image (f, spec)
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)
@@ -5855,7 +5892,7 @@ static struct image_keyword xbm_format[XBM_LAST] =
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},
@@ -5995,11 +6032,6 @@ xbm_image_p (object)
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
@@ -6383,9 +6415,6 @@ xbm_load (f, img)
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,
@@ -6488,7 +6517,7 @@ static struct image_keyword xpm_format[XPM_LAST] =
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},
@@ -6544,9 +6573,7 @@ xpm_image_p (object)
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
@@ -7187,7 +7214,7 @@ static struct image_keyword pbm_format[PBM_LAST] =
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},
@@ -7216,9 +7243,7 @@ pbm_image_p (object)
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. */
@@ -7507,7 +7532,7 @@ static struct image_keyword png_format[PNG_LAST] =
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},
@@ -7535,9 +7560,7 @@ png_image_p (object)
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. */
@@ -7993,7 +8016,7 @@ static struct image_keyword jpeg_format[JPEG_LAST] =
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},
@@ -8022,9 +8045,7 @@ jpeg_image_p (object)
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. */
@@ -8357,7 +8378,7 @@ static struct image_keyword tiff_format[TIFF_LAST] =
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},
@@ -8385,9 +8406,7 @@ tiff_image_p (object)
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. */
@@ -8684,7 +8703,7 @@ static struct image_keyword gif_format[GIF_LAST] =
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},
@@ -8713,9 +8732,7 @@ gif_image_p (object)
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. */
@@ -9001,7 +9018,7 @@ static struct image_keyword gs_format[GS_LAST] =
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},
@@ -9046,9 +9063,7 @@ gs_image_p (object)
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. */
@@ -10092,37 +10107,6 @@ selection dialog's entry field, if MUSTMATCH is non-nil.")
10092 10107
10093#endif /* USE_MOTIF */ 10108#endif /* USE_MOTIF */
10094 10109
10095
10096/***********************************************************************
10097 Tests
10098 ***********************************************************************/
10099
10100#if GLYPH_DEBUG
10101
10102DEFUN ("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
10111DEFUN ("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
10126 10110
10127 10111
10128/*********************************************************************** 10112/***********************************************************************
@@ -10206,6 +10190,8 @@ syms_of_xfns ()
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. */
@@ -10443,11 +10429,6 @@ Each element of the list is a symbol for a supported image type.");
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