summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <ssp@redhat.com>2013-01-09 21:27:45 -0500
committerSøren Sandmann <ssp@redhat.com>2013-01-09 21:27:45 -0500
commit71ce9cfa4f26ff41bde06226409b43bc94ea2ab8 (patch)
tree7b3b3d87a80bd05c628b634069a0d1b441e5ee4f
parent01c3c09be80d6fcd822ae60b575cd0ff5440a46f (diff)
table and cells
-rw-r--r--pics.c271
1 files changed, 167 insertions, 104 deletions
diff --git a/pics.c b/pics.c
index 84731b1..3c25a63 100644
--- a/pics.c
+++ b/pics.c
@@ -3,8 +3,8 @@
#define CHECK_SIZE 16
-#define SOURCE_COLOR 0.8, 0.3, 0.2
-#define DEST_COLOR 0.2, 0.4, 0.6
+#define SOURCE_COLOR 0.8, 0.3, 0.4
+#define DEST_COLOR 0.2, 0.2, 0.4
static cairo_t *
get_cairo (int width, int height)
@@ -73,8 +73,8 @@ static void
polygon_path (cairo_t *cr)
{
cairo_rel_move_to (cr, 10, 10);
- cairo_rel_line_to (cr, 65, 35);
- cairo_rel_line_to (cr, -38, 35);
+ cairo_rel_line_to (cr, 65, 38);
+ cairo_rel_line_to (cr, -35, 32);
}
static void
@@ -146,10 +146,19 @@ centered_text (cairo_t *cr, double x, double y, const char *text)
cairo_restore (cr);
}
-#define CELL_WIDTH 120
-#define CELL_HEIGHT 130
+#define CELL_WIDTH 128
+#define CELL_HEIGHT 128
#define XPAD (CELL_WIDTH / 4)
-#define YPAD (CELL_WIDTH / 4)
+#define YPAD (32)
+
+static void
+cell_text (cairo_t *cr, double x, double y, const char *text)
+{
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ centered_text (cr,
+ x + CELL_WIDTH / 2.0 - 20.0,
+ y + CELL_HEIGHT - 30, text);
+}
static void
draw_cell (cairo_t *cr,
@@ -183,10 +192,7 @@ draw_cell (cairo_t *cr,
draw_source (cr);
}
- cairo_set_source_rgb (cr, 0, 0, 0);
- centered_text (cr,
- x + CELL_WIDTH / 2.0 - 20.0,
- y + CELL_HEIGHT - 30, name);
+ cell_text (cr, x, y, name);
cairo_restore (cr);
}
@@ -239,6 +245,92 @@ create_porter_duff_table (void)
finish (cr, "table.png");
}
+
+static void
+draw_color_dodge_none (cairo_t *cr, double x, double y)
+{
+ cairo_push_group (cr);
+ cairo_push_group (cr);
+ cairo_set_source_rgb (cr, DEST_COLOR);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_COLOR_DODGE);
+ cairo_set_source_rgb (cr, SOURCE_COLOR);
+ cairo_paint (cr);
+ cairo_pop_group_to_source (cr);
+
+ cairo_move_to (cr, x, y);
+ ampersand_path (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+ cairo_fill (cr);
+
+ cairo_pop_group_to_source (cr);
+
+ cairo_move_to (cr, x, y);
+ polygon_path (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+ cairo_fill (cr);
+}
+
+static void
+draw_color_dodge_source (cairo_t *cr, double x, double y)
+{
+ cairo_push_group (cr);
+
+ cairo_push_group (cr);
+
+ cairo_set_source_rgb (cr, SOURCE_COLOR);
+ cairo_paint (cr);
+
+ cairo_push_group (cr);
+ cairo_set_source_rgb (cr, DEST_COLOR);
+ cairo_paint (cr);
+ cairo_set_source_rgb (cr, SOURCE_COLOR);
+ cairo_set_operator (cr, CAIRO_OPERATOR_COLOR_DODGE);
+ cairo_paint (cr);
+ cairo_pop_group_to_source (cr);
+
+ cairo_move_to (cr, x, y);
+ ampersand_path (cr);
+ cairo_fill (cr);
+
+ cairo_pop_group_to_source (cr);
+
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+ cairo_paint (cr);
+
+ cairo_pop_group_to_source (cr);
+
+ cairo_move_to (cr, x, y);
+ polygon_path (cr);
+
+ cairo_fill (cr);
+}
+
+static void
+draw_color_dodge_dest (cairo_t *cr, double x, double y)
+{
+ cairo_move_to (cr, x, y);
+ draw_dest (cr);
+
+ cairo_push_group (cr);
+ cairo_push_group (cr);
+ cairo_set_source_rgb (cr, DEST_COLOR);
+ cairo_paint (cr);
+ cairo_set_source_rgb (cr, SOURCE_COLOR);
+ cairo_set_operator (cr, CAIRO_OPERATOR_COLOR_DODGE);
+ cairo_paint (cr);
+ cairo_pop_group_to_source (cr);
+ cairo_move_to (cr, x, y);
+ ampersand_path (cr);
+ cairo_fill (cr);
+ cairo_pop_group_to_source (cr);
+ cairo_move_to (cr, x, y);
+ polygon_path (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+ cairo_fill (cr);
+}
+
static void
create_color_dodge_table (void)
{
@@ -260,22 +352,62 @@ create_color_dodge_table (void)
"Dest Over", CAIRO_OPERATOR_DEST_OVER,
};
- cairo_t *cr = get_cairo (CELL_WIDTH * 4 + XPAD,
+ cairo_t *cr = get_cairo (CELL_WIDTH * 4 + XPAD + 140,
(CELL_HEIGHT) * 4 + 2 * YPAD);
+ double x, y;
+ int n_columns = 4;
+
+ int i;
+
+ for (i = YPAD; i < CELL_HEIGHT * 4 + 2 * YPAD; i += 2 * CELL_HEIGHT)
+ {
+ cairo_set_source_rgba (cr, 0, 0, 1, 0.02);
+ cairo_rectangle (cr, 0, i, CELL_WIDTH * 4 + XPAD + 140, CELL_HEIGHT);
+ cairo_fill (cr);
+ }
+
+ cairo_push_group (cr);
+
+ cairo_translate (cr, 140, 8);
+
+ draw_table (cr, ops, sizeof (ops) / sizeof (ops[0]), n_columns);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+
+ x = CELL_WIDTH * (12 % n_columns) + XPAD;
+ y = CELL_HEIGHT * (12 / n_columns) + YPAD;
+ draw_color_dodge_none (cr, x, y);
+ cell_text (cr, x, y, "CDodge None");
+
+ x = CELL_WIDTH * (13 % n_columns) + XPAD;
+ y = CELL_HEIGHT * (13 / n_columns) + YPAD;
+ draw_color_dodge_source (cr, x, y);
+ cell_text (cr, x, y, "CDodge Source");
+
+ x = CELL_WIDTH * (14 % n_columns) + XPAD;
+ y = CELL_HEIGHT * (14 / n_columns) + YPAD;
+ draw_color_dodge_dest (cr, x, y);
+ cell_text (cr, x, y, "CDodge Dest");
+
+ x = CELL_WIDTH * (15 % n_columns) + XPAD;
+ y = CELL_HEIGHT * (15 / n_columns) + YPAD;
+ draw_cell (cr, x, y, CAIRO_OPERATOR_COLOR_DODGE, "");
+ cell_text (cr, x, y, "CDodge Both");
+
+ cairo_pop_group_to_source (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+ cairo_paint (cr);
- draw_table (cr, ops, sizeof (ops) / sizeof (ops[0]), 4);
-
finish (cr, "colordodge-table.png");
}
static void
create_op (cairo_operator_t op, const char *name, const char *filename)
{
- cairo_t *cr = get_cairo (CELL_WIDTH + 20, CELL_HEIGHT);
+ cairo_t *cr = get_cairo (CELL_WIDTH, CELL_HEIGHT);
cairo_move_to (cr, 0, 0);
- draw_cell (cr, 30, 10, op, name);
+ draw_cell (cr, 20, 16, op, name);
finish (cr, filename);
}
@@ -397,109 +529,38 @@ color_dodge_diagram (const char *filename)
}
static void
-color_dodge_atopish (void)
+color_dodge_none (void)
{
- cairo_t *cr = get_cairo (CELL_WIDTH + 20, CELL_HEIGHT);
+ cairo_t *cr = get_cairo (CELL_WIDTH, CELL_HEIGHT);
cairo_pattern_t *pattern;
- cairo_push_group (cr);
-
- cairo_move_to (cr, 0, 0);
-
- cairo_push_group (cr);
-
- cairo_set_source_rgb (cr, SOURCE_COLOR);
- cairo_paint (cr);
-
- cairo_push_group (cr);
- cairo_set_source_rgb (cr, DEST_COLOR);
- cairo_paint (cr);
- cairo_set_source_rgb (cr, SOURCE_COLOR);
- cairo_set_operator (cr, CAIRO_OPERATOR_COLOR_DODGE);
- cairo_paint (cr);
- cairo_pop_group_to_source (cr);
-
- cairo_move_to (cr, 30, 10);
- ampersand_path (cr);
- cairo_fill (cr);
-
- cairo_pop_group_to_source (cr);
-
- cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- cairo_paint (cr);
-
- cairo_pop_group_to_source (cr);
-
- cairo_move_to (cr, 30, 10);
- polygon_path (cr);
+ draw_color_dodge_none (cr, 20, 16);
- cairo_fill (cr);
-
- cairo_set_source_rgb (cr, 0, 0, 0);
- centered_text (cr,
- 30 + CELL_WIDTH / 2.0 - 20.0,
- 10 + CELL_HEIGHT - 30, "asdfasdf");
-
- finish (cr, "colordodge-atopish.png");
+ finish (cr, "colordodge-none.png");
}
static void
-color_dodge_blend_only (void)
+color_dodge_dest (void)
{
- cairo_t *cr = get_cairo (CELL_WIDTH + 20, CELL_HEIGHT);
+ cairo_t *cr = get_cairo (CELL_WIDTH, CELL_HEIGHT);
cairo_pattern_t *pattern;
- cairo_push_group (cr);
- cairo_push_group (cr);
- cairo_set_source_rgb (cr, DEST_COLOR);
- cairo_paint (cr);
- cairo_set_operator (cr, CAIRO_OPERATOR_COLOR_DODGE);
- cairo_set_source_rgb (cr, SOURCE_COLOR);
- cairo_paint (cr);
- cairo_pop_group_to_source (cr);
-
- cairo_move_to (cr, 30, 10);
- ampersand_path (cr);
- cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- cairo_fill (cr);
-
- cairo_pop_group_to_source (cr);
+ draw_color_dodge_dest (cr, 20, 16);
- cairo_move_to (cr, 30, 10);
- polygon_path (cr);
- cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- cairo_fill (cr);
-
- finish (cr, "colordodge-blendonly.png");
+ finish (cr, "colordodge-dest.png");
}
static void
-dest_color_dodge (void)
+color_dodge_source (void)
{
- cairo_t *cr = get_cairo (CELL_WIDTH + 20, CELL_HEIGHT);
+ cairo_t *cr = get_cairo (CELL_WIDTH, CELL_HEIGHT);
cairo_pattern_t *pattern;
- cairo_move_to (cr, 30, 10);
- draw_dest (cr);
+ draw_color_dodge_source (cr, 20, 16);
- cairo_push_group (cr);
- cairo_push_group (cr);
- cairo_set_source_rgb (cr, DEST_COLOR);
- cairo_paint (cr);
- cairo_set_source_rgb (cr, SOURCE_COLOR);
- cairo_set_operator (cr, CAIRO_OPERATOR_COLOR_DODGE);
- cairo_paint (cr);
- cairo_pop_group_to_source (cr);
- cairo_move_to (cr, 30, 10);
- ampersand_path (cr);
- cairo_fill (cr);
- cairo_pop_group_to_source (cr);
- cairo_move_to (cr, 30, 10);
- polygon_path (cr);
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- cairo_fill (cr);
+ cell_text (cr, 20, 16, "asfdasdfasdf");
- finish (cr, "asdf.png");
+ finish (cr, "colordodge-source.png");
}
int
@@ -507,15 +568,17 @@ main (int argc, char *argv)
{
create_op (CAIRO_OPERATOR_SOURCE, "Source", "source.png");
create_op (CAIRO_OPERATOR_DEST, "Destination", "dest.png");
- create_op (CAIRO_OPERATOR_COLOR_DODGE, "Color Dodge", "colordodge.png");
create_op (CAIRO_OPERATOR_DEST_ATOP, "Dest Atop", "destatop.png");
create_op (CAIRO_OPERATOR_OVER, "Over", "over.png");
create_porter_duff_table ();
general_pixel_diagram ("diagram.png");
dest_atop_diagram ("destatop-diagram.png");
color_dodge_diagram ("colordodge-diagram.png");
- color_dodge_atopish ();
- dest_color_dodge ();
- color_dodge_blend_only ();
+
+ color_dodge_none ();
+ color_dodge_source ();
+ color_dodge_dest ();
+ create_op (CAIRO_OPERATOR_COLOR_DODGE, "Color Dodge", "colordodge-both.png");
+
create_color_dodge_table ();
}