Re: [Bug 83] New: bad memory accesses in libscale
Sven Schnelle <[email protected]>
| Newsgroups | gmane.comp.video.gephex.devel |
|---|---|
| Message-ID | <[email protected]> |
<#secure method=pgpmime mode=sign> Hi, [email protected] writes: > https://bugs.gephex.org/show_bug.cgi?id=83 > > Summary: bad memory accesses in libscale > [..] > When mirrorx is turned on in libscale, memory one past the end of the destination buffer > is written (current is set to one past the line instead of to the last pixel of the line). Trying to fix this problem, i've written my own version of ls_scale32m() and libscale32m_adjust: -----------------------------8<---------------------------------------- void ls_scale32m(uint_32* dst, int dwidth, int dheight, const uint_32* src, int swidth, int sheight, int mirrorx, int mirrory) { int x,y; int dy; uint_32 x_a, y_a; uint_32 A,B; const uint_32* src_base; assert (dwidth >= 0 && dheight >= 0); if (dwidth == swidth && dheight == sheight && !mirrorx && !mirrory) memcpy(dst, src, dwidth*dheight*sizeof(uint_32)); else { A = (uint_32) (65536 * (double)swidth / (double)dwidth); B = (uint_32) (65536 * (double)sheight / (double)dheight); for (y = 0, y_a = 0; y < dheight; y++, y_a += B) { src_base = src + (y_a >> 16) * swidth; if(mirrory) dy = dheight - 1 - y; else dy = y; x_a = 0; if(mirrorx) for (x = dwidth - 1; x >= 0; x--, x_a += A) dst[dy*dwidth+x] = src_base[x_a >> 16]; else for (x = 0; x < dwidth; x++, x_a += A) dst[dy*dwidth+x] = src_base[x_a >> 16]; } } } void ls_scale32m_adjust(uint_32* dst, int dwidth, int dheight, const uint_32* src, int swidth, int sheight, int mirrorx, int mirrory, const ls_adjust_pal pal) { int x,y,dy; uint_32 x_a, y_a; uint_32 A,B; const uint_32* src_base; assert (dwidth >= 0 && dheight >= 0); A = (uint_32) (65536 * (double)swidth / (double)dwidth); B = (uint_32) (65536 * (double)sheight / (double)dheight); for (y = 0, y_a = 0; y < dheight; y++, y_a += B) { src_base = src + (y_a >> 16) * swidth; if(mirrory) dy = dheight - 1 - y; else dy = y; x_a = 0; if(mirrorx) for (x = dwidth - 1; x >= 0; x--, x_a += A) apply_pal(&dst[dy*dwidth+x], &src_base[x_a >> 16], pal); else for (x = 0; x < dwidth; x++, x_a += A) apply_pal(&dst[dy*dwidth+x], &src_base[x_a >> 16], pal); } } -----------------------------8<---------------------------------------- Maybe this approach has some disadvantages, and introduces some new bugs, but it works for me[tm] :) Sven. -- main(){while(!fork())sleep(1);}