diff options
| author | YAMAMOTO Mitsuharu | 2019-06-15 12:36:26 +0900 |
|---|---|---|
| committer | YAMAMOTO Mitsuharu | 2019-06-15 12:36:26 +0900 |
| commit | 703b9d652b006b1ff6f81fd0ff47ce8c36dddc5e (patch) | |
| tree | c15281a1399e925859e3b25c553fe6b6e41f2751 /src | |
| parent | d957164ca3c6271989c66017551093d34a197ecf (diff) | |
| download | emacs-703b9d652b006b1ff6f81fd0ff47ce8c36dddc5e.tar.gz emacs-703b9d652b006b1ff6f81fd0ff47ce8c36dddc5e.zip | |
Rework x_scroll_run on cairo
* src/xterm.c (x_scroll_run) [USE_CAIRO]: Use FRAME_CR_CONTEXT or surface type
for conditions to call XCopyArea rather than FRAME_X_DOUBLE_BUFFERED_P.
Set compositing operator to CAIRO_OPERATOR_SOURCE when copying image.
Diffstat (limited to 'src')
| -rw-r--r-- | src/xterm.c | 84 |
1 files changed, 43 insertions, 41 deletions
diff --git a/src/xterm.c b/src/xterm.c index 3cd95b7a65d..1608621fc49 100644 --- a/src/xterm.c +++ b/src/xterm.c | |||
| @@ -4393,51 +4393,53 @@ x_scroll_run (struct window *w, struct run *run) | |||
| 4393 | gui_clear_cursor (w); | 4393 | gui_clear_cursor (w); |
| 4394 | 4394 | ||
| 4395 | #ifdef USE_CAIRO | 4395 | #ifdef USE_CAIRO |
| 4396 | if (FRAME_X_DOUBLE_BUFFERED_P (f)) | 4396 | if (FRAME_CR_CONTEXT (f)) |
| 4397 | { | ||
| 4398 | cairo_t *cr = FRAME_CR_CONTEXT (f); | ||
| 4399 | if (cr) | ||
| 4400 | cairo_surface_flush (cairo_get_target (cr)); | ||
| 4401 | XCopyArea (FRAME_X_DISPLAY (f), | ||
| 4402 | FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f), | ||
| 4403 | f->output_data.x->normal_gc, | ||
| 4404 | x, from_y, | ||
| 4405 | width, height, | ||
| 4406 | x, to_y); | ||
| 4407 | if (cr) | ||
| 4408 | cairo_surface_mark_dirty_rectangle (cairo_get_target (cr), | ||
| 4409 | x, to_y, width, height); | ||
| 4410 | } | ||
| 4411 | else if (FRAME_CR_CONTEXT (f)) | ||
| 4412 | { | 4397 | { |
| 4413 | cairo_surface_t *s = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, | 4398 | cairo_surface_t *surface = cairo_get_target (FRAME_CR_CONTEXT (f)); |
| 4414 | width, height); | 4399 | if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_XLIB) |
| 4415 | cairo_t *cr = cairo_create (s); | 4400 | { |
| 4416 | cairo_set_source_surface (cr, cairo_get_target (FRAME_CR_CONTEXT (f)), | 4401 | eassert (cairo_xlib_surface_get_display (surface) |
| 4417 | -x, -from_y); | 4402 | == FRAME_X_DISPLAY (f)); |
| 4418 | cairo_paint (cr); | 4403 | eassert (cairo_xlib_surface_get_drawable (surface) |
| 4419 | cairo_destroy (cr); | 4404 | == FRAME_X_RAW_DRAWABLE (f)); |
| 4405 | cairo_surface_flush (surface); | ||
| 4406 | XCopyArea (FRAME_X_DISPLAY (f), | ||
| 4407 | FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f), | ||
| 4408 | f->output_data.x->normal_gc, | ||
| 4409 | x, from_y, | ||
| 4410 | width, height, | ||
| 4411 | x, to_y); | ||
| 4412 | cairo_surface_mark_dirty_rectangle (surface, x, to_y, width, height); | ||
| 4413 | } | ||
| 4414 | else | ||
| 4415 | { | ||
| 4416 | cairo_surface_t *s | ||
| 4417 | = cairo_surface_create_similar (surface, | ||
| 4418 | cairo_surface_get_content (surface), | ||
| 4419 | width, height); | ||
| 4420 | cairo_t *cr = cairo_create (s); | ||
| 4421 | cairo_set_source_surface (cr, surface, -x, -from_y); | ||
| 4422 | cairo_paint (cr); | ||
| 4423 | cairo_destroy (cr); | ||
| 4420 | 4424 | ||
| 4421 | cr = FRAME_CR_CONTEXT (f); | 4425 | cr = FRAME_CR_CONTEXT (f); |
| 4422 | cairo_save (cr); | 4426 | cairo_save (cr); |
| 4423 | cairo_set_source_surface (cr, s, x, to_y); | 4427 | cairo_set_source_surface (cr, s, x, to_y); |
| 4424 | cairo_rectangle (cr, x, to_y, width, height); | 4428 | cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); |
| 4425 | cairo_fill (cr); | 4429 | cairo_rectangle (cr, x, to_y, width, height); |
| 4426 | cairo_restore (cr); | 4430 | cairo_fill (cr); |
| 4427 | cairo_surface_destroy (s); | 4431 | cairo_restore (cr); |
| 4432 | cairo_surface_destroy (s); | ||
| 4433 | } | ||
| 4428 | } | 4434 | } |
| 4429 | else | 4435 | else |
| 4430 | { | 4436 | #endif /* USE_CAIRO */ |
| 4431 | SET_FRAME_GARBAGED (f); | 4437 | XCopyArea (FRAME_X_DISPLAY (f), |
| 4432 | } | 4438 | FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f), |
| 4433 | #else | 4439 | f->output_data.x->normal_gc, |
| 4434 | XCopyArea (FRAME_X_DISPLAY (f), | 4440 | x, from_y, |
| 4435 | FRAME_X_DRAWABLE (f), FRAME_X_DRAWABLE (f), | 4441 | width, height, |
| 4436 | f->output_data.x->normal_gc, | 4442 | x, to_y); |
| 4437 | x, from_y, | ||
| 4438 | width, height, | ||
| 4439 | x, to_y); | ||
| 4440 | #endif | ||
| 4441 | 4443 | ||
| 4442 | unblock_input (); | 4444 | unblock_input (); |
| 4443 | } | 4445 | } |