See https://sourceforge.net/p/openil/patches/51/ *** src-ILU/src/ilu_scale2d.c Wed Oct 28 16:51:50 2009 --- src-ILU/src/ilu_scale2d.c Tue Dec 18 12:11:08 2012 *************** *** 204,209 **** --- 204,217 ---- ILfloat SrcX, SrcY; ILuint iSrcX, iSrcY, iSrcXPlus1, iSrcYPlus1, ulOff, llOff, urOff, lrOff; + // only downscale is allowed + assert(ScaleX>0 && ScaleX<=1.0f); + assert(ScaleY>0 && ScaleY<=1.0f); + + // scale factors should match images size + assert( ((ILfloat)Width -0.5f) / ScaleX < Image->Width ); + assert( ((ILfloat)Height-0.5f) / ScaleY < Image->Height ); + ImgBps = Image->Bps / Image->Bpc; SclBps = Scaled->Bps / Scaled->Bpc; *************** *** 213,226 **** for (y = 0; y < Height; y++) { for (x = 0; x < Width; x++) { // Calculate where we want to choose pixels from in our source image. ! SrcX = (ILfloat)x / (ILfloat)ScaleX; ! SrcY = (ILfloat)y / (ILfloat)ScaleY; ! // Integer part of SrcX and SrcY ! iSrcX = (ILuint)floor(SrcX); ! iSrcY = (ILuint)floor(SrcY); ! // Fractional part of SrcX and SrcY ! FracX = SrcX - (ILfloat)(iSrcX); ! FracY = SrcY - (ILfloat)(iSrcY); // We do not want to go past the right edge of the image or past the last line in the image, // so this takes care of that. Normally, iSrcXPlus1 is iSrcX + 1, but if this is past the --- 221,234 ---- for (y = 0; y < Height; y++) { for (x = 0; x < Width; x++) { // Calculate where we want to choose pixels from in our source image. ! SrcX = (ILfloat)(x+0.5f) / (ILfloat)ScaleX; ! SrcY = (ILfloat)(y+0.5f) / (ILfloat)ScaleY; ! // indices of upper-left pixel ! iSrcX = (ILuint)(SrcX-0.5f); ! iSrcY = (ILuint)(SrcY-0.5f); ! // how far SrcX and SrcY are from upper-left pixel center ! FracX = SrcX - (ILfloat)(iSrcX) - 0.5f; ! FracY = SrcY - (ILfloat)(iSrcY) - 0.5f; // We do not want to go past the right edge of the image or past the last line in the image, // so this takes care of that. Normally, iSrcXPlus1 is iSrcX + 1, but if this is past the