summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2008-06-26 16:37:02 -0400
committerRay Strode <rstrode@redhat.com>2008-06-26 16:38:07 -0400
commit72783abcb178531f6403f9a8ba26a6e7652bd8e5 (patch)
tree02559c93586abafd4c47669a36d33baa683e9148
parent9d4b6623f896b79e44dd22d14c8fb54ab365b761 (diff)
downloadplymouth-72783abcb178531f6403f9a8ba26a6e7652bd8e5.tar.gz
plymouth-72783abcb178531f6403f9a8ba26a6e7652bd8e5.tar.xz
plymouth-72783abcb178531f6403f9a8ba26a6e7652bd8e5.zip
Store palette in window object and only read it once when opening device
-rw-r--r--src/libplybootsplash/ply-window.c61
1 files changed, 25 insertions, 36 deletions
diff --git a/src/libplybootsplash/ply-window.c b/src/libplybootsplash/ply-window.c
index 381d3c1..ee432e1 100644
--- a/src/libplybootsplash/ply-window.c
+++ b/src/libplybootsplash/ply-window.c
@@ -81,6 +81,10 @@
#define BACKGROUND_COLOR_BASE 40
#endif
+#ifndef TEXT_PALETTE_SIZE
+#define TEXT_PALETTE_SIZE 48
+#endif
+
struct _ply_window
{
ply_event_loop_t *loop;
@@ -100,6 +104,8 @@ struct _ply_window
ply_window_color_t foreground_color;
ply_window_color_t background_color;
+ uint8_t color_palette[TEXT_PALETTE_SIZE];
+
int number_of_text_rows;
int number_of_text_columns;
@@ -119,6 +125,8 @@ struct _ply_window
void *enter_handler_user_data;
};
+static bool ply_window_look_up_color_palette (ply_window_t *window);
+
ply_window_t *
ply_window_new (int vt_number)
{
@@ -383,6 +391,9 @@ ply_window_open (ply_window_t *window)
if (!ply_window_look_up_geometry (window))
return false;
+ if (!ply_window_look_up_color_palette (window))
+ return false;
+
ply_window_hide_text_cursor (window);
ply_window_set_text_cursor_position (window, 0, 0);
@@ -540,27 +551,19 @@ ply_window_get_foreground_color (ply_window_t *window)
return window->foreground_color;
}
-static uint8_t *
-ply_window_get_color_palette (ply_window_t *window)
+static bool
+ply_window_look_up_color_palette (ply_window_t *window)
{
- uint8_t *palette;
-
- palette = malloc (48);
-
- if (ioctl (window->tty_fd, GIO_CMAP, palette) < 0)
- {
- free (palette);
- return NULL;
- }
+ if (ioctl (window->tty_fd, GIO_CMAP, window->color_palette) < 0)
+ return false;
- return palette;
+ return true;
}
static bool
-ply_window_set_color_palette (ply_window_t *window,
- uint8_t *palette)
+ply_window_change_color_palette (ply_window_t *window)
{
- if (ioctl (window->tty_fd, PIO_CMAP, palette) < 0)
+ if (ioctl (window->tty_fd, PIO_CMAP, window->color_palette) < 0)
return false;
return true;
@@ -570,22 +573,15 @@ uint32_t
ply_window_get_color_hex_value (ply_window_t *window,
ply_window_color_t color)
{
- uint8_t *palette;
uint8_t red, green, blue;
uint32_t hex_value;
assert (window != NULL);
assert (color >= 0 && color <= PLY_WINDOW_COLOR_WHITE);
- palette = ply_window_get_color_palette (window);
-
- if (palette == NULL)
- return 0;
-
- red = (uint8_t) *(palette + 3 * color);
- green = (uint8_t) *(palette + 3 * color + 1);
- blue = (uint8_t) *(palette + 3 * color + 2);
- free (palette);
+ red = (uint8_t) *(window->color_palette + 3 * color);
+ green = (uint8_t) *(window->color_palette + 3 * color + 1);
+ blue = (uint8_t) *(window->color_palette + 3 * color + 2);
hex_value = red << 16 | green << 8 | blue;
@@ -597,27 +593,20 @@ ply_window_set_color_hex_value (ply_window_t *window,
ply_window_color_t color,
uint32_t hex_value)
{
- uint8_t *palette;
uint8_t red, green, blue;
assert (window != NULL);
assert (color >= 0 && color <= PLY_WINDOW_COLOR_WHITE);
- palette = ply_window_get_color_palette (window);
-
- if (palette == NULL)
- return;
-
red = (uint8_t) ((hex_value >> 16) & 0xff);
green = (uint8_t) ((hex_value >> 8) & 0xff);
blue = (uint8_t) (hex_value & 0xff);
- *(palette + 3 * color) = red;
- *(palette + 3 * color + 1) = green;
- *(palette + 3 * color + 2) = blue;
+ *(window->color_palette + 3 * color) = red;
+ *(window->color_palette + 3 * color + 1) = green;
+ *(window->color_palette + 3 * color + 2) = blue;
- ply_window_set_color_palette (window, palette);
- free (palette);
+ ply_window_change_color_palette (window);
}
void