cyang1 / depixelize

A C++ implementation of the SIGGRAPH 2011 paper Depixelizing Pixel Art, by Johannes Kopf and Dani Lischinski
53 stars 13 forks source link

segfault in PixelGrid::get_components #1

Closed bsl closed 9 years ago

bsl commented 9 years ago

Hi, thanks for working on this project. Your results are looking very promising!

On line 366 of pixel_grid.cpp, new_pos sometimes goes negative. Then it's used as an index into seen, and I get a segfault.

cyang1 commented 9 years ago

Thanks!

Do you have a specific image that can be used to repro this issue? I'm not certain how new_pos could become negative, as the neighbors bitmasks are created in PixelGrid::initialize() in such a way that bounds checks should be unnecessary.

bsl commented 9 years ago

Right after the int new_pos = ... on line 366, I added

if (new_pos < 0) {
  printf("r=%d c=%d pos=%d cur_pos=%d i=%d bitmask=%#02x D[i=%d][0]=%d D[i=%d][1]=%d new_pos=%d\n",
          r, c, pos, cur_pos, i, bitmask, i, DIRECTIONS[i][0], i, DIRECTIONS[i][1], new_pos);
  continue;
}

I ran depixelize on smw_mushroom_input.png. The output looks like

r=0 c=0 pos=0 cur_pos=0  i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-17
r=0 c=0 pos=0 cur_pos=1  i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-16
r=0 c=0 pos=0 cur_pos=2  i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-15
r=0 c=0 pos=0 cur_pos=3  i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-14
r=0 c=0 pos=0 cur_pos=4  i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-13
r=0 c=0 pos=0 cur_pos=5  i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-12
r=0 c=0 pos=0 cur_pos=6  i=7 bitmask=0x89 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-11
r=0 c=0 pos=0 cur_pos=7  i=7 bitmask=0x81 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-10
r=0 c=0 pos=0 cur_pos=8  i=7 bitmask=0x81 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-9
r=0 c=0 pos=0 cur_pos=9  i=7 bitmask=0x81 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-8
r=0 c=0 pos=0 cur_pos=10 i=7 bitmask=0x81 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-7
r=0 c=0 pos=0 cur_pos=11 i=7 bitmask=0x83 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-6
r=0 c=0 pos=0 cur_pos=12 i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-5
r=0 c=0 pos=0 cur_pos=13 i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-4
r=0 c=0 pos=0 cur_pos=14 i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-3
r=0 c=0 pos=0 cur_pos=15 i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-2
r=0 c=0 pos=0 cur_pos=16 i=7 bitmask=0x85 D[i=7][0]=-1 D[i=7][1]=1 new_pos=-1