Commit 57326d99 authored by Kim F. Storm's avatar Kim F. Storm
Browse files

(x_draw_relief_rect): Add top_p and bot_p args.

(x_draw_glyph_string_box): Fix call to x_draw_relief_rect.
(x_draw_image_foreground, x_draw_image_relief)
(x_draw_image_foreground_1, x_draw_image_glyph_string):
Draw sliced images.
parent e893970b
...@@ -981,7 +981,8 @@ static void x_draw_image_foreground_1 P_ ((struct glyph_string *, Pixmap)); ...@@ -981,7 +981,8 @@ static void x_draw_image_foreground_1 P_ ((struct glyph_string *, Pixmap));
static void x_clear_glyph_string_rect P_ ((struct glyph_string *, int, static void x_clear_glyph_string_rect P_ ((struct glyph_string *, int,
int, int, int)); int, int, int));
static void x_draw_relief_rect P_ ((struct frame *, int, int, int, int, static void x_draw_relief_rect P_ ((struct frame *, int, int, int, int,
int, int, int, int, XRectangle *)); int, int, int, int, int, int,
XRectangle *));
static void x_draw_box_rect P_ ((struct glyph_string *, int, int, int, int, static void x_draw_box_rect P_ ((struct glyph_string *, int, int, int, int,
int, int, int, XRectangle *)); int, int, int, XRectangle *));
...@@ -2019,9 +2020,10 @@ x_setup_relief_colors (s) ...@@ -2019,9 +2020,10 @@ x_setup_relief_colors (s)
static void static void
x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width, x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width,
raised_p, left_p, right_p, clip_rect) raised_p, top_p, bot_p, left_p, right_p, clip_rect)
struct frame *f; struct frame *f;
int left_x, top_y, right_x, bottom_y, width, left_p, right_p, raised_p; int left_x, top_y, right_x, bottom_y, width;
int top_p, bot_p, left_p, right_p, raised_p;
XRectangle *clip_rect; XRectangle *clip_rect;
{ {
Display *dpy = FRAME_X_DISPLAY (f); Display *dpy = FRAME_X_DISPLAY (f);
...@@ -2036,10 +2038,11 @@ x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width, ...@@ -2036,10 +2038,11 @@ x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width,
XSetClipRectangles (dpy, gc, 0, 0, clip_rect, 1, Unsorted); XSetClipRectangles (dpy, gc, 0, 0, clip_rect, 1, Unsorted);
/* Top. */ /* Top. */
for (i = 0; i < width; ++i) if (top_p)
XDrawLine (dpy, window, gc, for (i = 0; i < width; ++i)
left_x + i * left_p, top_y + i, XDrawLine (dpy, window, gc,
right_x + 1 - i * right_p, top_y + i); left_x + i * left_p, top_y + i,
right_x + 1 - i * right_p, top_y + i);
/* Left. */ /* Left. */
if (left_p) if (left_p)
...@@ -2055,10 +2058,11 @@ x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width, ...@@ -2055,10 +2058,11 @@ x_draw_relief_rect (f, left_x, top_y, right_x, bottom_y, width,
XSetClipRectangles (dpy, gc, 0, 0, clip_rect, 1, Unsorted); XSetClipRectangles (dpy, gc, 0, 0, clip_rect, 1, Unsorted);
/* Bottom. */ /* Bottom. */
for (i = 0; i < width; ++i) if (bot_p)
XDrawLine (dpy, window, gc, for (i = 0; i < width; ++i)
left_x + i * left_p, bottom_y - i, XDrawLine (dpy, window, gc,
right_x + 1 - i * right_p, bottom_y - i); left_x + i * left_p, bottom_y - i,
right_x + 1 - i * right_p, bottom_y - i);
/* Right. */ /* Right. */
if (right_p) if (right_p)
...@@ -2166,7 +2170,7 @@ x_draw_glyph_string_box (s) ...@@ -2166,7 +2170,7 @@ x_draw_glyph_string_box (s)
{ {
x_setup_relief_colors (s); x_setup_relief_colors (s);
x_draw_relief_rect (s->f, left_x, top_y, right_x, bottom_y, x_draw_relief_rect (s->f, left_x, top_y, right_x, bottom_y,
width, raised_p, left_p, right_p, &clip_rect); width, raised_p, 1, 1, left_p, right_p, &clip_rect);
} }
} }
...@@ -2177,21 +2181,22 @@ static void ...@@ -2177,21 +2181,22 @@ static void
x_draw_image_foreground (s) x_draw_image_foreground (s)
struct glyph_string *s; struct glyph_string *s;
{ {
int x; int x = s->x;
int y = s->ybase - image_ascent (s->img, s->face); int y = s->ybase - image_ascent (s->img, s->face, &s->slice);
/* If first glyph of S has a left box line, start drawing it to the /* If first glyph of S has a left box line, start drawing it to the
right of that line. */ right of that line. */
if (s->face->box != FACE_NO_BOX if (s->face->box != FACE_NO_BOX
&& s->first_glyph->left_box_line_p) && s->first_glyph->left_box_line_p
x = s->x + abs (s->face->box_line_width); && s->slice.x == 0)
else x += abs (s->face->box_line_width);
x = s->x;
/* If there is a margin around the image, adjust x- and y-position /* If there is a margin around the image, adjust x- and y-position
by that margin. */ by that margin. */
x += s->img->hmargin; if (s->slice.x == 0)
y += s->img->vmargin; x += s->img->hmargin;
if (s->slice.y == 0)
y += s->img->vmargin;
if (s->img->pixmap) if (s->img->pixmap)
{ {
...@@ -2216,11 +2221,12 @@ x_draw_image_foreground (s) ...@@ -2216,11 +2221,12 @@ x_draw_image_foreground (s)
get_glyph_string_clip_rect (s, &clip_rect); get_glyph_string_clip_rect (s, &clip_rect);
image_rect.x = x; image_rect.x = x;
image_rect.y = y; image_rect.y = y;
image_rect.width = s->img->width; image_rect.width = s->slice.width;
image_rect.height = s->img->height; image_rect.height = s->slice.height;
if (x_intersect_rectangles (&clip_rect, &image_rect, &r)) if (x_intersect_rectangles (&clip_rect, &image_rect, &r))
XCopyArea (s->display, s->img->pixmap, s->window, s->gc, XCopyArea (s->display, s->img->pixmap, s->window, s->gc,
r.x - x, r.y - y, r.width, r.height, r.x, r.y); s->slice.x + r.x - x, s->slice.y + r.y - y,
r.width, r.height, r.x, r.y);
} }
else else
{ {
...@@ -2229,11 +2235,12 @@ x_draw_image_foreground (s) ...@@ -2229,11 +2235,12 @@ x_draw_image_foreground (s)
get_glyph_string_clip_rect (s, &clip_rect); get_glyph_string_clip_rect (s, &clip_rect);
image_rect.x = x; image_rect.x = x;
image_rect.y = y; image_rect.y = y;
image_rect.width = s->img->width; image_rect.width = s->slice.width;
image_rect.height = s->img->height; image_rect.height = s->slice.height;
if (x_intersect_rectangles (&clip_rect, &image_rect, &r)) if (x_intersect_rectangles (&clip_rect, &image_rect, &r))
XCopyArea (s->display, s->img->pixmap, s->window, s->gc, XCopyArea (s->display, s->img->pixmap, s->window, s->gc,
r.x - x, r.y - y, r.width, r.height, r.x, r.y); s->slice.x + r.x - x, s->slice.y + r.y - y,
r.width, r.height, r.x, r.y);
/* When the image has a mask, we can expect that at /* When the image has a mask, we can expect that at
least part of a mouse highlight or a block cursor will least part of a mouse highlight or a block cursor will
...@@ -2245,15 +2252,17 @@ x_draw_image_foreground (s) ...@@ -2245,15 +2252,17 @@ x_draw_image_foreground (s)
{ {
int r = s->img->relief; int r = s->img->relief;
if (r < 0) r = -r; if (r < 0) r = -r;
XDrawRectangle (s->display, s->window, s->gc, x - r, y - r, XDrawRectangle (s->display, s->window, s->gc,
s->img->width + r*2 - 1, s->img->height + r*2 - 1); x - r, y - r,
s->slice.width + r*2 - 1,
s->slice.height + r*2 - 1);
} }
} }
} }
else else
/* Draw a rectangle if image could not be loaded. */ /* Draw a rectangle if image could not be loaded. */
XDrawRectangle (s->display, s->window, s->gc, x, y, XDrawRectangle (s->display, s->window, s->gc, x, y,
s->img->width - 1, s->img->height - 1); s->slice.width - 1, s->slice.height - 1);
} }
...@@ -2265,21 +2274,22 @@ x_draw_image_relief (s) ...@@ -2265,21 +2274,22 @@ x_draw_image_relief (s)
{ {
int x0, y0, x1, y1, thick, raised_p; int x0, y0, x1, y1, thick, raised_p;
XRectangle r; XRectangle r;
int x; int x = s->x;
int y = s->ybase - image_ascent (s->img, s->face); int y = s->ybase - image_ascent (s->img, s->face, &s->slice);
/* If first glyph of S has a left box line, start drawing it to the /* If first glyph of S has a left box line, start drawing it to the
right of that line. */ right of that line. */
if (s->face->box != FACE_NO_BOX if (s->face->box != FACE_NO_BOX
&& s->first_glyph->left_box_line_p) && s->first_glyph->left_box_line_p
x = s->x + abs (s->face->box_line_width); && s->slice.x == 0)
else x += abs (s->face->box_line_width);
x = s->x;
/* If there is a margin around the image, adjust x- and y-position /* If there is a margin around the image, adjust x- and y-position
by that margin. */ by that margin. */
x += s->img->hmargin; if (s->slice.x == 0)
y += s->img->vmargin; x += s->img->hmargin;
if (s->slice.y == 0)
y += s->img->vmargin;
if (s->hl == DRAW_IMAGE_SUNKEN if (s->hl == DRAW_IMAGE_SUNKEN
|| s->hl == DRAW_IMAGE_RAISED) || s->hl == DRAW_IMAGE_RAISED)
...@@ -2295,12 +2305,17 @@ x_draw_image_relief (s) ...@@ -2295,12 +2305,17 @@ x_draw_image_relief (s)
x0 = x - thick; x0 = x - thick;
y0 = y - thick; y0 = y - thick;
x1 = x + s->img->width + thick - 1; x1 = x + s->slice.width + thick - 1;
y1 = y + s->img->height + thick - 1; y1 = y + s->slice.height + thick - 1;
x_setup_relief_colors (s); x_setup_relief_colors (s);
get_glyph_string_clip_rect (s, &r); get_glyph_string_clip_rect (s, &r);
x_draw_relief_rect (s->f, x0, y0, x1, y1, thick, raised_p, 1, 1, &r); x_draw_relief_rect (s->f, x0, y0, x1, y1, thick, raised_p,
s->slice.y == 0,
s->slice.y + s->slice.height == s->img->height,
s->slice.x == 0,
s->slice.x + s->slice.width == s->img->width,
&r);
} }
...@@ -2311,21 +2326,22 @@ x_draw_image_foreground_1 (s, pixmap) ...@@ -2311,21 +2326,22 @@ x_draw_image_foreground_1 (s, pixmap)
struct glyph_string *s; struct glyph_string *s;
Pixmap pixmap; Pixmap pixmap;
{ {
int x; int x = 0;
int y = s->ybase - s->y - image_ascent (s->img, s->face); int y = s->ybase - s->y - image_ascent (s->img, s->face, &s->slice);
/* If first glyph of S has a left box line, start drawing it to the /* If first glyph of S has a left box line, start drawing it to the
right of that line. */ right of that line. */
if (s->face->box != FACE_NO_BOX if (s->face->box != FACE_NO_BOX
&& s->first_glyph->left_box_line_p) && s->first_glyph->left_box_line_p
x = abs (s->face->box_line_width); && s->slice.x == 0)
else x += abs (s->face->box_line_width);
x = 0;
/* If there is a margin around the image, adjust x- and y-position /* If there is a margin around the image, adjust x- and y-position
by that margin. */ by that margin. */
x += s->img->hmargin; if (s->slice.x == 0)
y += s->img->vmargin; x += s->img->hmargin;
if (s->slice.y == 0)
y += s->img->vmargin;
if (s->img->pixmap) if (s->img->pixmap)
{ {
...@@ -2347,13 +2363,15 @@ x_draw_image_foreground_1 (s, pixmap) ...@@ -2347,13 +2363,15 @@ x_draw_image_foreground_1 (s, pixmap)
XChangeGC (s->display, s->gc, mask, &xgcv); XChangeGC (s->display, s->gc, mask, &xgcv);
XCopyArea (s->display, s->img->pixmap, pixmap, s->gc, XCopyArea (s->display, s->img->pixmap, pixmap, s->gc,
0, 0, s->img->width, s->img->height, x, y); s->slice.x, s->slice.y,
s->slice.width, s->slice.height, x, y);
XSetClipMask (s->display, s->gc, None); XSetClipMask (s->display, s->gc, None);
} }
else else
{ {
XCopyArea (s->display, s->img->pixmap, pixmap, s->gc, XCopyArea (s->display, s->img->pixmap, pixmap, s->gc,
0, 0, s->img->width, s->img->height, x, y); s->slice.x, s->slice.y,
s->slice.width, s->slice.height, x, y);
/* When the image has a mask, we can expect that at /* When the image has a mask, we can expect that at
least part of a mouse highlight or a block cursor will least part of a mouse highlight or a block cursor will
...@@ -2366,14 +2384,15 @@ x_draw_image_foreground_1 (s, pixmap) ...@@ -2366,14 +2384,15 @@ x_draw_image_foreground_1 (s, pixmap)
int r = s->img->relief; int r = s->img->relief;
if (r < 0) r = -r; if (r < 0) r = -r;
XDrawRectangle (s->display, s->window, s->gc, x - r, y - r, XDrawRectangle (s->display, s->window, s->gc, x - r, y - r,
s->img->width + r*2 - 1, s->img->height + r*2 - 1); s->slice.width + r*2 - 1,
s->slice.height + r*2 - 1);
} }
} }
} }
else else
/* Draw a rectangle if image could not be loaded. */ /* Draw a rectangle if image could not be loaded. */
XDrawRectangle (s->display, pixmap, s->gc, x, y, XDrawRectangle (s->display, pixmap, s->gc, x, y,
s->img->width - 1, s->img->height - 1); s->slice.width - 1, s->slice.height - 1);
} }
...@@ -2415,33 +2434,28 @@ static void ...@@ -2415,33 +2434,28 @@ static void
x_draw_image_glyph_string (s) x_draw_image_glyph_string (s)
struct glyph_string *s; struct glyph_string *s;
{ {
int x, y;
int box_line_hwidth = abs (s->face->box_line_width); int box_line_hwidth = abs (s->face->box_line_width);
int box_line_vwidth = max (s->face->box_line_width, 0); int box_line_vwidth = max (s->face->box_line_width, 0);
int height; int height;
Pixmap pixmap = None; Pixmap pixmap = None;
height = s->height - 2 * box_line_vwidth; height = s->height;
if (s->slice.y == 0)
height -= box_line_vwidth;
if (s->slice.y + s->slice.height >= s->img->height)
height -= box_line_vwidth;
/* Fill background with face under the image. Do it only if row is /* Fill background with face under the image. Do it only if row is
taller than image or if image has a clip mask to reduce taller than image or if image has a clip mask to reduce
flickering. */ flickering. */
s->stippled_p = s->face->stipple != 0; s->stippled_p = s->face->stipple != 0;
if (height > s->img->height if (height > s->slice.height
|| s->img->hmargin || s->img->hmargin
|| s->img->vmargin || s->img->vmargin
|| s->img->mask || s->img->mask
|| s->img->pixmap == 0 || s->img->pixmap == 0
|| s->width != s->background_width) || s->width != s->background_width)
{ {
if (box_line_hwidth && s->first_glyph->left_box_line_p)
x = s->x + box_line_hwidth;
else
x = s->x;
y = s->y + box_line_vwidth;
if (s->img->mask) if (s->img->mask)
{ {
/* Create a pixmap as large as the glyph string. Fill it /* Create a pixmap as large as the glyph string. Fill it
...@@ -2480,7 +2494,19 @@ x_draw_image_glyph_string (s) ...@@ -2480,7 +2494,19 @@ x_draw_image_glyph_string (s)
} }
} }
else else
x_draw_glyph_string_bg_rect (s, x, y, s->background_width, height); {
int x = s->x;
int y = s->y;
if (s->first_glyph->left_box_line_p
&& s->slice.x == 0)
x += box_line_hwidth;
if (s->slice.y == 0)
y += box_line_vwidth;
x_draw_glyph_string_bg_rect (s, x, y, s->background_width, height);
}
s->background_filled_p = 1; s->background_filled_p = 1;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment