| 
					
				 | 
			
			
				@@ -0,0 +1,60 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <math.h>
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <stdio.h>
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <cairo/cairo.h>
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "counter.h"
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static cairo_surface_t *digits[10];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void counter_init(void) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char buffer[16];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (int i = 0; i < 10; i++) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    snprintf(buffer, sizeof(buffer), "./images/%d.png", i);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    digits[i] = cairo_image_surface_create_from_png(buffer);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void counter_release(void) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (int i = 0; i < 10; i++)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cairo_surface_destroy(digits[i]);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int count_digits(int number) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 10) return 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 100) return 2;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 1000) return 3;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 10000) return 4;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 100000) return 5;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 1000000) return 6;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 10000000) return 7;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 100000000) return 8;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (number < 1000000000) return 9;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return 10;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int powersof10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int nth_digit(int number, int n) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return (number / powersof10[n]) % 10;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void counter_create(int number, char *filename) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  int digits_count;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cairo_surface_t *surface;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cairo_t *cr;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  digits_count = count_digits(number);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, digits_count * DIGIT_WIDTH, DIGIT_HEIGHT);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cr = cairo_create(surface);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (int i = 0; i < digits_count; i++) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cairo_set_source_surface(cr, digits[nth_digit(number, digits_count-1-i)], i * DIGIT_WIDTH, 0);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cairo_paint(cr);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cairo_surface_write_to_png(surface, filename);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cairo_surface_destroy(surface);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cairo_destroy(cr);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 |