diff options
| author | Po Lu | 2022-02-03 07:50:36 +0000 |
|---|---|---|
| committer | Po Lu | 2022-02-03 07:50:36 +0000 |
| commit | d35c4ee10a549deb613f0ab2f99244e0240c4b60 (patch) | |
| tree | 9cc1a2e6b37db0b5788e6e5db21816a18aa396d2 /src | |
| parent | fc79118f19f9a33ceb98c25ef38c67d2b935b9da (diff) | |
| download | emacs-d35c4ee10a549deb613f0ab2f99244e0240c4b60.tar.gz emacs-d35c4ee10a549deb613f0ab2f99244e0240c4b60.zip | |
Stop creating cairo contexts in haiku_begin_cr_clip
* src/haikufont.c (haikufont_draw):
* src/ftcrfont.c (ftcrfont_draw): Stop holding the draw lock.
* src/haiku_support.cc (class EmacsView): New field
`cairo_context'.
(DetachCairoSurface): Destroy cairo_context.
(AttachCairoSurface): Create cairo_context from the surface.
(EmacsView_cairo_surface): Delete function.
(EmacsView_cairo_context): New function.
* src/haiku_support.h: Update prototypes.
* src/haikuterm.c (haiku_begin_cr_clip):
(haiku_end_cr_clip): Retrieve the existing cairo context instead
of creating a new one.
* src/haikuterm.h (FRAME_CR_CONTEXT): New macro.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ftcrfont.c | 5 | ||||
| -rw-r--r-- | src/haiku_support.cc | 15 | ||||
| -rw-r--r-- | src/haiku_support.h | 4 | ||||
| -rw-r--r-- | src/haikufont.c | 5 | ||||
| -rw-r--r-- | src/haikuterm.c | 14 | ||||
| -rw-r--r-- | src/haikuterm.h | 6 |
6 files changed, 31 insertions, 18 deletions
diff --git a/src/ftcrfont.c b/src/ftcrfont.c index c327146ba28..7d192697ca1 100644 --- a/src/ftcrfont.c +++ b/src/ftcrfont.c | |||
| @@ -538,12 +538,12 @@ ftcrfont_draw (struct glyph_string *s, | |||
| 538 | cr = pgtk_begin_cr_clip (f); | 538 | cr = pgtk_begin_cr_clip (f); |
| 539 | #endif | 539 | #endif |
| 540 | #else | 540 | #else |
| 541 | BView_draw_lock (FRAME_HAIKU_VIEW (f)); | 541 | /* Presumably the draw lock is already held by |
| 542 | haiku_draw_glyph_string. */ | ||
| 542 | EmacsWindow_begin_cr_critical_section (FRAME_HAIKU_WINDOW (f)); | 543 | EmacsWindow_begin_cr_critical_section (FRAME_HAIKU_WINDOW (f)); |
| 543 | cr = haiku_begin_cr_clip (f, s); | 544 | cr = haiku_begin_cr_clip (f, s); |
| 544 | if (!cr) | 545 | if (!cr) |
| 545 | { | 546 | { |
| 546 | BView_draw_unlock (FRAME_HAIKU_VIEW (f)); | ||
| 547 | EmacsWindow_end_cr_critical_section (FRAME_HAIKU_WINDOW (f)); | 547 | EmacsWindow_end_cr_critical_section (FRAME_HAIKU_WINDOW (f)); |
| 548 | unblock_input (); | 548 | unblock_input (); |
| 549 | return 0; | 549 | return 0; |
| @@ -610,7 +610,6 @@ ftcrfont_draw (struct glyph_string *s, | |||
| 610 | #else | 610 | #else |
| 611 | haiku_end_cr_clip (cr); | 611 | haiku_end_cr_clip (cr); |
| 612 | EmacsWindow_end_cr_critical_section (FRAME_HAIKU_WINDOW (f)); | 612 | EmacsWindow_end_cr_critical_section (FRAME_HAIKU_WINDOW (f)); |
| 613 | BView_draw_unlock (FRAME_HAIKU_VIEW (f)); | ||
| 614 | #endif | 613 | #endif |
| 615 | unblock_input (); | 614 | unblock_input (); |
| 616 | 615 | ||
diff --git a/src/haiku_support.cc b/src/haiku_support.cc index 8ab82170916..fad2b466544 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc | |||
| @@ -1184,6 +1184,7 @@ public: | |||
| 1184 | 1184 | ||
| 1185 | #ifdef USE_BE_CAIRO | 1185 | #ifdef USE_BE_CAIRO |
| 1186 | cairo_surface_t *cr_surface = NULL; | 1186 | cairo_surface_t *cr_surface = NULL; |
| 1187 | cairo_t *cr_context = NULL; | ||
| 1187 | BLocker cr_surface_lock; | 1188 | BLocker cr_surface_lock; |
| 1188 | #endif | 1189 | #endif |
| 1189 | 1190 | ||
| @@ -1215,8 +1216,10 @@ public: | |||
| 1215 | gui_abort ("Could not lock cr surface during detachment"); | 1216 | gui_abort ("Could not lock cr surface during detachment"); |
| 1216 | if (!cr_surface) | 1217 | if (!cr_surface) |
| 1217 | gui_abort ("Trying to detach window cr surface when none exists"); | 1218 | gui_abort ("Trying to detach window cr surface when none exists"); |
| 1219 | cairo_destroy (cr_context); | ||
| 1218 | cairo_surface_destroy (cr_surface); | 1220 | cairo_surface_destroy (cr_surface); |
| 1219 | cr_surface = NULL; | 1221 | cr_surface = NULL; |
| 1222 | cr_context = NULL; | ||
| 1220 | cr_surface_lock.Unlock (); | 1223 | cr_surface_lock.Unlock (); |
| 1221 | } | 1224 | } |
| 1222 | 1225 | ||
| @@ -1236,6 +1239,10 @@ public: | |||
| 1236 | offscreen_draw_bitmap_1->BytesPerRow ()); | 1239 | offscreen_draw_bitmap_1->BytesPerRow ()); |
| 1237 | if (!cr_surface) | 1240 | if (!cr_surface) |
| 1238 | gui_abort ("Cr surface allocation failed for double-buffered view"); | 1241 | gui_abort ("Cr surface allocation failed for double-buffered view"); |
| 1242 | |||
| 1243 | cr_context = cairo_create (cr_surface); | ||
| 1244 | if (!cr_context) | ||
| 1245 | gui_abort ("cairo_t allocation failed for double-buffered view"); | ||
| 1239 | cr_surface_lock.Unlock (); | 1246 | cr_surface_lock.Unlock (); |
| 1240 | } | 1247 | } |
| 1241 | #endif | 1248 | #endif |
| @@ -3178,12 +3185,12 @@ BView_show_tooltip (void *view) | |||
| 3178 | 3185 | ||
| 3179 | 3186 | ||
| 3180 | #ifdef USE_BE_CAIRO | 3187 | #ifdef USE_BE_CAIRO |
| 3181 | /* Return VIEW's cairo surface. */ | 3188 | /* Return VIEW's cairo context. */ |
| 3182 | cairo_surface_t * | 3189 | cairo_t * |
| 3183 | EmacsView_cairo_surface (void *view) | 3190 | EmacsView_cairo_context (void *view) |
| 3184 | { | 3191 | { |
| 3185 | EmacsView *vw = (EmacsView *) view; | 3192 | EmacsView *vw = (EmacsView *) view; |
| 3186 | return vw->cr_surface; | 3193 | return vw->cr_context; |
| 3187 | } | 3194 | } |
| 3188 | 3195 | ||
| 3189 | /* Transfer each clip rectangle in VIEW to the cairo context | 3196 | /* Transfer each clip rectangle in VIEW to the cairo context |
diff --git a/src/haiku_support.h b/src/haiku_support.h index b98fa56415b..ea34ccb435c 100644 --- a/src/haiku_support.h +++ b/src/haiku_support.h | |||
| @@ -827,8 +827,8 @@ extern "C" | |||
| 827 | BView_show_tooltip (void *view); | 827 | BView_show_tooltip (void *view); |
| 828 | 828 | ||
| 829 | #ifdef USE_BE_CAIRO | 829 | #ifdef USE_BE_CAIRO |
| 830 | extern cairo_surface_t * | 830 | extern cairo_t * |
| 831 | EmacsView_cairo_surface (void *view); | 831 | EmacsView_cairo_context (void *view); |
| 832 | 832 | ||
| 833 | extern void | 833 | extern void |
| 834 | BView_cr_dump_clipping (void *view, cairo_t *ctx); | 834 | BView_cr_dump_clipping (void *view, cairo_t *ctx); |
diff --git a/src/haikufont.c b/src/haikufont.c index e08792be4b3..67b1113e44c 100644 --- a/src/haikufont.c +++ b/src/haikufont.c | |||
| @@ -955,7 +955,8 @@ haikufont_draw (struct glyph_string *s, int from, int to, | |||
| 955 | block_input (); | 955 | block_input (); |
| 956 | prepare_face_for_display (s->f, face); | 956 | prepare_face_for_display (s->f, face); |
| 957 | 957 | ||
| 958 | BView_draw_lock (view); | 958 | /* Presumably the draw lock is already held by |
| 959 | haiku_draw_glyph_string; */ | ||
| 959 | if (with_background) | 960 | if (with_background) |
| 960 | { | 961 | { |
| 961 | int height = FONT_HEIGHT (s->font), ascent = FONT_BASE (s->font); | 962 | int height = FONT_HEIGHT (s->font), ascent = FONT_BASE (s->font); |
| @@ -1014,7 +1015,7 @@ haikufont_draw (struct glyph_string *s, int from, int to, | |||
| 1014 | BView_DrawString (view, b, b_len); | 1015 | BView_DrawString (view, b, b_len); |
| 1015 | xfree (b); | 1016 | xfree (b); |
| 1016 | } | 1017 | } |
| 1017 | BView_draw_unlock (view); | 1018 | |
| 1018 | unblock_input (); | 1019 | unblock_input (); |
| 1019 | return 1; | 1020 | return 1; |
| 1020 | } | 1021 | } |
diff --git a/src/haikuterm.c b/src/haikuterm.c index ac0540b77f8..e8c734d6711 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c | |||
| @@ -3618,18 +3618,22 @@ haiku_set_offset (struct frame *frame, int x, int y, | |||
| 3618 | cairo_t * | 3618 | cairo_t * |
| 3619 | haiku_begin_cr_clip (struct frame *f, struct glyph_string *s) | 3619 | haiku_begin_cr_clip (struct frame *f, struct glyph_string *s) |
| 3620 | { | 3620 | { |
| 3621 | cairo_surface_t *surface = FRAME_CR_SURFACE (f); | 3621 | cairo_t *cr = FRAME_CR_CONTEXT (f); |
| 3622 | if (!surface) | 3622 | |
| 3623 | if (!cr) | ||
| 3623 | return NULL; | 3624 | return NULL; |
| 3624 | 3625 | ||
| 3625 | cairo_t *context = cairo_create (surface); | 3626 | cairo_save (cr); |
| 3626 | return context; | 3627 | return cr; |
| 3627 | } | 3628 | } |
| 3628 | 3629 | ||
| 3629 | void | 3630 | void |
| 3630 | haiku_end_cr_clip (cairo_t *cr) | 3631 | haiku_end_cr_clip (cairo_t *cr) |
| 3631 | { | 3632 | { |
| 3632 | cairo_destroy (cr); | 3633 | if (!cr) |
| 3634 | return NULL; | ||
| 3635 | |||
| 3636 | cairo_restore (cr); | ||
| 3633 | } | 3637 | } |
| 3634 | #endif | 3638 | #endif |
| 3635 | 3639 | ||
diff --git a/src/haikuterm.h b/src/haikuterm.h index de607e6dc51..2dbdb6aafcb 100644 --- a/src/haikuterm.h +++ b/src/haikuterm.h | |||
| @@ -231,8 +231,10 @@ struct scroll_bar | |||
| 231 | #define FRAME_CURSOR_COLOR(f) (FRAME_OUTPUT_DATA (f)->cursor_color) | 231 | #define FRAME_CURSOR_COLOR(f) (FRAME_OUTPUT_DATA (f)->cursor_color) |
| 232 | 232 | ||
| 233 | #ifdef USE_BE_CAIRO | 233 | #ifdef USE_BE_CAIRO |
| 234 | #define FRAME_CR_SURFACE(f) \ | 234 | #define FRAME_CR_CONTEXT(f) \ |
| 235 | (FRAME_HAIKU_VIEW (f) ? EmacsView_cairo_surface (FRAME_HAIKU_VIEW (f)) : 0); | 235 | (FRAME_HAIKU_VIEW (f) \ |
| 236 | ? EmacsView_cairo_context (FRAME_HAIKU_VIEW (f)) \ | ||
| 237 | : NULL) | ||
| 236 | #endif | 238 | #endif |
| 237 | 239 | ||
| 238 | extern void syms_of_haikuterm (void); | 240 | extern void syms_of_haikuterm (void); |