xref: /xnu-11215.41.3/osfmk/console/art/progress.m (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1//
2//cc progress.m -framework AppKit -Wall; ./a.out >/tmp/xx.c; cc /tmp/xx.c -Wall; cat /tmp/xx.c
3
4#import <Foundation/Foundation.h>
5#import <AppKit/AppKit.h>
6#import <stdlib.h>
7#import <stdint.h>
8#include <getopt.h>
9#import <string.h>
10
11
12#define MAX_COLORS 256
13
14typedef struct {
15    uint8_t r;
16    uint8_t g;
17    uint8_t b;
18} pixel_t;
19
20static uint32_t clut_size = 0;
21static pixel_t clut[MAX_COLORS];
22
23static uint8_t
24lookup_color(uint8_t r, uint8_t g, uint8_t b)
25{
26    unsigned int i;
27
28    for (i = 0; i < clut_size; i++) {
29        if (clut[i].r == r &&
30            clut[i].g == g &&
31            clut[i].b == b) {
32          return i;
33        }
34    }
35    if (clut_size >= MAX_COLORS) {
36        printf("Image must have no more than 256 unique pixel colors\n");
37        exit(1);
38    }
39    clut[clut_size].r = r;
40    clut[clut_size].g = g;
41    clut[clut_size].b = b;
42
43  return (uint8_t)clut_size++;
44}
45
46void print_buffer (uint8_t * buffer, size_t width, size_t height, size_t row)
47{
48  printf("{");
49  for (int y = 0; y < height; y++)
50  {
51    printf("\n    ");
52    for (int x = 0; x < width; x++)
53    {
54	printf("0x%02x,", buffer[x + y*row]);
55    }
56  }
57  printf("\n}");
58}
59
60int onefile(const char * filename, int w, int h)
61{
62    int       size;
63    uint8_t   color;
64
65    FILE *file;
66    if ((file = fopen(filename, "r")) == NULL) {
67        fclose(file);
68        printf ("ERROR!!! can not open resource file [%s]\n", filename);
69        return 1;
70    }
71    fclose(file);
72
73    NSString* filePath = [NSString stringWithUTF8String:filename];
74    NSData* fileData = [NSData dataWithContentsOfFile:filePath];
75    NSBitmapImageRep* bitmapImageRep = [[NSBitmapImageRep alloc] initWithData:fileData];
76    NSSize imageSize = [bitmapImageRep size];
77
78    size_t image_length = (int)imageSize.width * (int)imageSize.height;
79    uint8_t* uncompressed_color_buffer = malloc(image_length);
80    uint8_t* uncompressed_alpha_buffer = malloc(image_length);
81
82    bzero(clut, sizeof(clut));
83
84    clut_size = 0;
85    size = 0;
86
87    for (int y = 0; y < imageSize.height; y++) {
88      for (int x = 0; x < imageSize.width; x++) {
89        NSUInteger pixel[4] = {};
90        [bitmapImageRep getPixel:pixel atX:x y:y];
91
92        color = lookup_color((uint8_t)pixel[0],
93                             (uint8_t)pixel[1],
94                             (uint8_t)pixel[2]);
95
96	assert(color <= 1);
97	uint8_t alpha = pixel[3];
98	assert((alpha != 0) == color);
99
100	alpha = 255 - alpha;
101
102        uncompressed_color_buffer[size] = color;
103        uncompressed_alpha_buffer[size] = alpha;
104        size++;
105      }
106    }
107
108    assert(clut_size == 2);
109    assert(clut[0].r == 0);
110    assert(clut[0].g == 0);
111    assert(clut[0].b == 0);
112    assert(clut[1].r == 0xff);
113    assert(clut[1].g == 0xff);
114    assert(clut[1].b == 0xff);
115
116    printf("\n");
117
118    assert(w <= imageSize.width);
119    assert(h <= imageSize.height);
120
121    print_buffer (uncompressed_alpha_buffer, w, h, imageSize.width);
122
123    if (uncompressed_color_buffer != NULL) {
124      free (uncompressed_color_buffer);
125    }
126    if (uncompressed_alpha_buffer != NULL) {
127      free (uncompressed_alpha_buffer);
128    }
129
130    return 0;
131}
132
133
134int main (int argc, char * argv[])
135{
136   printf("#include <stdint.h>\n\n");
137
138
139   printf("\nstatic const unsigned char progressmeter_leftcap1x[2][%d * %d] = {", 9, 18);
140   onefile("ProgressBarFullLeftEndCap.png", 9, 18);
141   printf(",");
142   onefile("ProgressBarEmptyLeftEndCap.png", 9, 18);
143   printf("};\n");
144
145   printf("\nstatic const unsigned char progressmeter_leftcap2x[2][4 * %d * %d] = {", 9, 18);
146   onefile("[email protected]", 2*9, 2*18);
147   printf(",");
148   onefile("[email protected]", 2*9, 2*18);
149   printf("};\n");
150
151   printf("\nstatic const unsigned char progressmeter_middle1x[2][%d * %d] = {", 1, 18);
152   onefile("ProgressBarFullMiddle.png", 1, 18);
153   printf(",");
154   onefile("ProgressBarEmptyMiddle.png", 1, 18);
155   printf("};\n");
156
157   printf("\nstatic const unsigned char progressmeter_middle2x[2][2 * %d * %d] = {", 1, 18);
158   onefile("[email protected]", 1, 2*18);
159   printf(",");
160   onefile("[email protected]", 1, 2*18);
161   printf("};\n");
162
163   printf("\nstatic const unsigned char progressmeter_rightcap1x[2][%d * %d] = {", 9, 18);
164   onefile("ProgressBarFullRightEndCap.png", 9, 18);
165   printf(",");
166   onefile("ProgressBarEmptyRightEndCap.png", 9, 18);
167   printf("};\n");
168
169   printf("\nstatic const unsigned char progressmeter_rightcap2x[2][4 * %d * %d] = {", 9, 18);
170   onefile("[email protected]", 2*9, 2*18);
171   printf(",");
172   onefile("[email protected]", 2*9, 2*18);
173   printf("};\n");
174
175
176}
177
178