emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 4a837b0c72: Cache relief colors on Haiku since their computation


From: Po Lu
Subject: master 4a837b0c72: Cache relief colors on Haiku since their computation is expensive
Date: Mon, 25 Apr 2022 21:20:49 -0400 (EDT)

branch: master
commit 4a837b0c721c9680d8fc88d49d6c1805e279f284
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Cache relief colors on Haiku since their computation is expensive
    
    * 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  |  2 ++
 src/haikuterm.c | 19 +++++++++++++++----
 src/haikuterm.h | 11 +++++++++++
 3 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/haikufns.c b/src/haikufns.c
index 4f4979fe09..ae0f442a21 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -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);
diff --git a/src/haikuterm.c b/src/haikuterm.c
index f81efbdcbb..86266424c4 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -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
diff --git a/src/haikuterm.h b/src/haikuterm.h
index d20d491838..30b474b1e1 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]