potracer 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/potracer/potracer.c +45 -0
- data/ext/potracer/potracer.h +4 -0
- metadata +1 -1
data/ext/potracer/potracer.c
CHANGED
@@ -163,6 +163,50 @@ trace_trace (VALUE obj, VALUE bitmap, VALUE params)
|
|
163
163
|
return obj;
|
164
164
|
}
|
165
165
|
|
166
|
+
static VALUE
|
167
|
+
trace_as_svg (VALUE klass)
|
168
|
+
{
|
169
|
+
FILE *out = tmpfile();
|
170
|
+
char *out_buffer;
|
171
|
+
long size;
|
172
|
+
potrace_path_t *path;
|
173
|
+
int i, num_segments, *tag;
|
174
|
+
potrace_dpoint_t (*c)[3];
|
175
|
+
potrace_state_t *trace = NULL;
|
176
|
+
Data_Get_Struct(klass, potrace_state_t, trace);
|
177
|
+
|
178
|
+
fprintf(out, "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">");
|
179
|
+
fprintf(out, "<path fill-rule=\"evenodd\" fill=\"rgb(0,0,0)\" d=\"");
|
180
|
+
if (trace->status == POTRACE_STATUS_OK) {
|
181
|
+
path = trace->plist;
|
182
|
+
while (path != NULL) {
|
183
|
+
num_segments = path->curve.n;
|
184
|
+
tag = path->curve.tag;
|
185
|
+
c = path->curve.c;
|
186
|
+
SVG_MOVE_TO(out, c[num_segments-1][2]);
|
187
|
+
for (i = 0; i < num_segments; i++) {
|
188
|
+
switch (tag[i]) {
|
189
|
+
case POTRACE_CORNER:
|
190
|
+
SVG_LINE_TO(out, c[i][1]);
|
191
|
+
SVG_LINE_TO(out, c[i][2]);
|
192
|
+
break;
|
193
|
+
case POTRACE_CURVETO:
|
194
|
+
SVG_CURVE_TO(out, c[i]);
|
195
|
+
break;
|
196
|
+
}
|
197
|
+
}
|
198
|
+
path = path->next;
|
199
|
+
}
|
200
|
+
}
|
201
|
+
fprintf(out, "\" /></svg>");
|
202
|
+
|
203
|
+
size = ftell(out);
|
204
|
+
out_buffer = ALLOC_N(char, size);
|
205
|
+
rewind(out);
|
206
|
+
fread(out_buffer, 1, size, out);
|
207
|
+
return rb_str_new2(out_buffer);
|
208
|
+
}
|
209
|
+
|
166
210
|
static VALUE
|
167
211
|
trace_as_array (VALUE klass)
|
168
212
|
{
|
@@ -307,6 +351,7 @@ Init_potracer () {
|
|
307
351
|
rb_define_alloc_func(rb_cPotracerTrace, trace_alloc);
|
308
352
|
rb_define_protected_method(rb_cPotracerTrace, "do_trace", trace_trace, 2);
|
309
353
|
rb_define_method(rb_cPotracerTrace, "to_a", trace_as_array, 0);
|
354
|
+
rb_define_method(rb_cPotracerTrace, "to_svg", trace_as_svg, 0);
|
310
355
|
|
311
356
|
// Define the Params class inside the Potracer module
|
312
357
|
rb_cPotracerParams = rb_define_class_under(rb_mPotracer, "Params", rb_cObject);
|
data/ext/potracer/potracer.h
CHANGED
@@ -20,6 +20,10 @@
|
|
20
20
|
#define MOVE_TO(ar, c) PUSH_TR(ar, 3, "moveto", RB_PAIR(c))
|
21
21
|
#define LINE_TO(ar, c) PUSH_TR(ar, 3, "lineto", RB_PAIR(c))
|
22
22
|
#define CURVE_TO(ar, c) PUSH_TR(ar, 7, "curveto", RB_PAIR(c[0]), RB_PAIR(c[1]), RB_PAIR(c[2]))
|
23
|
+
#define SVG_PAIR(p) p.x, p.y
|
24
|
+
#define SVG_MOVE_TO(f, c) fprintf(f, "M %f %f ", SVG_PAIR(c))
|
25
|
+
#define SVG_LINE_TO(f, c) fprintf(f, "L %f %f ", SVG_PAIR(c))
|
26
|
+
#define SVG_CURVE_TO(f, c) fprintf(f, "C %f %f %f %f %f %f", SVG_PAIR(c[0]), SVG_PAIR(c[1]), SVG_PAIR(c[2]))
|
23
27
|
|
24
28
|
static VALUE rb_mPotracer;
|
25
29
|
static VALUE rb_mTurnpolicy;
|