From d4ec885cadcbcce077579bdd24c93ead18b06852 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 18 Feb 2012 17:21:51 +0100 Subject: [PATCH] Parametrize color scheme into a separate header file. --- bigscreen/design.h | 32 ++++++++++++++++++++++++++++++++ bigscreen/fonts.cpp | 18 +++++++++++++----- bigscreen/fonts.h | 7 +++++-- bigscreen/groupscreen.cpp | 19 +++++++++++++------ bigscreen/splitscreen.cpp | 13 +++++++------ bigscreen/top10scorescreen.cpp | 24 ++++++++++++++++-------- bigscreen/top5chosenscreen.cpp | 22 +++++++++++++++------- 7 files changed, 101 insertions(+), 34 deletions(-) create mode 100644 bigscreen/design.h diff --git a/bigscreen/design.h b/bigscreen/design.h new file mode 100644 index 0000000..6cffd32 --- /dev/null +++ b/bigscreen/design.h @@ -0,0 +1,32 @@ +#ifndef DESIGN_H +#define DESIGN_H 1 + +#define BACKGROUND_RED 0 +#define BACKGROUND_GREEN 0 +#define BACKGROUND_BLUE 0 + +#define MAIN_HEADING_RED 255 +#define MAIN_HEADING_GREEN 255 +#define MAIN_HEADING_BLUE 255 + +#define COLUMN_HEADING_RED 255 +#define COLUMN_HEADING_GREEN 255 +#define COLUMN_HEADING_BLUE 255 + +#define ROW_HEADING_RED 255 +#define ROW_HEADING_GREEN 255 +#define ROW_HEADING_BLUE 255 + +#define DATA_RED 255 +#define DATA_GREEN 255 +#define DATA_BLUE 255 + +#define FRESH_DATA_RED 255 +#define FRESH_DATA_GREEN 0 +#define FRESH_DATA_BLUE 0 + +#define DIVIDER_RED 127 +#define DIVIDER_GREEN 127 +#define DIVIDER_BLUE 127 + +#endif diff --git a/bigscreen/fonts.cpp b/bigscreen/fonts.cpp index df2360b..86910a6 100644 --- a/bigscreen/fonts.cpp +++ b/bigscreen/fonts.cpp @@ -126,13 +126,19 @@ unsigned my_draw_text(const widestring &str, unsigned char *buf, double size, in return x * LOGICAL_SCREEN_WIDTH / screen_width; } -void my_draw_text_deferred(std::vector &td, const widestring &str, double size, int xpos, int ypos) +void my_draw_text_deferred(std::vector &td, const widestring &str, double size, int xpos, int ypos, int r, int g, int b, int rn, int gn, int bn) { TextDefer newtd; newtd.str = str; newtd.size = size; newtd.xpos = xpos; newtd.ypos = ypos; + newtd.r = r; + newtd.g = g; + newtd.b = b; + newtd.rn = rn; + newtd.gn = gn; + newtd.bn = bn; td.push_back(newtd); } @@ -142,11 +148,13 @@ void draw_all_deferred_text(unsigned char *buf, std::vector ¤t, int r, g, b; if (i < old.size() && current[i].str != old[i].str) { // changed text - r = 255; - g = 0; - b = 0; + r = current[i].rn; + g = current[i].gn; + b = current[i].bn; } else { - r = g = b = 255; + r = current[i].r; + g = current[i].g; + b = current[i].b; } my_draw_text(current[i].str, buf, current[i].size, current[i].xpos, current[i].ypos, r, g, b); diff --git a/bigscreen/fonts.h b/bigscreen/fonts.h index eb7b6fa..6950168 100644 --- a/bigscreen/fonts.h +++ b/bigscreen/fonts.h @@ -5,21 +5,24 @@ #include FT_FREETYPE_H #include #include "widestring.h" +#include "design.h" struct TextDefer { widestring str; double size; unsigned xpos, ypos; + int r, g, b; + int rn, gn, bn; bool changed; }; void init_freetype(); void set_screen_size(unsigned width, unsigned height); -unsigned my_draw_text(const widestring &str, unsigned char *buf, double size, int xpos = 0, int ypos = 0, int r = 255, int g = 255, int b = 255); +unsigned my_draw_text(const widestring &str, unsigned char *buf, double size, int xpos = 0, int ypos = 0, int r = DATA_RED, int g = DATA_GREEN, int b = DATA_BLUE); // draw_all_deferred_text draws every string in current that is not the same in old, in red -void my_draw_text_deferred(std::vector &td, const widestring &str, double size, int xpos, int ypos); +void my_draw_text_deferred(std::vector &td, const widestring &str, double size, int xpos, int ypos, int r = DATA_RED, int g = DATA_GREEN, int b = DATA_BLUE, int rn = FRESH_DATA_RED, int gn = FRESH_DATA_GREEN, int bn = FRESH_DATA_BLUE); void draw_all_deferred_text(unsigned char *buf, std::vector ¤t, std::vector &old); #endif /* !defined(_FONTS_H) */ diff --git a/bigscreen/groupscreen.cpp b/bigscreen/groupscreen.cpp index 88fce1c..6639f4c 100644 --- a/bigscreen/groupscreen.cpp +++ b/bigscreen/groupscreen.cpp @@ -3,6 +3,7 @@ #include #include +#include "design.h" #include "resolution.h" #include "groupscreen.h" #include "fetch_group.h" @@ -60,7 +61,7 @@ void GroupScreen::draw_main_heading(std::vector &td) } unsigned width = my_draw_text(heading, NULL, 40.0); - my_draw_text_deferred(td, heading, 40.0, LOGICAL_SCREEN_WIDTH/2 - width/2, 60); + my_draw_text_deferred(td, heading, 40.0, LOGICAL_SCREEN_WIDTH/2 - width/2, 60, MAIN_HEADING_RED, MAIN_HEADING_GREEN, MAIN_HEADING_BLUE); } // make column headings from the first player's songs @@ -73,16 +74,16 @@ void GroupScreen::draw_column_headings(std::vector &td, const Group & for (std::vector::const_iterator i = group.players[0].scores.begin(); i != group.players[0].scores.end(); ++i, ++col) { if (!i->chosen) { unsigned this_width = my_draw_text(i->song.short_title, NULL, 12.0); - my_draw_text_deferred(td, i->song.short_title, 12.0, x + colwidth[col] / 2 - this_width / 2, 100); + my_draw_text_deferred(td, i->song.short_title, 12.0, x + colwidth[col] / 2 - this_width / 2, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); } x += colwidth[col] + 20; } if (num_scores > 1) { - my_draw_text_deferred(td, "Total", 12.0, x + colwidth[num_scores + 1] / 2 - my_draw_text("Total", NULL, 12.0) / 2, 100); + my_draw_text_deferred(td, "Total", 12.0, x + colwidth[num_scores + 1] / 2 - my_draw_text("Total", NULL, 12.0) / 2, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); x += colwidth[num_scores + 1] + 20; } - my_draw_text_deferred(td, "Rank", 12.0, x + colwidth[num_scores + 2] / 2 - my_draw_text("Rank", NULL, 12.0) / 2, 100); + my_draw_text_deferred(td, "Rank", 12.0, x + colwidth[num_scores + 2] / 2 - my_draw_text("Rank", NULL, 12.0) / 2, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); } // show all the players and the scores @@ -100,7 +101,7 @@ void GroupScreen::draw_scores(std::vector &td, const Group &group, un if (m-1 < min_player) continue; - my_draw_text_deferred(td, i->nick, 18.0, 20, y); + my_draw_text_deferred(td, i->nick, 18.0, 20, y, ROW_HEADING_RED, ROW_HEADING_GREEN, ROW_HEADING_BLUE); x = 40 + colwidth[0]; @@ -601,7 +602,13 @@ void GroupScreen::draw(unsigned char *buf, unsigned width, unsigned height) conn.perform(FetchGroup(tournament, round, parallel, &group)); gettimeofday(&last_updated, NULL); - memset(buf, 0, width * height * 4); + unsigned char *ptr = buf; + for (unsigned i = 0; i < width * height; ++i) { + *ptr++ = BACKGROUND_BLUE; + *ptr++ = BACKGROUND_GREEN; + *ptr++ = BACKGROUND_RED; + *ptr++ = 0; + } std::vector colwidth; diff --git a/bigscreen/splitscreen.cpp b/bigscreen/splitscreen.cpp index e4bb4c4..b2939be 100644 --- a/bigscreen/splitscreen.cpp +++ b/bigscreen/splitscreen.cpp @@ -2,6 +2,7 @@ #include #include "splitscreen.h" +#include "design.h" SplitScreen::SplitScreen(GenericScreen *s1, GenericScreen *s2, GenericScreen *s3, GenericScreen *s4) : valid(false) @@ -52,17 +53,17 @@ void SplitScreen::draw(unsigned char *buf, unsigned width, unsigned height) // make divider lines unsigned char *ptr = buf + (height/2) * width * 4; for (unsigned x = 0; x < width; ++x) { - *ptr++ = 255; - *ptr++ = 255; - *ptr++ = 255; + *ptr++ = DIVIDER_BLUE; + *ptr++ = DIVIDER_GREEN; + *ptr++ = DIVIDER_RED; *ptr++ = 0; } ptr = buf + (width/2) * 4; for (unsigned y = 0; y < height; ++y) { - ptr[0] = 255; - ptr[1] = 255; - ptr[2] = 255; + ptr[0] = DIVIDER_BLUE; + ptr[1] = DIVIDER_GREEN; + ptr[2] = DIVIDER_RED; ptr[3] = 0; ptr += width * 4; diff --git a/bigscreen/top10scorescreen.cpp b/bigscreen/top10scorescreen.cpp index 275a4f5..5ff01a8 100644 --- a/bigscreen/top10scorescreen.cpp +++ b/bigscreen/top10scorescreen.cpp @@ -45,7 +45,13 @@ bool Top10ScoreScreen::check_invalidated() void Top10ScoreScreen::draw(unsigned char *buf, unsigned width, unsigned height) { scores_changed.reset_flag(); - memset(buf, 0, width * height * 4); + unsigned char *ptr = buf; + for (unsigned i = 0; i < width * height; ++i) { + *ptr++ = BACKGROUND_BLUE; + *ptr++ = BACKGROUND_GREEN; + *ptr++ = BACKGROUND_RED; + *ptr++ = 0; + } set_screen_size(width, height); // fetch the top 10 scores @@ -54,28 +60,30 @@ void Top10ScoreScreen::draw(unsigned char *buf, unsigned width, unsigned height) { unsigned width = my_draw_text("Today's top 10 scores", NULL, 40.0); - my_draw_text("Today's top 10 scores", buf, 40.0, LOGICAL_SCREEN_WIDTH/2 - width/2, 60); + my_draw_text("Today's top 10 scores", buf, 40.0, LOGICAL_SCREEN_WIDTH/2 - width/2, 60, MAIN_HEADING_RED, MAIN_HEADING_GREEN, MAIN_HEADING_BLUE); } // simple headings - my_draw_text("Player", buf, 12.0, PLAYER_X, 100); - my_draw_text("Song", buf, 12.0, SONG_X, 100); + my_draw_text("Player", buf, 12.0, PLAYER_X, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); + my_draw_text("Song", buf, 12.0, SONG_X, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); width = my_draw_text("Score", NULL, 12.0); - my_draw_text("Score", buf, 12.0, SCORE_X - width/2, 100); + my_draw_text("Score", buf, 12.0, SCORE_X - width/2, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); unsigned row = 1, y = 140; for (std::vector::const_iterator i = scores.begin(); i != scores.end(); ++i) { char str[16]; - unsigned r = 255, g = 255, b = 255; + unsigned r = DATA_RED, g = DATA_GREEN, b = DATA_BLUE, rh = ROW_HEADING_RED, gh = ROW_HEADING_GREEN, bh = ROW_HEADING_BLUE; // print new entries in red if (seen_topscore.count(*i) == 0 && seen_topscore.size() > 0) { - g = b = 0; + r = rh = FRESH_DATA_RED; + g = gh = FRESH_DATA_GREEN; + b = bh = FRESH_DATA_BLUE; } std::sprintf(str, "%u", row++); unsigned width = my_draw_text(str, NULL, 24.0); - my_draw_text(str, buf, 24.0, RANK_X - width/2, y); + my_draw_text(str, buf, 24.0, RANK_X - width/2, y, rh, gh, bh); my_draw_text(i->nick, buf, 24.0, PLAYER_X, y, r, g, b); diff --git a/bigscreen/top5chosenscreen.cpp b/bigscreen/top5chosenscreen.cpp index 5d2e9dc..3f50f82 100644 --- a/bigscreen/top5chosenscreen.cpp +++ b/bigscreen/top5chosenscreen.cpp @@ -44,7 +44,13 @@ bool Top5ChosenScreen::check_invalidated() void Top5ChosenScreen::draw(unsigned char *buf, unsigned width, unsigned height) { scores_changed.reset_flag(); - memset(buf, 0, width * height * 4); + unsigned char *ptr = buf; + for (unsigned i = 0; i < width * height; ++i) { + *ptr++ = BACKGROUND_BLUE; + *ptr++ = BACKGROUND_GREEN; + *ptr++ = BACKGROUND_RED; + *ptr++ = 0; + } set_screen_size(width, height); // fetch the top 5 chosen songs @@ -53,27 +59,29 @@ void Top5ChosenScreen::draw(unsigned char *buf, unsigned width, unsigned height) { unsigned width = my_draw_text("Today's top 5 chosen songs", NULL, 40.0); - my_draw_text("Today's top 5 chosen songs", buf, 40.0, LOGICAL_SCREEN_WIDTH/2 - width/2, 60); + my_draw_text("Today's top 5 chosen songs", buf, 40.0, LOGICAL_SCREEN_WIDTH/2 - width/2, 60, MAIN_HEADING_RED, MAIN_HEADING_GREEN, MAIN_HEADING_BLUE); } // simple headings - my_draw_text("Song", buf, 12.0, SONG_X, 100); + my_draw_text("Song", buf, 12.0, SONG_X, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); width = my_draw_text("Frequency", NULL, 12.0); - my_draw_text("Frequency", buf, 12.0, FREQUENCY_X - width/2, 100); + my_draw_text("Frequency", buf, 12.0, FREQUENCY_X - width/2, 100, COLUMN_HEADING_RED, COLUMN_HEADING_GREEN, COLUMN_HEADING_BLUE); unsigned row = 1, y = 140; for (std::vector::const_iterator i = scores.begin(); i != scores.end(); ++i) { char str[16]; - unsigned r = 255, g = 255, b = 255; + unsigned r = DATA_RED, g = DATA_GREEN, b = DATA_BLUE, rh = ROW_HEADING_RED, gh = ROW_HEADING_GREEN, bh = ROW_HEADING_BLUE; // print new entries in red if (seen_topchosen.count(*i) == 0 && seen_topchosen.size() > 0) { - g = b = 0; + r = rh = FRESH_DATA_RED; + g = gh = FRESH_DATA_GREEN; + b = bh = FRESH_DATA_BLUE; } std::sprintf(str, "%u", row++); unsigned width = my_draw_text(str, NULL, 24.0); - my_draw_text(str, buf, 24.0, RANK_X - width/2, y); + my_draw_text(str, buf, 24.0, RANK_X - width/2, y, rh, gh, bh); if (my_draw_text(i->title, NULL, 24.0) > SONG_MAX_WIDTH) { my_draw_text(i->shorttitle, buf, 24.0, SONG_X, y, r, g, b); -- 2.39.2