indie-raster 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/LICENSE.txt +23 -0
- data/README.md +98 -0
- data/Rakefile +6 -0
- data/build-c/indie-raster +0 -0
- data/docs/PRF.md +41 -0
- data/fonts/README-fonts.md +26 -0
- data/fonts/fonts_prf1/dsm-22-italic.prf1 +0 -0
- data/fonts/fonts_prf1/dsm-22.prf1 +0 -0
- data/fonts/fonts_prf1/dsm-24.prf1 +0 -0
- data/fonts/fonts_prf1/dsm-56-bold-inverted.prf1 +0 -0
- data/fonts/fonts_vector/dsm/DroidSansMono.ttf +0 -0
- data/fonts/fonts_vector/dsm/DroidSansMono.webloc +8 -0
- data/fonts/fonts_vector/dsm/LICENSE.txt +202 -0
- data/fonts/fonts_vector/dsm/chars-all.json +201 -0
- data/fonts/fonts_vector/dsm/chars.json +5 -0
- data/fonts/fonts_vector/dsm/chars.txt +22 -0
- data/fonts/glyphs/dsm-22-italic.png +0 -0
- data/fonts/glyphs/dsm-22.png +0 -0
- data/fonts/glyphs/dsm-24.png +0 -0
- data/fonts/glyphs/dsm-56-bold-inverted.png +0 -0
- data/fonts/make-fonts.sh +20 -0
- data/fonts/scripts/html-entities.json +255 -0
- data/fonts/scripts/pack-font.coffee +55 -0
- data/fonts/scripts/splitter.c +55 -0
- data/fonts/scripts/splitter.sh +5 -0
- data/fonts/scripts/text-from-json.coffee +20 -0
- data/fonts/scripts/util.coffee +39 -0
- data/indie-raster.gemspec +19 -0
- data/make.sh +13 -0
- data/src-c/canvas.c +93 -0
- data/src-c/canvas.h +29 -0
- data/src-c/commands.c +148 -0
- data/src-c/commands.h +26 -0
- data/src-c/fonts.c +66 -0
- data/src-c/fonts.h +26 -0
- data/src-c/main.c +16 -0
- data/src-c/make.sh +11 -0
- data/src-c/pnm.c +109 -0
- data/src-c/pnm.h +20 -0
- data/src-c/session.c +36 -0
- data/src-c/session.h +24 -0
- data/src-c/upc.c +83 -0
- data/src-c/upc.h +9 -0
- data/src-ruby/indie-raster.rb +95 -0
- metadata +99 -0
data/src-c/commands.c
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
|
2
|
+
#include "commands.h"
|
3
|
+
|
4
|
+
|
5
|
+
#define LINEMAX 1000
|
6
|
+
|
7
|
+
void run_commands(Session *s, FILE *f, FILE *outfile) {
|
8
|
+
|
9
|
+
char line[LINEMAX + 1];
|
10
|
+
char *tok;
|
11
|
+
|
12
|
+
while (fgets(line, LINEMAX, f)) {
|
13
|
+
if ((line[0] == '#') || (line[0] == 0)) {
|
14
|
+
continue;
|
15
|
+
}
|
16
|
+
tok = strtok(line, " \t\n");
|
17
|
+
if (!(tok && tok[0])) {
|
18
|
+
continue;
|
19
|
+
}
|
20
|
+
|
21
|
+
if (strcmp(tok, "createBlank") == 0) {
|
22
|
+
long destId = atol(strtok(NULL, " \t\n"));
|
23
|
+
long w = atol(strtok(NULL, " \t\n"));
|
24
|
+
long h = atol(strtok(NULL, " \t\n"));
|
25
|
+
createBlank(s, destId, w, h);
|
26
|
+
}
|
27
|
+
else if (strcmp(tok, "exportP4") == 0) {
|
28
|
+
long srcId = atol(strtok(NULL, " \t\n"));
|
29
|
+
exportP4(s, srcId, outfile);
|
30
|
+
}
|
31
|
+
else if (strcmp(tok, "loadImage") == 0) {
|
32
|
+
long destId = atol(strtok(NULL, " \t\n"));
|
33
|
+
long size = atol(strtok(NULL, " \t\n"));
|
34
|
+
loadImage(s, destId, size, f);
|
35
|
+
}
|
36
|
+
else if (strcmp(tok, "loadFont") == 0) {
|
37
|
+
long destId = atol(strtok(NULL, " \t\n"));
|
38
|
+
long size = atol(strtok(NULL, " \t\n"));
|
39
|
+
loadFont(s, destId, size, f);
|
40
|
+
}
|
41
|
+
else if (strcmp(tok, "drawImage") == 0) {
|
42
|
+
long destId = atol(strtok(NULL, " \t\n"));
|
43
|
+
long x = atol(strtok(NULL, " \t\n"));
|
44
|
+
long y = atol(strtok(NULL, " \t\n"));
|
45
|
+
long srcId = atol(strtok(NULL, " \t\n"));
|
46
|
+
drawImage(s, destId, x, y, srcId);
|
47
|
+
}
|
48
|
+
else if (strcmp(tok, "drawUPC") == 0) {
|
49
|
+
long destId = atol(strtok(NULL, " \t\n"));
|
50
|
+
long x = atol(strtok(NULL, " \t\n"));
|
51
|
+
long y = atol(strtok(NULL, " \t\n"));
|
52
|
+
char *digits = strtok(NULL, " \t\n");
|
53
|
+
long w = atol(strtok(NULL, " \t\n"));
|
54
|
+
long h = atol(strtok(NULL, " \t\n"));
|
55
|
+
long extraHeight = atol(strtok(NULL, " \t\n"));
|
56
|
+
drawUPC(s, destId, x, y, digits, w, h, extraHeight);
|
57
|
+
}
|
58
|
+
else if (strcmp(tok, "drawText") == 0) {
|
59
|
+
long destId = atol(strtok(NULL, " \t\n"));
|
60
|
+
long x0 = atol(strtok(NULL, " \t\n"));
|
61
|
+
long y0 = atol(strtok(NULL, " \t\n"));
|
62
|
+
long fontId = atol(strtok(NULL, " \t\n"));
|
63
|
+
long numChars = atol(strtok(NULL, " \t\n"));
|
64
|
+
drawText(s, destId, x0, y0, fontId, numChars, f);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
|
70
|
+
void createBlank(Session *s, long destId, long w, long h) {
|
71
|
+
Canvas *c = Canvas_new(w, h);
|
72
|
+
Session_setCanvas(s, destId, c);
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
void exportP4(Session *s, long srcId, FILE *outfile) {
|
77
|
+
Canvas *c = Session_getCanvas(s, srcId);
|
78
|
+
Canvas_writeP4(c, outfile);
|
79
|
+
}
|
80
|
+
|
81
|
+
|
82
|
+
void loadImage(Session *s, long destId, long size, FILE *f) {
|
83
|
+
Canvas *c = Canvas_readImage(f);
|
84
|
+
Session_setCanvas(s, destId, c);
|
85
|
+
}
|
86
|
+
|
87
|
+
|
88
|
+
void loadFont(Session *s, long destId, long size, FILE *f) {
|
89
|
+
|
90
|
+
Font *font = fonts_readFont(f);
|
91
|
+
Session_setItem(s, destId, (void *)font);
|
92
|
+
}
|
93
|
+
|
94
|
+
void drawText(Session *s, long destId, long x0, long y0, long fontId, long numChars, FILE *f) {
|
95
|
+
|
96
|
+
long size = numChars * 4;
|
97
|
+
void *text = malloc(size);
|
98
|
+
fread(text, 1, size, f);
|
99
|
+
|
100
|
+
Canvas *c = Session_getCanvas(s, destId);
|
101
|
+
Font *font = (Font *)Session_getItem(s, fontId);
|
102
|
+
|
103
|
+
fonts_drawText(c, font, numChars, (uint32_t*)text, x0, y0);
|
104
|
+
|
105
|
+
free(text);
|
106
|
+
}
|
107
|
+
|
108
|
+
|
109
|
+
void drawImage(Session *s, long destId, long x, long y, long srcId) {
|
110
|
+
Canvas *src = Session_getCanvas(s, srcId);
|
111
|
+
Canvas *dest = Session_getCanvas(s, destId);
|
112
|
+
|
113
|
+
Canvas_drawOnto(src, dest, x, y);
|
114
|
+
}
|
115
|
+
|
116
|
+
|
117
|
+
void drawUPC(Session *s, long destId, long x0, long y0, char *digits, long w, long h, long extraHeight) {
|
118
|
+
|
119
|
+
Canvas *dest = Session_getCanvas(s, destId);
|
120
|
+
long y, bar, dest_x, dest_y;
|
121
|
+
int barWidth = w / 95;
|
122
|
+
|
123
|
+
char *bitstring = upc_bitstring(digits);
|
124
|
+
|
125
|
+
// This could be optimized if needed.
|
126
|
+
for (y = 0; y < (h + extraHeight); y++) {
|
127
|
+
dest_y = y + y0;
|
128
|
+
if (dest_y < dest->h) {
|
129
|
+
for (bar = 0; bar < 95; bar++) {
|
130
|
+
if ((y < h) || upc_bar_is_guard_bar(bar)) {
|
131
|
+
for (
|
132
|
+
dest_x = (x0 + (barWidth * bar));
|
133
|
+
dest_x < (x0 + (barWidth * (bar + 1)));
|
134
|
+
dest_x++) {
|
135
|
+
if (dest_x < dest->w) {
|
136
|
+
dest->pixels[(dest_y * dest->w) + dest_x] = ((bitstring[bar] == '1')) ? 0 : 255;
|
137
|
+
}
|
138
|
+
}
|
139
|
+
}
|
140
|
+
}
|
141
|
+
}
|
142
|
+
}
|
143
|
+
free(bitstring);
|
144
|
+
}
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
|
data/src-c/commands.h
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
#ifndef COMMANDS_INCLUDED
|
3
|
+
#define COMMANDS_INCLUDED
|
4
|
+
|
5
|
+
#include <stdio.h>
|
6
|
+
#include <string.h>
|
7
|
+
#include <stdint.h>
|
8
|
+
#include <stdlib.h>
|
9
|
+
|
10
|
+
#include "upc.h"
|
11
|
+
#include "session.h"
|
12
|
+
#include "canvas.h"
|
13
|
+
#include "fonts.h"
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
void run_commands(Session *s, FILE *f, FILE *outfile);
|
18
|
+
void createBlank(Session *s, long destId, long w, long h);
|
19
|
+
void exportP4(Session *s, long srcId, FILE *outfile);
|
20
|
+
void loadImage(Session *s, long destId, long size, FILE *f);
|
21
|
+
void loadFont(Session *s, long destId, long size, FILE *f);
|
22
|
+
void drawText(Session *s, long destId, long x, long y, long fontId, long numChars, FILE *f);
|
23
|
+
void drawImage(Session *s, long destId, long x, long y, long srcId);
|
24
|
+
void drawUPC(Session *s, long destId, long x, long y, char *digits, long w, long h, long extraHeight);
|
25
|
+
|
26
|
+
#endif
|
data/src-c/fonts.c
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
#include "fonts.h"
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
Font *fonts_readFont(FILE *f) {
|
7
|
+
|
8
|
+
Font *font = (Font *)(malloc(sizeof(Font)));
|
9
|
+
|
10
|
+
uint32_t u32, size, i;
|
11
|
+
|
12
|
+
// "PRF1"
|
13
|
+
char magic[4];
|
14
|
+
fread(magic, 1, 4, f);
|
15
|
+
|
16
|
+
// uint32 num_chars
|
17
|
+
fread(&u32, 1, 4, f);
|
18
|
+
font->numChars = u32;
|
19
|
+
|
20
|
+
// uint32 image_width
|
21
|
+
fread(&u32, 1, 4, f);
|
22
|
+
font->w = u32;
|
23
|
+
|
24
|
+
// uint32 image_height
|
25
|
+
fread(&u32, 1, 4, f);
|
26
|
+
font->h = u32;
|
27
|
+
|
28
|
+
|
29
|
+
// uint32+ char_codes
|
30
|
+
size = 4 * font->numChars;
|
31
|
+
font->codepoints = (uint32_t *)malloc(size);
|
32
|
+
fread(font->codepoints, 1, size, f);
|
33
|
+
|
34
|
+
// uint32+ image_byte_offets
|
35
|
+
// (ignore them)
|
36
|
+
size = 4 * font->numChars;
|
37
|
+
void *temp = malloc(size);
|
38
|
+
fread(temp, 1, size, f);
|
39
|
+
free(temp);
|
40
|
+
|
41
|
+
// data+ images
|
42
|
+
font->glyphs = (Canvas **)(malloc(sizeof(Canvas *) * font->numChars));
|
43
|
+
for (i = 0; i < font->numChars; i++) {
|
44
|
+
font->glyphs[i] = Canvas_readImage(f);
|
45
|
+
}
|
46
|
+
|
47
|
+
return font;
|
48
|
+
}
|
49
|
+
|
50
|
+
|
51
|
+
void fonts_drawText(Canvas *c, Font *font, long numChars, uint32_t *text, long x0, long y0) {
|
52
|
+
|
53
|
+
uint32_t i, j, codepoint;
|
54
|
+
long x = x0;
|
55
|
+
|
56
|
+
for(i = 0; i < numChars; i++) {
|
57
|
+
codepoint = text[i];
|
58
|
+
for(j = 0; j < font->numChars; j++) {
|
59
|
+
if (font->codepoints[j] == codepoint) {
|
60
|
+
Canvas_drawOnto(font->glyphs[j], c, x, y0);
|
61
|
+
x += font->w;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
data/src-c/fonts.h
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
#ifndef FONTS_INCLUDED
|
3
|
+
#define FONTS_INCLUDED
|
4
|
+
|
5
|
+
#include <stdint.h>
|
6
|
+
#include <stdlib.h>
|
7
|
+
#include "canvas.h"
|
8
|
+
|
9
|
+
|
10
|
+
typedef struct {
|
11
|
+
|
12
|
+
uint32_t numChars;
|
13
|
+
uint32_t w;
|
14
|
+
uint32_t h;
|
15
|
+
|
16
|
+
uint32_t *codepoints;
|
17
|
+
Canvas **glyphs;
|
18
|
+
|
19
|
+
} Font;
|
20
|
+
|
21
|
+
|
22
|
+
Font *fonts_readFont(FILE *f);
|
23
|
+
void fonts_drawText(Canvas *c, Font *font, long numChars, uint32_t *text, long x0, long y0);
|
24
|
+
|
25
|
+
|
26
|
+
#endif
|
data/src-c/main.c
ADDED
data/src-c/make.sh
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
gcc \
|
4
|
+
-o ../build-c/indie-raster \
|
5
|
+
canvas.c commands.c fonts.c main.c session.c upc.c pnm.c
|
6
|
+
|
7
|
+
# -O2 \
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
# bash make.sh && cat ../example/commands2 | ../build-c/indie-raster > temp.pbm && convert temp.pbm temp.png && open temp.png
|
data/src-c/pnm.c
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <string.h>
|
4
|
+
#include <stdlib.h>
|
5
|
+
#include "pnm.h"
|
6
|
+
|
7
|
+
#define UTIL_PNM_LINE_MAX 100
|
8
|
+
|
9
|
+
|
10
|
+
void util_read_pnm_header(FILE *f, int *p, long *w, long *h, int *maxValue) {
|
11
|
+
// Note: standard whitespace assumed
|
12
|
+
|
13
|
+
char line[UTIL_PNM_LINE_MAX + 1];
|
14
|
+
char *tok;
|
15
|
+
|
16
|
+
// "P4\n"
|
17
|
+
fgets(line, UTIL_PNM_LINE_MAX, f);
|
18
|
+
*p = line[1] - 0x30;
|
19
|
+
|
20
|
+
// "300 200\n"
|
21
|
+
fgets(line, UTIL_PNM_LINE_MAX, f);
|
22
|
+
tok = strtok(line, " \n");
|
23
|
+
*w = atol(tok);
|
24
|
+
tok = strtok(NULL, " \n");
|
25
|
+
*h = atol(tok);
|
26
|
+
|
27
|
+
if ((*p == 4) || (*p == 1)) {
|
28
|
+
*maxValue = 1;
|
29
|
+
}
|
30
|
+
else {
|
31
|
+
fgets(line, UTIL_PNM_LINE_MAX, f);
|
32
|
+
*maxValue = atoi(line);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
|
37
|
+
//### P6
|
38
|
+
|
39
|
+
void util_write_p6(FILE *f, long w, long h, unsigned char *pixels) {
|
40
|
+
fprintf(f, "P6\n%ld %ld\n255\n", w, h);
|
41
|
+
//fwrite(TODO);
|
42
|
+
}
|
43
|
+
|
44
|
+
//### P5
|
45
|
+
|
46
|
+
void util_write_p5(FILE *f, long w, long h, unsigned char *pixels) {
|
47
|
+
fprintf(f, "P5\n%ld %ld\n255\n", w, h);
|
48
|
+
//fwrite(TODO);
|
49
|
+
}
|
50
|
+
|
51
|
+
//### P4
|
52
|
+
|
53
|
+
void util_write_p4(FILE *f, long w, long h, unsigned char *pixels) {
|
54
|
+
fprintf(f, "P4\n%ld %ld\n", w, h);
|
55
|
+
util_write_p4_body(f, w, h, pixels);
|
56
|
+
}
|
57
|
+
|
58
|
+
|
59
|
+
void util_write_p4_body(FILE *f, long w, long h, unsigned char *pixels) {
|
60
|
+
util_write_p4_body_from_subrect(f, 0, 0, w, h, w, pixels);
|
61
|
+
}
|
62
|
+
|
63
|
+
void util_write_p4_body_from_subrect(FILE *f, long x0, long y0, long w, long h, long pixels_w, unsigned char *pixels) {
|
64
|
+
long pos, x, y;
|
65
|
+
int c, i, value;
|
66
|
+
c = 0;
|
67
|
+
for (y = y0; y < (h + y0); y++) {
|
68
|
+
i = 0;
|
69
|
+
for (x = x0; x < (w + x0); x++) {
|
70
|
+
pos = (y * (pixels_w)) + x;
|
71
|
+
value = ((pixels[pos] > 127) ? 0 : 1); // 1 is black
|
72
|
+
c |= (value << (7 - i));
|
73
|
+
|
74
|
+
// Write byte?
|
75
|
+
if ((i == 7) || (x == ((w + x0) - 1))) {
|
76
|
+
fputc(c, f);
|
77
|
+
c = 0;
|
78
|
+
}
|
79
|
+
|
80
|
+
i = (i + 1) % 8;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
void util_read_p4_body(FILE *f, long w, long h, unsigned char **pixels_) {
|
87
|
+
|
88
|
+
int i, c;
|
89
|
+
long x, y, pos;
|
90
|
+
unsigned char *pixels;
|
91
|
+
|
92
|
+
pixels = (unsigned char *)malloc(w * h);
|
93
|
+
|
94
|
+
pos = 0;
|
95
|
+
for (y = 0; y < h; y++) {
|
96
|
+
for (x = 0; x < w; x++) {
|
97
|
+
i = x % 8;
|
98
|
+
if (i == 0) {
|
99
|
+
c = fgetc(f);
|
100
|
+
//ASSERT c > 0
|
101
|
+
}
|
102
|
+
pixels[pos] = ((c >> (7 - i)) & 1) ? 0 : 255;
|
103
|
+
pos++;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
*pixels_ = pixels;
|
108
|
+
}
|
109
|
+
|
data/src-c/pnm.h
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
#ifndef UTIL_PNM_INCLUDED
|
3
|
+
#define UTIL_PNM_INCLUDED
|
4
|
+
|
5
|
+
#include <stdio.h>
|
6
|
+
|
7
|
+
|
8
|
+
void util_read_pnm_header(FILE *f, int *p, long *w, long *h, int *maxValue);
|
9
|
+
|
10
|
+
void util_write_p6(FILE *f, long w, long h, unsigned char *pixels);
|
11
|
+
|
12
|
+
void util_write_p5(FILE *f, long w, long h, unsigned char *pixels);
|
13
|
+
|
14
|
+
void util_write_p4(FILE *f, long w, long h, unsigned char *pixels);
|
15
|
+
void util_write_p4_body(FILE *f, long w, long h, unsigned char *pixels);
|
16
|
+
void util_write_p4_body_from_subrect(FILE *f, long x0, long y0, long w, long h, long pixels_w, unsigned char *pixels);
|
17
|
+
void util_read_p4_body(FILE *f, long w, long h, unsigned char **pixels_);
|
18
|
+
|
19
|
+
|
20
|
+
#endif
|
data/src-c/session.c
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include "session.h"
|
4
|
+
|
5
|
+
|
6
|
+
Session* Session_new() {
|
7
|
+
Session *s = (Session*)calloc(1, sizeof(Session));
|
8
|
+
return s;
|
9
|
+
}
|
10
|
+
|
11
|
+
|
12
|
+
void Session_free(Session **s) {
|
13
|
+
free(*s);
|
14
|
+
*s = NULL;
|
15
|
+
}
|
16
|
+
|
17
|
+
|
18
|
+
void Session_setCanvas(Session *s, long id, Canvas *canvas) {
|
19
|
+
Session_setItem(s, id, (void*)canvas);
|
20
|
+
}
|
21
|
+
|
22
|
+
|
23
|
+
Canvas * Session_getCanvas(Session *s, long id) {
|
24
|
+
return (Canvas *)Session_getItem(s, id);
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
void Session_setItem(Session *s, long id, void *data) {
|
29
|
+
s->items[id] = data;
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
void * Session_getItem(Session *s, long id) {
|
34
|
+
return s->items[id];
|
35
|
+
}
|
36
|
+
|
data/src-c/session.h
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
#ifndef SESSION_INCLUDED
|
3
|
+
#define SESSION_INCLUDED
|
4
|
+
|
5
|
+
#include "canvas.h"
|
6
|
+
|
7
|
+
|
8
|
+
typedef struct {
|
9
|
+
|
10
|
+
long numBins;
|
11
|
+
|
12
|
+
void *items[1000];
|
13
|
+
|
14
|
+
} Session;
|
15
|
+
|
16
|
+
Session* Session_new();
|
17
|
+
void Session_free(Session **s);
|
18
|
+
void Session_setCanvas(Session *s, long id, Canvas *canvas);
|
19
|
+
Canvas * Session_getCanvas(Session *s, long id);
|
20
|
+
void Session_setItem(Session *s, long id, void *data);
|
21
|
+
void * Session_getItem(Session *s, long id);
|
22
|
+
|
23
|
+
#endif
|
24
|
+
|
data/src-c/upc.c
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include <stdio.h>
|
4
|
+
#include <string.h>
|
5
|
+
|
6
|
+
#include "upc.h"
|
7
|
+
|
8
|
+
/*
|
9
|
+
Note: 1 is black
|
10
|
+
|
11
|
+
101 0 1 2
|
12
|
+
0101111 3 4 5 6 7 8 9
|
13
|
+
0101111 10
|
14
|
+
0101111 17
|
15
|
+
0101111 24
|
16
|
+
0101111 31
|
17
|
+
0101111 38 ... 44
|
18
|
+
01010 45 ... 49
|
19
|
+
1100110 50 ...
|
20
|
+
1100110 57
|
21
|
+
1100110 64
|
22
|
+
1100110 71
|
23
|
+
1100110 78
|
24
|
+
1100110 85 ... 91
|
25
|
+
101 92 93 94
|
26
|
+
*/
|
27
|
+
|
28
|
+
char *LEFT_DIGITS[] = {
|
29
|
+
(char*)"0001101",
|
30
|
+
(char*)"0011001",
|
31
|
+
(char*)"0010011",
|
32
|
+
(char*)"0111101",
|
33
|
+
(char*)"0100011",
|
34
|
+
(char*)"0110001",
|
35
|
+
(char*)"0101111",
|
36
|
+
(char*)"0111011",
|
37
|
+
(char*)"0110111",
|
38
|
+
(char*)"0001011"
|
39
|
+
};
|
40
|
+
|
41
|
+
char *RIGHT_DIGITS[] = {
|
42
|
+
(char*)"1110010",
|
43
|
+
(char*)"1100110",
|
44
|
+
(char*)"1101100",
|
45
|
+
(char*)"1000010",
|
46
|
+
(char*)"1011100",
|
47
|
+
(char*)"1001110",
|
48
|
+
(char*)"1010000",
|
49
|
+
(char*)"1000100",
|
50
|
+
(char*)"1001000",
|
51
|
+
(char*)"1110100"
|
52
|
+
};
|
53
|
+
|
54
|
+
|
55
|
+
int upc_bar_is_guard_bar(int bar) {
|
56
|
+
return (bar < (0 + 3)) || (bar > (94 - 3)) || ((bar >= 45) && (bar < (45 + 5)));
|
57
|
+
}
|
58
|
+
|
59
|
+
|
60
|
+
char* upc_bitstring(char *digits) {
|
61
|
+
|
62
|
+
int i;
|
63
|
+
|
64
|
+
// Blank string
|
65
|
+
char *bs = (char*)malloc(95 + 1);
|
66
|
+
bs[95] = 0;
|
67
|
+
|
68
|
+
// Guard bars
|
69
|
+
strncpy(&(bs[0]), "101", 3);
|
70
|
+
strncpy(&(bs[45]), "01010", 5);
|
71
|
+
strncpy(&(bs[92]), "101", 3);
|
72
|
+
|
73
|
+
// Digits
|
74
|
+
for (i = 0; i < 6; i++) {
|
75
|
+
strncpy(&(bs[3 + 7 * i]), LEFT_DIGITS[digits[i] - 0x30], 7);
|
76
|
+
}
|
77
|
+
for (i = 0; i < 6; i++) {
|
78
|
+
strncpy(&(bs[50 + 7 * i]), RIGHT_DIGITS[digits[i + 6] - 0x30], 7);
|
79
|
+
}
|
80
|
+
|
81
|
+
return bs;
|
82
|
+
}
|
83
|
+
|
data/src-c/upc.h
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
|
2
|
+
require 'Open3'
|
3
|
+
|
4
|
+
|
5
|
+
def ascii_to_utf32(str)
|
6
|
+
arr = []
|
7
|
+
str.split('').each do |c|
|
8
|
+
arr.push c, "\000\000\000"
|
9
|
+
end
|
10
|
+
return arr.join('')
|
11
|
+
end
|
12
|
+
|
13
|
+
def ith_byte(i, str)
|
14
|
+
x = str[i]
|
15
|
+
x = x.ord if x.class == String # Ruby 1.9+
|
16
|
+
return x
|
17
|
+
end
|
18
|
+
|
19
|
+
def dataFromOpt(opt)
|
20
|
+
if opt[:data]
|
21
|
+
return opt[:data]
|
22
|
+
elsif opt[:path]
|
23
|
+
File.open(opt[:path], "r") do |f|
|
24
|
+
return f.read
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
class IndieRasterSession
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
@c = []
|
34
|
+
@fonts = {}
|
35
|
+
end
|
36
|
+
|
37
|
+
def createBlank(opt)
|
38
|
+
@c.push "createBlank #{opt[:id] or 1} #{opt[:w]} #{opt[:h]}\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
def loadImage(opt)
|
42
|
+
data = dataFromOpt opt
|
43
|
+
@c.push "loadImage #{opt[:id]} #{data.length}\n"
|
44
|
+
@c.push data
|
45
|
+
end
|
46
|
+
|
47
|
+
def loadFont(opt)
|
48
|
+
data = dataFromOpt opt
|
49
|
+
@fonts[opt[:id]] = data
|
50
|
+
@c.push "loadFont #{opt[:id]} #{data.length}\n"
|
51
|
+
@c.push data
|
52
|
+
end
|
53
|
+
|
54
|
+
def drawImage(opt)
|
55
|
+
@c.push "drawImage #{opt[:on] or 1} #{opt[:x]} #{opt[:y]} #{opt[:id]}\n"
|
56
|
+
end
|
57
|
+
|
58
|
+
def widthOfText(opt)
|
59
|
+
glyphWidth = ith_byte 8, @fonts[opt[:font]] #ASSUMPTION: glyph width < 256px
|
60
|
+
return glyphWidth * opt[:text].length
|
61
|
+
end
|
62
|
+
|
63
|
+
def drawText(opt)
|
64
|
+
data = ascii_to_utf32 opt[:text]
|
65
|
+
if opt[:toLeftOf]
|
66
|
+
opt[:x] = opt[:toLeftOf] - self.widthOfText(opt)
|
67
|
+
end
|
68
|
+
@c.push "drawText #{opt[:on] or 1} #{opt[:x]} #{opt[:y]} #{opt[:font]} #{data.length / 4}\n"
|
69
|
+
@c.push data
|
70
|
+
end
|
71
|
+
|
72
|
+
def drawUPC(opt)
|
73
|
+
@c.push "drawUPC #{opt[:on] or 1} #{opt[:x]} #{opt[:y]} #{opt[:digits]} #{opt[:w]} #{opt[:h]} #{opt[:guard_bar_extra_h] or 0} #{opt[:middle_font] or 0} #{opt[:side_font] or 0}\n"
|
74
|
+
end
|
75
|
+
|
76
|
+
def exportP4(opt = {})
|
77
|
+
|
78
|
+
@c.push "exportP4 #{opt[:id] or 1}\n"
|
79
|
+
|
80
|
+
cmd = File.expand_path(File.dirname(__FILE__) + "/../build-c/indie-raster")
|
81
|
+
input = @c.join ''
|
82
|
+
|
83
|
+
stdin, stdout, stderr = Open3.popen3 cmd
|
84
|
+
stdin.puts input
|
85
|
+
stdin.close
|
86
|
+
code = $?.to_i
|
87
|
+
out = stdout.read
|
88
|
+
err = stderr.read
|
89
|
+
#TODO handle error
|
90
|
+
|
91
|
+
return out
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|