aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-02-03 07:50:36 +0000
committerPo Lu2022-02-03 07:50:36 +0000
commitd35c4ee10a549deb613f0ab2f99244e0240c4b60 (patch)
tree9cc1a2e6b37db0b5788e6e5db21816a18aa396d2 /src
parentfc79118f19f9a33ceb98c25ef38c67d2b935b9da (diff)
downloademacs-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.c5
-rw-r--r--src/haiku_support.cc15
-rw-r--r--src/haiku_support.h4
-rw-r--r--src/haikufont.c5
-rw-r--r--src/haikuterm.c14
-rw-r--r--src/haikuterm.h6
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. */
3182cairo_surface_t * 3189cairo_t *
3183EmacsView_cairo_surface (void *view) 3190EmacsView_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,
3618cairo_t * 3618cairo_t *
3619haiku_begin_cr_clip (struct frame *f, struct glyph_string *s) 3619haiku_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
3629void 3630void
3630haiku_end_cr_clip (cairo_t *cr) 3631haiku_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
238extern void syms_of_haikuterm (void); 240extern void syms_of_haikuterm (void);