You're copying a square block of pixels into your integer-scaled image. The outer two loops and your computation of the original pixel address are fine.
Now, looking at the inner two loops, you have this odd thing going on with counter
and index
which don't quite make sense. Let's rewrite that. All you need to do is copy a group of pixels for each row.
o = original + i*cols + j;
n = *new + (i*cols + j) * scale;
for(sy = 0; sy < scale; sy++)
{
for(sx = 0; sx < scale; sx++)
{
n[sy*cols*scale + sx] = *o;
}
}
I'm really not a fan of variables like i
, j
, k
, and l
. It's lazy and imparts no meaning. It's hard to see if k
is a row or a column index. So I used sx
and sy
to mean "the scaled x- and y-coordinates" (I would recommend using x
and y
instead of j
and i
but I left them as is).
Now, here's a better way. Copy the pixels in scan lines, rather than jumping around writing a single scaled block. Here, you scale a single row, and do that multiple times. You can replace your four loops with this:
int srows = rows * scale;
int scols = cols * scale;
for( sy = 0; sy < srows; sy++ )
{
y = sy / scale;
o = original + y * cols;
n = *new + sy * scols;
for( x = 0; x < cols; x++ ) {
for( i = 0; i < scale; i++ ) {
*n++ = *o;
}
*o++;
}
}