summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrea Corallo <akrl@sdf.org>2020-06-27 21:42:16 +0100
committerAndrea Corallo <akrl@sdf.org>2020-06-27 21:42:16 +0100
commit0eedb5af0b9f505dda9418323c74e992a40e5585 (patch)
tree9ef1315ecb577c36b062e8b3cb7a7c1bed6fd426 /src
parent24f68d6bfc83b5514d928853ffd86b97c53e1623 (diff)
parent118c07e02e939c9f52688091509d4bff2a897032 (diff)
downloademacs-0eedb5af0b9f505dda9418323c74e992a40e5585.tar.gz
emacs-0eedb5af0b9f505dda9418323c74e992a40e5585.tar.bz2
emacs-0eedb5af0b9f505dda9418323c74e992a40e5585.zip
Merge remote-tracking branch 'savannah/master' into HEAD
Diffstat (limited to 'src')
-rw-r--r--src/eval.c1
-rw-r--r--src/xdisp.c7
-rw-r--r--src/xfaces.c90
3 files changed, 54 insertions, 44 deletions
diff --git a/src/eval.c b/src/eval.c
index f2a85691b42..f9a1a28f004 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -840,6 +840,7 @@ usage: (defconst SYMBOL INITVALUE [DOCSTRING]) */)
Lisp_Object sym, tem;
sym = XCAR (args);
+ CHECK_SYMBOL (sym);
Lisp_Object docstring = Qnil;
if (!NILP (XCDR (XCDR (args))))
{
diff --git a/src/xdisp.c b/src/xdisp.c
index bd0711471a2..e454fd7b83f 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1871,9 +1871,10 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y,
top_x = it3.current_x - it3.pixel_width;
/* Account for line-number display, if IT3 still
didn't. This can happen if START - 1 is the
- first character on its display line. */
- if (!it3.line_number_produced_p
- && it.line_number_produced_p)
+ first or the last character on its display line. */
+ if (it3.lnum_pixel_width > 0)
+ top_x += it3.lnum_pixel_width;
+ else if (it.line_number_produced_p)
top_x += it.lnum_pixel_width;
/* Normally, we would exit the above loop because we
found the display element whose character
diff --git a/src/xfaces.c b/src/xfaces.c
index 308509a0267..c4a4e1c94f3 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -820,10 +820,10 @@ load_pixmap (struct frame *f, Lisp_Object name)
Color Handling
***********************************************************************/
-/* Parse hex color component at S ending right before E.
- Set *DST to the value normalized so that the maximum for the
- number of digits given becomes 65535, and return true on success,
- false otherwise. */
+/* Parse hex color component specification that starts at S and ends
+ right before E. Set *DST to the parsed value normalized so that
+ the maximum value for the number of hex digits given becomes 65535,
+ and return true on success, false otherwise. */
static bool
parse_hex_color_comp (const char *s, const char *e, unsigned short *dst)
{
@@ -849,8 +849,9 @@ parse_hex_color_comp (const char *s, const char *e, unsigned short *dst)
return true;
}
-/* Parse floating-point color component at S ending right before E.
- Return the number if in the range [0,1]; otherwise -1. */
+/* Parse floating-point color component specification that starts at S
+ and ends right before E. Return the parsed number if in the range
+ [0,1]; otherwise return -1. */
static double
parse_float_color_comp (const char *s, const char *e)
{
@@ -859,48 +860,54 @@ parse_float_color_comp (const char *s, const char *e)
return (end == e && x >= 0 && x <= 1) ? x : -1;
}
-/* Parse S as a numeric color specification and set *R, *G and *B.
+/* Parse SPEC as a numeric color specification and set *R, *G and *B.
Return true on success, false on failure.
- Recognized formats:
- "#RGB", with R, G and B hex strings of equal length, 1-4 digits each
- "rgb:R/G/B", with R, G and B hex strings, 1-4 digits each
- "rgbi:R/G/B", with R, G and B numbers in [0,1]
+ Recognized formats of SPEC:
- The result is normalized to a maximum value of 65535 per component. */
+ "#RGB", with R, G and B hex strings of equal length, 1-4 digits each.
+ "rgb:R/G/B", with R, G and B hex strings, 1-4 digits each.
+ "rgbi:R/G/B", with R, G and B numbers in [0,1].
+
+ If the function succeeds, it assigns to each of the components *R,
+ *G, and *B a value normalized to be in the [0, 65535] range. If
+ the function fails, some or all of the components remain unassigned. */
bool
-parse_color_spec (const char *s,
+parse_color_spec (const char *spec,
unsigned short *r, unsigned short *g, unsigned short *b)
{
- int len = strlen (s);
- if (s[0] == '#')
+ int len = strlen (spec);
+ if (spec[0] == '#')
{
if ((len - 1) % 3 == 0)
{
int n = (len - 1) / 3;
- return ( parse_hex_color_comp (s + 1 + 0 * n, s + 1 + 1 * n, r)
- && parse_hex_color_comp (s + 1 + 1 * n, s + 1 + 2 * n, g)
- && parse_hex_color_comp (s + 1 + 2 * n, s + 1 + 3 * n, b));
+ return ( parse_hex_color_comp (spec + 1 + 0 * n,
+ spec + 1 + 1 * n, r)
+ && parse_hex_color_comp (spec + 1 + 1 * n,
+ spec + 1 + 2 * n, g)
+ && parse_hex_color_comp (spec + 1 + 2 * n,
+ spec + 1 + 3 * n, b));
}
}
- else if (strncmp (s, "rgb:", 4) == 0)
+ else if (strncmp (spec, "rgb:", 4) == 0)
{
char *sep1, *sep2;
- return ((sep1 = strchr (s + 4, '/')) != NULL
+ return ((sep1 = strchr (spec + 4, '/')) != NULL
&& (sep2 = strchr (sep1 + 1, '/')) != NULL
- && parse_hex_color_comp (s + 4, sep1, r)
+ && parse_hex_color_comp (spec + 4, sep1, r)
&& parse_hex_color_comp (sep1 + 1, sep2, g)
- && parse_hex_color_comp (sep2 + 1, s + len, b));
+ && parse_hex_color_comp (sep2 + 1, spec + len, b));
}
- else if (strncmp (s, "rgbi:", 5) == 0)
+ else if (strncmp (spec, "rgbi:", 5) == 0)
{
char *sep1, *sep2;
double red, green, blue;
- if ((sep1 = strchr (s + 5, '/')) != NULL
+ if ((sep1 = strchr (spec + 5, '/')) != NULL
&& (sep2 = strchr (sep1 + 1, '/')) != NULL
- && (red = parse_float_color_comp (s + 5, sep1)) >= 0
+ && (red = parse_float_color_comp (spec + 5, sep1)) >= 0
&& (green = parse_float_color_comp (sep1 + 1, sep2)) >= 0
- && (blue = parse_float_color_comp (sep2 + 1, s + len)) >= 0)
+ && (blue = parse_float_color_comp (sep2 + 1, spec + len)) >= 0)
{
*r = lrint (red * 65535);
*g = lrint (green * 65535);
@@ -911,25 +918,26 @@ parse_color_spec (const char *s,
return false;
}
-DEFUN ("internal-color-values-from-color-spec",
- Finternal_color_values_from_color_spec,
- Sinternal_color_values_from_color_spec,
+DEFUN ("color-values-from-color-spec",
+ Fcolor_values_from_color_spec,
+ Scolor_values_from_color_spec,
1, 1, 0,
- doc: /* Parse STRING as a numeric color and return (RED GREEN BLUE).
-Recognised formats for STRING are:
+ doc: /* Parse color SPEC as a numeric color and return (RED GREEN BLUE).
+This function recognises the following formats for SPEC:
+
+ #RGB, where R, G and B are hex numbers of equal length, 1-4 digits each.
+ rgb:R/G/B, where R, G, and B are hex numbers, 1-4 digits each.
+ rgbi:R/G/B, where R, G and B are floating-point numbers in [0,1].
- #RGB, where R, G and B are hex numbers of equal length, 1-4 digits each
- rgb:R/G/B, where R, G, and B are hex numbers, 1-4 digits each
- rgbi:R/G/B, where R, G and B are floating-point numbers in [0,1]
+If SPEC is not in one of the above forms, return nil.
-The result is normalized to a maximum value of 65535 per component,
-forming a list of three integers in [0,65535].
-If STRING is not in one of the above forms, return nil. */)
- (Lisp_Object string)
+Each of the 3 integer members of the resulting list, RED, GREEN, and BLUE,
+is normalized to have its value in [0,65535]. */)
+ (Lisp_Object spec)
{
- CHECK_STRING (string);
+ CHECK_STRING (spec);
unsigned short r, g, b;
- return (parse_color_spec (SSDATA (string), &r, &g, &b)
+ return (parse_color_spec (SSDATA (spec), &r, &g, &b)
? list3i (r, g, b)
: Qnil);
}
@@ -7133,5 +7141,5 @@ clear the face cache, see `clear-face-cache'. */);
defsubr (&Sinternal_face_x_get_resource);
defsubr (&Sx_family_fonts);
#endif
- defsubr (&Sinternal_color_values_from_color_spec);
+ defsubr (&Scolor_values_from_color_spec);
}