summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/graph_gui.cpp80
1 files changed, 49 insertions, 31 deletions
diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp
index 0cf2d76c2..5e72271ac 100644
--- a/src/graph_gui.cpp
+++ b/src/graph_gui.cpp
@@ -27,6 +27,14 @@ enum {
GRAPH_MAX_DATASETS = 16,
GRAPH_AXIS_LABEL_COLOUR = 16,
GRAPH_AXIS_LINE_COLOUR = 215,
+
+ GRAPH_X_POSITION_BEGINNING = 44, // Start the graph 44 pixels from gw->left
+ GRAPH_X_POSITION_SEPARATION = 22, // There are 22 pixels between each X value
+
+ /* How many horizontal lines to draw. 9 is convenient as that means the
+ * distance between them is the height of the graph / 8, which is the same
+ * as height >> 3. */
+ GRAPH_NUM_LINES_Y = 9,
};
typedef struct GraphDrawer {
@@ -60,12 +68,12 @@ static void DrawGraph(const GraphDrawer *gw)
int i,j,k;
uint x,y,old_x,old_y;
- int right, bottom;
+ int right;
int num_x, num_dataset;
const int64 *row_ptr, *col_ptr;
int64 mx;
int adj_height;
- uint64 y_scaling, tmp;
+ uint64 y_scaling;
int64 value;
int64 cur_val;
uint sel;
@@ -74,27 +82,32 @@ static void DrawGraph(const GraphDrawer *gw)
* both values for cargo and players. So if any are higher, quit */
assert(GRAPH_MAX_DATASETS >= (int)NUM_CARGO && GRAPH_MAX_DATASETS >= (int)MAX_PLAYERS);
+ assert(gw->num_vert_lines > 0);
+
byte grid_colour = _colour_gradient[14][4];
+ /* Position of the bottom of the graph. */
+ int bottom = gw->top + gw->height - 1;
+
/* draw the vertical lines */
- i = gw->num_vert_lines; assert(i > 0);
- x = gw->left + 66;
- bottom = gw->top + gw->height - 1;
- do {
+
+ /* Don't draw the first line, as that's where the axis will be. */
+ x = gw->left + GRAPH_X_POSITION_BEGINNING + GRAPH_X_POSITION_SEPARATION;
+
+ for (int i = 0; i < gw->num_vert_lines; i++) {
GfxFillRect(x, gw->top, x, bottom, grid_colour);
- x += 22;
- } while (--i);
+ x += GRAPH_X_POSITION_SEPARATION;
+ }
/* draw the horizontal lines */
- i = 9;
- x = gw->left + 44;
+ x = gw->left + GRAPH_X_POSITION_BEGINNING;
y = gw->height + gw->top;
- right = gw->left + 44 + gw->num_vert_lines*22-1;
+ right = gw->left + GRAPH_X_POSITION_BEGINNING + gw->num_vert_lines * GRAPH_X_POSITION_SEPARATION - 1;
- do {
+ for (int i = 0; i < GRAPH_NUM_LINES_Y; i++) {
GfxFillRect(x, y, right, y, grid_colour);
- y -= gw->height >> 3;
- } while (--i);
+ y -= (gw->height / (GRAPH_NUM_LINES_Y - 1));
+ }
/* draw vertical edge line */
GfxFillRect(x, gw->top, x, bottom, GRAPH_AXIS_LINE_COLOUR);
@@ -110,6 +123,8 @@ static void DrawGraph(const GraphDrawer *gw)
if (gw->num_on_x_axis == 0)
return;
+ assert(gw->num_on_x_axis > 0);
+
num_dataset = gw->num_dataset;
assert(num_dataset > 0);
@@ -142,22 +157,22 @@ static void DrawGraph(const GraphDrawer *gw)
}
/* draw text strings on the y axis */
- tmp = value;
- if (gw->include_neg) tmp >>= 1;
- x = gw->left + 45;
+ int64 y_label = value;
+ if (gw->include_neg) y_label /= 2;
+ x = gw->left + GRAPH_X_POSITION_BEGINNING + 1;
y = gw->top - 3;
- i = 9;
- do {
+
+ for (int i = 0; i < GRAPH_NUM_LINES_Y; i++) {
SetDParam(0, gw->format_str_y_axis);
- SetDParam64(1, (int64)tmp);
- tmp -= (value >> 3);
+ SetDParam64(1, y_label);
DrawStringRightAligned(x, y, STR_0170, GRAPH_AXIS_LABEL_COLOUR);
- y += gw->height >> 3;
- } while (--i);
+ y_label -= (value / (GRAPH_NUM_LINES_Y - 1));
+ y += (gw->height / (GRAPH_NUM_LINES_Y - 1));
+ }
/* draw strings on the x axis */
if (gw->month != 0xFF) {
- x = gw->left + 44;
+ x = gw->left + GRAPH_X_POSITION_BEGINNING;
y = gw->top + gw->height + 1;
j = gw->month;
k = gw->year;
@@ -173,10 +188,11 @@ static void DrawGraph(const GraphDrawer *gw)
j = 0;
k++;
}
- x += 22;
+ x += GRAPH_X_POSITION_SEPARATION;
} while (--i);
} else {
- x = gw->left + 52;
+ /* Add 8 to make the string appear centred between the lines. */
+ x = gw->left + GRAPH_X_POSITION_BEGINNING + 8;
y = gw->top + gw->height + 1;
uint16 label = gw->x_values_start;
@@ -184,7 +200,7 @@ static void DrawGraph(const GraphDrawer *gw)
SetDParam(0, label);
DrawString(x, y, STR_01CB, GRAPH_AXIS_LABEL_COLOUR);
label += gw->x_values_increment;
- x += 22;
+ x += GRAPH_X_POSITION_SEPARATION;
}
}
@@ -194,12 +210,13 @@ static void DrawGraph(const GraphDrawer *gw)
sel = gw->sel; // show only selected lines. GraphDrawer qw->sel set in Graph-Legend (_legend_excludebits)
do {
if (!(sel & 1)) {
- x = gw->left + 55;
- j = gw->num_on_x_axis;assert(j>0);
+ /* Centre the dot between the grid lines. */
+ x = gw->left + GRAPH_X_POSITION_BEGINNING + (GRAPH_X_POSITION_SEPARATION / 2);
col_ptr = row_ptr;
byte color = gw->colors[i];
old_y = old_x = INVALID_VALUE;
- do {
+
+ for (int i = 0; i < gw->num_on_x_axis; i++) {
cur_val = *col_ptr++;
if (cur_val != INVALID_VALUE) {
y = adj_height - BIGMULSS64(cur_val, y_scaling >> 1, 31) + gw->top;
@@ -213,7 +230,8 @@ static void DrawGraph(const GraphDrawer *gw)
} else {
old_x = INVALID_VALUE;
}
- } while (x+=22,--j);
+ x += GRAPH_X_POSITION_SEPARATION;
+ }
}
} while (sel>>=1,row_ptr+=24, ++i < gw->num_dataset);
}