--- /dev/null
+#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
return x * LOGICAL_SCREEN_WIDTH / screen_width;
}
-void my_draw_text_deferred(std::vector<TextDefer> &td, const widestring &str, double size, int xpos, int ypos)
+void my_draw_text_deferred(std::vector<TextDefer> &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);
}
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);
#include FT_FREETYPE_H
#include <vector>
#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<TextDefer> &td, const widestring &str, double size, int xpos, int ypos);
+void my_draw_text_deferred(std::vector<TextDefer> &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<TextDefer> ¤t, std::vector<TextDefer> &old);
#endif /* !defined(_FONTS_H) */
#include <map>
#include <assert.h>
+#include "design.h"
#include "resolution.h"
#include "groupscreen.h"
#include "fetch_group.h"
}
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
for (std::vector<Score>::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
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];
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<unsigned> colwidth;
#include <cstring>
#include "splitscreen.h"
+#include "design.h"
SplitScreen::SplitScreen(GenericScreen *s1, GenericScreen *s2, GenericScreen *s3, GenericScreen *s4)
: valid(false)
// 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;
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
{
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<TopScore>::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);
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
{
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<TopChosen>::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);