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);}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.