12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #include <math.h>
- #include <stdlib.h>
- #include <string.h>
- #include <png.h>
- #include "counter.h"
- #include "powers_table.h"
- #include "digits_data.h"
- static int count_digits(unsigned long number) {
- for (int i = 1; i < POWERS_COUNT; i++)
- if (number < powers_table[i][0]) return powers_table[i][1];
- return powers_table[POWERS_COUNT-1][1];
- }
- static int nth_digit(unsigned long number, int n) {
- return (number / powers_table[n][0]) % 10;
- }
- void counter_create(unsigned long number, FILE *fd) {
- png_structp png;
- png_infop info;
- int digits_count;
- int width;
- int digits[POWERS_COUNT];
- png_byte **rows;
- png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- info = png_create_info_struct(png);
- digits_count = count_digits(number);
- width = digits_count * DIGIT_WIDTH;
- rows = malloc(sizeof(png_byte *) * DIGIT_HEIGHT);
-
- for (int i = 0; i < digits_count; i++)
- digits[i] = nth_digit(number, digits_count-1-i);
- for (int y = 0; y < DIGIT_HEIGHT; y++) {
- rows[y] = malloc(width * 4);
- for (int i = 0; i < digits_count; i++)
- memcpy(rows[y] + (i * DIGIT_WIDTH * 4), digits_data[digits[i]][y], DIGIT_WIDTH * 4);
- }
- png_init_io(png, fd);
- png_set_IHDR(
- png,
- info,
- width,
- DIGIT_HEIGHT,
- 8,
- PNG_COLOR_TYPE_RGBA,
- PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_BASE,
- PNG_FILTER_TYPE_BASE
- );
- png_write_info(png, info);
- png_write_image(png, rows);
- png_write_end(png, info);
- png_destroy_write_struct(&png, &info);
- for (int y = 0; y < DIGIT_HEIGHT; y++)
- free(rows[y]);
- free(rows);
- }
|