counter.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <cairo/cairo.h>
  4. #include "counter.h"
  5. static cairo_surface_t *digits[10];
  6. void counter_init(void) {
  7. char buffer[16];
  8. for (int i = 0; i < 10; i++) {
  9. snprintf(buffer, sizeof(buffer), "./images/%d.png", i);
  10. digits[i] = cairo_image_surface_create_from_png(buffer);
  11. }
  12. }
  13. void counter_release(void) {
  14. for (int i = 0; i < 10; i++)
  15. cairo_surface_destroy(digits[i]);
  16. }
  17. static int count_digits(int number) {
  18. if (number < 10) return 1;
  19. if (number < 100) return 2;
  20. if (number < 1000) return 3;
  21. if (number < 10000) return 4;
  22. if (number < 100000) return 5;
  23. if (number < 1000000) return 6;
  24. if (number < 10000000) return 7;
  25. if (number < 100000000) return 8;
  26. if (number < 1000000000) return 9;
  27. return 10;
  28. }
  29. static int powersof10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
  30. static int nth_digit(int number, int n) {
  31. return (number / powersof10[n]) % 10;
  32. }
  33. void counter_create(int number, char *filename) {
  34. int digits_count;
  35. cairo_surface_t *surface;
  36. cairo_t *cr;
  37. digits_count = count_digits(number);
  38. surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, digits_count * DIGIT_WIDTH, DIGIT_HEIGHT);
  39. cr = cairo_create(surface);
  40. for (int i = 0; i < digits_count; i++) {
  41. cairo_set_source_surface(cr, digits[nth_digit(number, digits_count-1-i)], i * DIGIT_WIDTH, 0);
  42. cairo_paint(cr);
  43. }
  44. cairo_surface_write_to_png(surface, filename);
  45. cairo_surface_destroy(surface);
  46. cairo_destroy(cr);
  47. }