]> git.eshelyaron.com Git - emacs.git/commitdiff
Cache relief colors on Haiku since their computation is expensive
authorPo Lu <luangruo@yahoo.com>
Tue, 26 Apr 2022 01:19:56 +0000 (01:19 +0000)
committerPo Lu <luangruo@yahoo.com>
Tue, 26 Apr 2022 01:20:30 +0000 (01:20 +0000)
* src/haikufns.c (haiku_create_frame, haiku_create_tip_frame):
Clear `relief_background'.
* src/haikuterm.c (haiku_calculate_relief_colors): Cache relief
colors for each frame.
* src/haikuterm.h (struct haiku_output): New fields for caching
the last relief color.

src/haikufns.c
src/haikuterm.c
src/haikuterm.h

index 4f4979fe094c7d3b4f2d3d2406523621321607c7..ae0f442a21c0c227721c289b10c10b02e674544f 100644 (file)
@@ -700,6 +700,7 @@ haiku_create_frame (Lisp_Object parms)
   f->output_method = output_haiku;
   f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
   f->output_data.haiku->wait_for_event_type = -1;
+  f->output_data.haiku->relief_background = -1;
 
   fset_icon_name (f, gui_display_get_arg (dpyinfo, parms, Qicon_name,
                                           "iconName", "Title",
@@ -1015,6 +1016,7 @@ haiku_create_tip_frame (Lisp_Object parms)
   f->output_method = output_haiku;
   f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
   f->output_data.haiku->wait_for_event_type = -1;
+  f->output_data.haiku->relief_background = -1;
 
   f->tooltip = true;
   fset_icon_name (f, Qnil);
index f81efbdcbb7ff393269f6d518d0219d3c4c5d3ae..86266424c41933b1be70795b757e25398a225fc2 100644 (file)
@@ -623,17 +623,28 @@ haiku_calculate_relief_colors (struct glyph_string *s, uint32_t *rgbout_w,
   struct face *face = s->face;
   double h, cs, l;
   uint32_t rgbin;
+  struct haiku_output *di;
 
-  prepare_face_for_display (s->f, s->face);
   rgbin = (face->use_box_color_for_shadows_p
           ? face->box_color : face->background);
+  di = FRAME_OUTPUT_DATA (s->f);
 
   if (s->hl == DRAW_CURSOR)
     rgbin = FRAME_CURSOR_COLOR (s->f).pixel;
 
-  rgb_color_hsl (rgbin, &h, &cs, &l);
-  hsl_color_rgb (h, cs, fmin (1.0, fmax (0.2, l) * 0.6), rgbout_b);
-  hsl_color_rgb (h, cs, fmin (1.0, fmax (0.2, l) * 1.2), rgbout_w);
+  if (di->relief_background != rgbin)
+    {
+      di->relief_background = rgbin & 0xffffffff;
+
+      rgb_color_hsl (rgbin, &h, &cs, &l);
+      hsl_color_rgb (h, cs, fmin (1.0, fmax (0.2, l) * 0.6),
+                    &di->black_relief_pixel);
+      hsl_color_rgb (h, cs, fmin (1.0, fmax (0.2, l) * 1.2),
+                    &di->white_relief_pixel);
+    }
+
+  *rgbout_w = di->white_relief_pixel;
+  *rgbout_b = di->black_relief_pixel;
 }
 
 static void
index d20d491838f426410eb92c9a0faaa9afa4a2318e..30b474b1e1dda8860bb530f389ee06fad661c5b6 100644 (file)
@@ -181,6 +181,17 @@ struct haiku_output
 
   /* The type of any event that's being waited for.  */
   int wait_for_event_type;
+
+  /* The "dark" color of the current relief.  */
+  uint32_t black_relief_pixel;
+
+  /* The "light" color of the current relief.  */
+  uint32_t white_relief_pixel;
+
+  /* The background for which the relief colors above were computed.
+     They are changed only when a different background is involved.
+     -1 means no color has been computed.  */
+  long relief_background;
 };
 
 struct x_output