-rw-r--r-- | r/connect.R | 2 | ||||
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/controller/exp004reshape.c | 11 | ||||
-rw-r--r-- | src/model/density_legend_geometry.c | 81 | ||||
-rw-r--r-- | src/model/density_legend_geometry.h | 9 | ||||
-rw-r--r-- | src/model/display_list_index.h | 6 | ||||
-rw-r--r-- | src/model/exp004state.h | 14 | ||||
-rw-r--r-- | src/util/check_error.c | 6 | ||||
-rw-r--r-- | src/view/exp004geometry.c | 7 | ||||
-rw-r--r-- | src/view/exp004init.c | 8 | ||||
-rw-r--r-- | src/view/exp004view.c | 4 |
11 files changed, 124 insertions, 27 deletions
diff --git a/src/model/density_legend_geometry.c b/src/model/density_legend_geometry.c new file mode 100644 index 0000000..ab3e46c --- a/dev/null +++ b/src/model/density_legend_geometry.c @@ -0,0 +1,81 @@ +#include "density_legend_geometry.h" +#include "../view/exp004state0.h" +#include "../controller/exp004reshape.h" +#include <GL/glut.h> +#include <stdio.h> + +#define S exp004state0 + +void +density_legend_geometry (void) +{ + glNewList (S.list_offset + DENSITY_LEGEND_GEOMETRY, GL_COMPILE); + glPolygonMode (GL_FRONT, GL_FILL); + glColor4f (DEFAULT_COLOR_R, DEFAULT_COLOR_G, DEFAULT_COLOR_B, + DEFAULT_COLOR_A); + + /* + * This value should be a percentage of the world height so that it + * remains a fixed number of pixels tall when the window is resized + * or zoomed. + */ + double legend_height = 0.5; + + /* + * Calculate the bounding box for the legend. + */ + + double a[2]; + double b[2]; + double c[2]; + double d[2]; + + const double *left; + const double *right; + const double *top; + + if (S.zoom.active) + { + left = &S.zoom.coords[0]; + right = &S.zoom.coords[1]; + top = &S.zoom.coords[3]; + } + else + { + left = &S.ortho.min_x; + top = &S.ortho.max_y; + right = &S.ortho.max_x; + } + + a[0] = *left; + a[1] = *top; + b[0] = *right; + b[1] = *top; + c[0] = *right; + c[1] = *top - legend_height; + d[0] = *left; + d[1] = *top - legend_height; + + /* + * Overlay a legend from default saturation / alpha to full saturation. + */ + for (int i = 1; i <= 1 / DEFAULT_COLOR_A; i++) + { + glBegin (GL_QUADS); + glVertex2dv (a); + glVertex2dv (b); + glVertex2dv (c); + glVertex2dv (d); + glEnd (); + + /* + * Step left to right along the x-coordinate. + */ + a[0] = *left + (*right - *left) * (DEFAULT_COLOR_A * i); + d[0] = a[0]; + } + + glEndList (); + + return; +} |