Commit 1954e349b19978c7e219c6610f4b143d6658af82
Add min scaling factor
Charles Lehner committed on 2/10/2015, 2:02:33 PMParent: c52a3123eba4e4c49aabce41af35e284092287ad
Files changed
main.c | changed |
pngspark.c | changed |
pngspark.h | changed |
main.c | ||
---|---|---|
@@ -18,16 +18,17 @@ | ||
18 | 18 … | { |
19 | 19 … | struct pngspark ps; |
20 | 20 … | const char *color = "#000000"; |
21 | 21 … | const char *filename = "pngspark.png"; |
22 … | + double scaling = 0.8; | |
22 | 23 … | int height = 10; |
23 | 24 … | |
24 | 25 … | for (int i = 1; i < argc; i++) { |
25 | 26 … | if (argv[i][0] != '-') continue; |
26 | 27 … | if (argv[i][1] == '-') { |
27 | 28 … | if (!strcmp("help", argv[i]+2)) { |
28 | 29 … | errx(1, "Usage: %s [--help] [-h height] " |
29 | - "[-o output.png] [-c color]", argv[0]); | |
30 … | + "[-o output.png] [-c color] [-s scale_min]", argv[0]); | |
30 | 31 … | } |
31 | 32 … | } else if (!argv[i][2]) switch (argv[i][1]) { |
32 | 33 … | case 'c': |
33 | 34 … | if (++i < argc) color = argv[i]; |
@@ -37,15 +38,18 @@ | ||
37 | 38 … | break; |
38 | 39 … | case 'h': |
39 | 40 … | if (++i < argc) height = atoi(argv[i]); |
40 | 41 … | break; |
42 … | + case 's': | |
43 … | + if (++i < argc) scaling = atof(argv[i]); | |
44 … | + break; | |
41 | 45 … | } |
42 | 46 … | } |
43 | 47 … | |
44 | 48 … | FILE *file = fopen(filename, "w"); |
45 | 49 … | if (!file) err(1, "unable to open file %s", filename); |
46 | 50 … | |
47 | - if (pngspark_init(&ps, height, color) < 0) | |
51 … | + if (pngspark_init(&ps, height, color, scaling) < 0) | |
48 | 52 … | return 1; |
49 | 53 … | |
50 | 54 … | char c; |
51 | 55 … | char buffer[32]; |
pngspark.c | ||
---|---|---|
@@ -1,7 +1,8 @@ | ||
1 … | + | |
2 … | + | |
1 | 3 … | |
2 | 4 … | |
3 | - | |
4 | 5 … | |
5 | 6 … | |
6 | 7 … | |
7 | 8 … | |
@@ -16,17 +17,20 @@ | ||
16 | 17 … | return 0xff000000 | |
17 | 18 … | ((color >> 16) | (color & 0x00ff00) | (color & 0xff) << 16); |
18 | 19 … | } |
19 | 20 … | |
20 | -int pngspark_init(struct pngspark *ps, size_t height, const char *color) | |
21 … | +int pngspark_init(struct pngspark *ps, size_t height, const char *color, | |
22 … | + double scaling) | |
21 | 23 … | { |
22 | 24 … | ps->size = initial_size; |
23 | 25 … | ps->num_values = 0; |
24 | 26 … | ps->values = malloc(initial_size * sizeof(double)); |
25 | 27 … | if (!ps->values) return 1; |
26 | 28 … | ps->color = parse_color(color); |
27 | 29 … | ps->height = height; |
28 | 30 … | ps->max_value = 0; |
31 … | + ps->min_value = DBL_MAX; | |
32 … | + ps->scaling = scaling; | |
29 | 33 … | return 0; |
30 | 34 … | } |
31 | 35 … | |
32 | 36 … | int pngspark_append(struct pngspark *ps, double value) |
@@ -38,8 +42,10 @@ | ||
38 | 42 … | } |
39 | 43 … | ps->values[i] = value; |
40 | 44 … | if (value > ps->max_value) |
41 | 45 … | ps->max_value = value; |
46 … | + if (value < ps->min_value) | |
47 … | + ps->min_value = value; | |
42 | 48 … | return 0; |
43 | 49 … | } |
44 | 50 … | |
45 | 51 … | static size_t write_fd(const void *ptr, size_t size, size_t count, |
@@ -57,12 +63,13 @@ | ||
57 | 63 … | |
58 | 64 … | double *values = ps->values; |
59 | 65 … | uint32_t *pixels = (uint32_t *)img->data; |
60 | 66 … | uint32_t color = ps->color; |
61 | - double height_scale = (double)height / (double)ps->max_value; | |
67 … | + ps->min_value *= ps->scaling; | |
68 … | + double height_scale = (double)height / (ps->max_value - ps->min_value); | |
62 | 69 … | |
63 | 70 … | for (size_t x = 0; x < width; x++) { |
64 | - size_t value = height - (values[x] * height_scale); | |
71 … | + size_t value = height - ((values[x] - ps->min_value) * height_scale); | |
65 | 72 … | for (size_t y = 0; y < value; y++) |
66 | 73 … | pixels[x + width * y] = 0; |
67 | 74 … | for (size_t y = value; y < height; y++) |
68 | 75 … | pixels[x + width * y] = color; |
pngspark.h | |||
---|---|---|---|
@@ -5,15 +5,17 @@ | |||
5 | 5 … | ||
6 | 6 … | struct pngspark { | |
7 | 7 … | size_t num_values; | |
8 | 8 … | size_t size; | |
9 | - size_t max_value; | ||
10 | 9 … | size_t height; | |
11 | 10 … | uint32_t color; | |
12 | 11 … | double *values; | |
12 … | + double max_value; | ||
13 … | + double min_value; | ||
14 … | + double scaling; | ||
13 | 15 … | }; | |
14 | 16 … | ||
15 | -int pngspark_init(struct pngspark *, size_t, const char *); | ||
17 … | +int pngspark_init(struct pngspark *, size_t, const char *, double); | ||
16 | 18 … | int pngspark_append(struct pngspark *, double); | |
17 | 19 … | int pngspark_write(struct pngspark *, FILE *); | |
18 | 20 … | int pngspark_end(struct pngspark *); | |
19 | 21 … |
Built with git-ssb-web