The Bitmap is Potracer's representation of a bitmap in memory
Creat a new Bitmap
width
- width of the bitmap to be traced
height
- height of the bitmap to be traced
bits
- bitmap data. Can be a multi-dimensional array or a
string of pixel data
map
- how pixel data is mapped if bits
is a
string
static VALUE bitmap_new (int argc, VALUE *argv, VALUE klass) { int i, j, m; unsigned char *bits; potrace_bitmap_t *bm; VALUE bdata, row; bdata = Data_Make_Struct(klass, potrace_bitmap_t, bitmap_mark, bitmap_free, bm); bm->w = (argc > 0) ? NUM2INT(argv[0]) : BM_WIDTH; bm->h = (argc > 1) ? NUM2INT(argv[1]) : BM_HEIGHT; bm->dy = (bm->w + BM_WORDBITS - 1) / BM_WORDBITS; bm->map = ALLOC_N(potrace_word, bm->dy * bm->h * BM_WORDSIZE); memset(bm->map, 0, bm->dy * bm->h * BM_WORDSIZE); if (argc > 2) { if (T_STRING == TYPE(argv[2])) { bits = (unsigned char *)StringValuePtr(argv[2]); m = strlen(StringValuePtr(argv[3])); for (i = 0; i < bm->h; i++) { for (j = 0; j < bm->w; j++) { BM_PUT(bm, j, i, is_colored(bits, i, j, bm->w, m)); } } } else { for (i = 0; i < bm->h; i++) { row = rb_ary_entry(argv[2], (long)i); for (j = 0; j < bm->w; j++) { BM_PUT(bm, j, i, NUM2INT(rb_ary_entry(row, (long)j))); } } } } return bdata; }
Get the height in pixels
static VALUE bitmap_get_height (VALUE klass) { potrace_bitmap_t *bm; Data_Get_Struct(klass, potrace_bitmap_t, bm); return rb_int_new(bm->h); }
Retrieve the bitmap data as a multi-dimensional array of 1s and 0s
static VALUE bitmap_as_array (VALUE klass) { int i, j; potrace_bitmap_t *bm; VALUE result, row; Data_Get_Struct(klass, potrace_bitmap_t, bm); result = rb_ary_new2((long)bm->h); for (i = 0; i < bm->h; i++) { row = rb_ary_new2((long)bm->w); for (j = 0; j < bm->w; j++) { rb_ary_store(row, (long)j, rb_int_new(BM_GET(bm, j, i))); } rb_ary_store(result, (long)i, row); } return result; }
Get the width in pixels
static VALUE bitmap_get_width (VALUE klass) { potrace_bitmap_t *bm; Data_Get_Struct(klass, potrace_bitmap_t, bm); return rb_int_new(bm->w); }