diff --git a/src/pixie/images.nim b/src/pixie/images.nim index 43cacac..6b60b7e 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -328,14 +328,23 @@ proc magnifyBy2*(image: Image, power = 1): Image {.raises: [PixieError].} = let scale = 2 ^ power result = newImage(image.width * scale, image.height * scale) - for y in 0 ..< result.height: + + for y in 0 ..< image.height: + # Write one row of pixels duplicated by scale for x in 0 ..< image.width: let - rgba = image.getRgbaUnsafe(x, y div scale) - idx = result.dataIndex(x * scale, y) - for i in 0 ..< scale div 2: - result.data[idx + i * 2 + 0] = rgba - result.data[idx + i * 2 + 1] = rgba + rgbx = image.getRgbaUnsafe(x, y) + idx = result.dataIndex(x * scale, y * scale) + for i in 0 ..< scale: + result.data[idx + i] = rgbx + # Copy that row of pixels into (scale - 1) more rows + let rowStart = result.dataIndex(0, y * scale) + for i in 1 ..< scale: + copyMem( + result.data[rowStart + result.width * i].addr, + result.data[rowStart].addr, + result.width * 4 + ) proc applyOpacity*(target: Image | Mask, opacity: float32) {.raises: [].} = ## Multiplies alpha of the image by opacity. diff --git a/tests/benchmark_images_draw.nim b/tests/benchmark_images_draw.nim index df76ca2..34930be 100644 --- a/tests/benchmark_images_draw.nim +++ b/tests/benchmark_images_draw.nim @@ -44,6 +44,17 @@ block: a.draw(b, translate(vec2(25, 25)) * scale(vec2(0.5, 0.5)), bmNormal) keep(b) +block: + let + a = newImage(1000, 1000) + b = newImage(500, 500) + a.fill(rgba(255, 0, 0, 255)) + b.fill(rgba(0, 255, 0, 255)) + + timeIt "draw [scale 2]": + a.draw(b, translate(vec2(25, 25)) * scale(vec2(2, 2)), bmNormal) + keep(b) + block: let a = newImage(1000, 1000)