potracer 1.0.9 → 1.1.0

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.
Files changed (3) hide show
  1. data/ext/potracer/potracer.c +189 -13
  2. data/lib/potracer.rb +43 -1
  3. metadata +2 -2
@@ -6,7 +6,7 @@
6
6
  #include "potracer.h"
7
7
 
8
8
  static int
9
- is_colored (char *str, int row, int col, int cols, int size)
9
+ is_colored (unsigned char *str, int row, int col, int cols, int size)
10
10
  {
11
11
  int i, start;
12
12
  unsigned char v, max, min;
@@ -36,6 +36,11 @@ params_alloc (VALUE klass)
36
36
  return Data_Wrap_Struct(klass, 0, potrace_param_free, params);
37
37
  }
38
38
 
39
+ /**
40
+ * call-seq: turd_size
41
+ *
42
+ * Get the current turd size
43
+ */
39
44
  static VALUE
40
45
  params_get_turdsize (VALUE klass)
41
46
  {
@@ -44,6 +49,13 @@ params_get_turdsize (VALUE klass)
44
49
  return rb_int_new(params->turdsize);
45
50
  }
46
51
 
52
+ /**
53
+ * call-seq: turd_size = threshold
54
+ *
55
+ * Set the turd size
56
+ * * +threshold+ - used to "despeckle" the bitmap to be traced, by removing all
57
+ * curves whose enclosed area is below the given threshold. Default is 2.
58
+ */
47
59
  static VALUE
48
60
  params_set_turdsize (VALUE klass, VALUE size)
49
61
  {
@@ -53,6 +65,11 @@ params_set_turdsize (VALUE klass, VALUE size)
53
65
  return size;
54
66
  }
55
67
 
68
+ /**
69
+ * call-seq: turn_policy
70
+ *
71
+ * Get the current Turnpolicy
72
+ */
56
73
  static VALUE
57
74
  params_get_turnpolicy (VALUE klass)
58
75
  {
@@ -61,6 +78,11 @@ params_get_turnpolicy (VALUE klass)
61
78
  return rb_int_new(params->turnpolicy);
62
79
  }
63
80
 
81
+ /**
82
+ * call-seq: turn_policy = policy
83
+ *
84
+ * Set the current Turnpolicy
85
+ */
64
86
  static VALUE
65
87
  params_set_turnpolicy (VALUE klass, VALUE policy)
66
88
  {
@@ -70,6 +92,11 @@ params_set_turnpolicy (VALUE klass, VALUE policy)
70
92
  return policy;
71
93
  }
72
94
 
95
+ /**
96
+ * call-seq: alpha_max
97
+ *
98
+ * Get the current alpha max
99
+ */
73
100
  static VALUE
74
101
  params_get_alphamax (VALUE klass)
75
102
  {
@@ -78,6 +105,15 @@ params_get_alphamax (VALUE klass)
78
105
  return rb_float_new(params->alphamax);
79
106
  }
80
107
 
108
+ /**
109
+ * call-seq: alpha_max = max
110
+ *
111
+ * Set the alpha max
112
+ *
113
+ * * +max+ - threshold for the detection of corners. It controls the smoothness
114
+ * of the traced curve, as shown in Figure 9. The current default is 1.0. The
115
+ * useful range of this parameter is from 0.0 (polygon) to 1.3334 (no corners).
116
+ */
81
117
  static VALUE
82
118
  params_set_alphamax (VALUE klass, VALUE max)
83
119
  {
@@ -87,6 +123,11 @@ params_set_alphamax (VALUE klass, VALUE max)
87
123
  return max;
88
124
  }
89
125
 
126
+ /**
127
+ * call-seq: optimized?
128
+ *
129
+ * Are curves optimized
130
+ */
90
131
  static VALUE
91
132
  params_get_opticurve (VALUE klass)
92
133
  {
@@ -95,6 +136,11 @@ params_get_opticurve (VALUE klass)
95
136
  return (params->opticurve == 1) ? Qtrue : Qfalse;
96
137
  }
97
138
 
139
+ /**
140
+ * call-seq: optimize!
141
+ *
142
+ * Turn on curve optimization
143
+ */
98
144
  static VALUE
99
145
  params_set_opticurve_true (VALUE klass)
100
146
  {
@@ -104,6 +150,11 @@ params_set_opticurve_true (VALUE klass)
104
150
  return Qtrue;
105
151
  }
106
152
 
153
+ /**
154
+ * call-seq: unoptimize!
155
+ *
156
+ * Turn off curve optimization
157
+ */
107
158
  static VALUE
108
159
  params_set_opticurve_false (VALUE klass)
109
160
  {
@@ -113,6 +164,11 @@ params_set_opticurve_false (VALUE klass)
113
164
  return Qfalse;
114
165
  }
115
166
 
167
+ /**
168
+ * call-seq: tolerance
169
+ *
170
+ * Get current curve optimization tolerance
171
+ */
116
172
  static VALUE
117
173
  params_get_opttolerance (VALUE klass)
118
174
  {
@@ -121,6 +177,18 @@ params_get_opttolerance (VALUE klass)
121
177
  return rb_float_new(params->opttolerance);
122
178
  }
123
179
 
180
+ /**
181
+ * call-seq: tolerance = amount
182
+ *
183
+ * Set current curve optimization tolerance
184
+ *
185
+ * * +amount+ - defines the amount of error allowed in curve simplification.
186
+ * This value only applies if optimization is true. The current default is
187
+ * 0.2. Larger values tend to decrease the number of segments, at the expense
188
+ * of less accuracy. The useful range is from 0 to infinity, although in
189
+ * practice one would hardly choose values greater than 1 or so. For most
190
+ * purposes, the default value is a good tradeoff between space and accuracy.
191
+ */
124
192
  static VALUE
125
193
  params_set_opttolerance (VALUE klass, VALUE tolerance)
126
194
  {
@@ -166,6 +234,27 @@ trace_trace (VALUE obj, VALUE bitmap, VALUE params)
166
234
  return obj;
167
235
  }
168
236
 
237
+ /**
238
+ * call-seq: to_svg
239
+ *
240
+ * Render the traced bitmap as an SVG
241
+ *
242
+ * ==== Example
243
+ *
244
+ * bmp = Potracer::Bitmap.new(5, 5, [
245
+ * [1, 1, 1, 1, 1],
246
+ * [1, 0, 0, 0, 1],
247
+ * [1, 0, 0, 0, 1],
248
+ * [1, 0, 0, 0, 1],
249
+ * [1, 1, 1, 1, 1]
250
+ * ])
251
+ * params = Potracer::Params.new
252
+ * trace = Potracer::Trace.new
253
+ * trace.trace(bmp, params).to_svg # =>
254
+ * # <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="5" height="5">
255
+ * # <path fill-rule="evenodd" fill="rgb(0,0,0)" d="M 0.000000 2.500000 C 0.000000 0.500000 0.500000 0.000000 2.500000 0.000000C 4.500000 0.000000 5.000000 0.500000 5.000000 2.500000C 5.000000 4.500000 4.500000 5.000000 2.500000 5.000000C 0.500000 5.000000 0.000000 4.500000 0.000000 2.500000M 4.000000 2.500000 C 4.000000 1.675000 3.325000 1.000000 2.500000 1.000000C 1.675000 1.000000 1.000000 1.675000 1.000000 2.500000C 1.000000 3.325000 1.675000 4.000000 2.500000 4.000000C 3.325000 4.000000 4.000000 3.325000 4.000000 2.500000" />
256
+ * # </svg>"
257
+ */
169
258
  static VALUE
170
259
  trace_as_svg (VALUE klass)
171
260
  {
@@ -217,6 +306,28 @@ trace_as_svg (VALUE klass)
217
306
  return svg;
218
307
  }
219
308
 
309
+ /**
310
+ * call-seq: to_a
311
+ *
312
+ * Convert the traced bitmap to an array in the form:
313
+ *
314
+ * [
315
+ * {:area=>25, :sign=>"+", :parts=> [
316
+ * [:moveto, 0.0, 2.5],
317
+ * [:curveto, 0.0, 0.5, 0.5, 0.0, 2.5, 0.0],
318
+ * [:curveto, 4.5, 0.0, 5.0, 0.5, 5.0, 2.5],
319
+ * [:curveto, 5.0, 4.5, 4.5, 5.0, 2.5, 5.0],
320
+ * [:curveto, 0.5, 5.0, 0.0, 4.5, 0.0, 2.5]
321
+ * ]},
322
+ * {:area=>9, :sign=>"-", :parts=> [
323
+ * [:moveto, 4.0, 2.5],
324
+ * [:curveto, 4.0, 1.6749999999999998, 3.325, 1.0, 2.5, 1.0],
325
+ * [:curveto, 1.6749999999999998, 1.0, 1.0, 1.6749999999999998, 1.0, 2.5],
326
+ * [:curveto, 1.0, 3.325, 1.6749999999999998, 4.0, 2.5, 4.0],
327
+ * [:curveto, 3.325, 4.0, 4.0, 3.325, 4.0, 2.5]
328
+ * ]}
329
+ * ]
330
+ */
220
331
  static VALUE
221
332
  trace_as_array (VALUE klass)
222
333
  {
@@ -273,16 +384,21 @@ bitmap_free (potrace_bitmap_t *bm)
273
384
  free(bm);
274
385
  }
275
386
 
276
- static void
277
- bitmap_init(int argc, VALUE *argv, VALUE klass)
278
- {
279
- potrace_bitmap_t *bm;
280
- }
281
-
387
+ /**
388
+ * call-seq: new(width=250, height=250, bits='000...', map='RGB')
389
+ *
390
+ * Creat a new Bitmap
391
+ *
392
+ * * +width+ - width of the bitmap to be traced
393
+ * * +height+ - height of the bitmap to be traced
394
+ * * +bits+ - bitmap data. Can be a multi-dimensional array or a string of pixel
395
+ * data
396
+ * * +map+ - how pixel data is mapped if +bits+ is a string
397
+ */
282
398
  static VALUE
283
399
  bitmap_new (int argc, VALUE *argv, VALUE klass)
284
400
  {
285
- int i, j, m, s;
401
+ int i, j, m;
286
402
  unsigned char *bits;
287
403
  potrace_bitmap_t *bm;
288
404
  VALUE bdata, row;
@@ -296,7 +412,7 @@ bitmap_new (int argc, VALUE *argv, VALUE klass)
296
412
 
297
413
  if (argc > 2) {
298
414
  if (T_STRING == TYPE(argv[2])) {
299
- bits = StringValuePtr(argv[2]);
415
+ bits = (unsigned char *)StringValuePtr(argv[2]);
300
416
  m = strlen(StringValuePtr(argv[3]));
301
417
  for (i = 0; i < bm->h; i++) {
302
418
  for (j = 0; j < bm->w; j++) {
@@ -316,6 +432,11 @@ bitmap_new (int argc, VALUE *argv, VALUE klass)
316
432
  return bdata;
317
433
  }
318
434
 
435
+ /**
436
+ * call-seq: width
437
+ *
438
+ * Get the width in pixels
439
+ */
319
440
  static VALUE
320
441
  bitmap_get_width (VALUE klass)
321
442
  {
@@ -324,6 +445,11 @@ bitmap_get_width (VALUE klass)
324
445
  return rb_int_new(bm->w);
325
446
  }
326
447
 
448
+ /**
449
+ * call-seq: height
450
+ *
451
+ * Get the height in pixels
452
+ */
327
453
  static VALUE
328
454
  bitmap_get_height (VALUE klass)
329
455
  {
@@ -332,6 +458,11 @@ bitmap_get_height (VALUE klass)
332
458
  return rb_int_new(bm->h);
333
459
  }
334
460
 
461
+ /**
462
+ * call-seq: to_a
463
+ *
464
+ * Retrieve the bitmap data as a multi-dimensional array of 1s and 0s
465
+ */
335
466
  static VALUE
336
467
  bitmap_as_array (VALUE klass)
337
468
  {
@@ -353,8 +484,12 @@ bitmap_as_array (VALUE klass)
353
484
 
354
485
  void
355
486
  Init_potracer () {
356
- // Define the Potracer module
487
+ /**
488
+ * Define-module: Potracer
489
+ * A home for all things Potrace
490
+ */
357
491
  rb_mPotracer = rb_define_module("Potracer");
492
+ /* VERSION: Version of Potrace */
358
493
  rb_define_const(rb_mPotracer, "VERSION", rb_str_new2(potrace_version()));
359
494
 
360
495
  // Define the Trace class inside the Potracer module
@@ -364,7 +499,11 @@ Init_potracer () {
364
499
  rb_define_method(rb_cPotracerTrace, "to_a", trace_as_array, 0);
365
500
  rb_define_method(rb_cPotracerTrace, "to_svg", trace_as_svg, 0);
366
501
 
367
- // Define the Params class inside the Potracer module
502
+ /**
503
+ * Document-class: Potracer::Params
504
+ *
505
+ * Params define how the Bitmap is traced
506
+ */
368
507
  rb_cPotracerParams = rb_define_class_under(rb_mPotracer, "Params", rb_cObject);
369
508
  rb_define_alloc_func(rb_cPotracerParams, params_alloc);
370
509
  rb_define_method(rb_cPotracerParams, "turd_size", params_get_turdsize, 0);
@@ -379,7 +518,41 @@ Init_potracer () {
379
518
  rb_define_method(rb_cPotracerParams, "tolerance", params_get_opttolerance, 0);
380
519
  rb_define_method(rb_cPotracerParams, "tolerance=", params_set_opttolerance, 1);
381
520
 
382
- // Define the Turnpolicy module inside the Potracer module
521
+ /**
522
+ * Document-const: BLACK
523
+ * prefers to connect black (foreground) components
524
+ */
525
+ /**
526
+ * Document-const: WHITE
527
+ * prefers to connect white (background) components
528
+ */
529
+ /**
530
+ * Document-const: LEFT
531
+ * always take a left turn
532
+ */
533
+ /**
534
+ * Document-const: RIGHT
535
+ * always take a right turn
536
+ */
537
+ /**
538
+ * Document-const: MINORITY
539
+ * prefers to connect the color (black or white) that occurs least
540
+ * frequently in a local neighborhood of the current position
541
+ */
542
+ /**
543
+ * Document-const: MAJORITY
544
+ * prefers to connect the color (black or white) that occurs most
545
+ * frequently in a local neighborhood of the current position
546
+ */
547
+ /**
548
+ * Document-const: RANDOM
549
+ * choose pseudo-ramdomly
550
+ */
551
+ /**
552
+ * Document-class: Potracer::Turnpolicy
553
+ * The Turnpolicy determines how to resolve ambiguities during decomposition
554
+ * of bitmaps into paths.
555
+ */
383
556
  rb_mTurnpolicy = rb_define_module_under(rb_mPotracer, "Turnpolicy");
384
557
  rb_define_const(rb_mTurnpolicy, "BLACK", rb_int_new(POTRACE_TURNPOLICY_BLACK));
385
558
  rb_define_const(rb_mTurnpolicy, "WHITE", rb_int_new(POTRACE_TURNPOLICY_WHITE));
@@ -389,7 +562,10 @@ Init_potracer () {
389
562
  rb_define_const(rb_mTurnpolicy, "MAJORITY", rb_int_new(POTRACE_TURNPOLICY_MAJORITY));
390
563
  rb_define_const(rb_mTurnpolicy, "RANDOM", rb_int_new(POTRACE_TURNPOLICY_RANDOM));
391
564
 
392
- // Define the Bitmap class inside the Potracer module
565
+ /**
566
+ * Document-class: Potracer::Bitmap
567
+ * The Bitmap is Potracer's representation of a bitmap in memory
568
+ */
393
569
  rb_cPotracerBitmap = rb_define_class_under(rb_mPotracer, "Bitmap", rb_cObject);
394
570
  rb_define_singleton_method(rb_cPotracerBitmap, "new", bitmap_new, -1);
395
571
  rb_define_method(rb_cPotracerBitmap, "width", bitmap_get_width, 0);
@@ -1,7 +1,27 @@
1
- require_relative 'potracer/potracer'
1
+ begin
2
+ require_relative '../build/potracer'
3
+ rescue LoadError
4
+ require_relative '../ext/potracer/potracer'
5
+ end
2
6
 
3
7
  module Potracer
8
+
9
+ ##
10
+ # This class represents a trace of a Potracer::Bitmap
11
+
4
12
  class Trace
13
+
14
+ ##
15
+ # Trace the given +bitmap+
16
+ #
17
+ # ==== Attributes
18
+ #
19
+ # * +bitmap+ - an instance of Potracer::Bitmap. If not given the +@bitmap+
20
+ # is used.
21
+ # * +params+ - an instance of Potracer::Params. If not given +@params+ is
22
+ # used.
23
+ # * +block+ - optional block called to report trace progress
24
+
5
25
  def trace(bitmap=nil, params=nil, &block)
6
26
  if block_given?
7
27
  self.do_trace(bitmap || @bitmap, params || @params, &block)
@@ -10,6 +30,28 @@ module Potracer
10
30
  end
11
31
  end
12
32
 
33
+ ##
34
+ # Trace a bitmap
35
+ #
36
+ # ==== Attributes
37
+ #
38
+ # * +bmp+ - mapped to a Potracer::Bitmap either a multi-dimensional array of
39
+ # bits or a string of image data
40
+ # * +width+ - width of the image to be mapped if +bmp+ is a string
41
+ # * +height+ - height of the image to be mapped if +bmp+ is a string
42
+ # * +map+ - pixel data format if +bmp+ is a string
43
+ # * +block+ - optional block called to report trace progress
44
+ #
45
+ # ==== Example
46
+ #
47
+ # require 'ruby-progressbar'
48
+ #
49
+ # pbar = ProgressBar.create(title: 'Tracing')
50
+ # Potracer::Trace.bitmap(bits) do |percent|
51
+ # pbar.progress = percent
52
+ # end
53
+ # pbar.finish
54
+
13
55
  def self.bitmap(bmp, width=nil, height=nil, map='RGB', &block)
14
56
  width ||= bmp.map {|r| r.length}.max
15
57
  height ||= bmp.length
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: potracer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-22 00:00:00.000000000 Z
12
+ date: 2013-03-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Ruby bindings for the potrace library.
15
15
  email: k.parnell@gmail.com