blob: a1f336136c8939d2fb140ae2c19e4b9754c8190b [file] [log] [blame]
import '../image.dart';
import 'draw_pixel.dart';
/// Draw the image [src] onto the image [dst].
///
/// In other words, drawImage will take an rectangular area from src of
/// width [src_w] and height [src_h] at position ([src_x],[src_y]) and place it
/// in a rectangular area of [dst] of width [dst_w] and height [dst_h] at
/// position ([dst_x],[dst_y]).
///
/// If the source and destination coordinates and width and heights differ,
/// appropriate stretching or shrinking of the image fragment will be performed.
/// The coordinates refer to the upper left corner. This function can be used to
/// copy regions within the same image (if [dst] is the same as [src])
/// but if the regions overlap the results will be unpredictable.
Image drawImage(Image dst, Image src,
{int? dstX,
int? dstY,
int? dstW,
int? dstH,
int? srcX,
int? srcY,
int? srcW,
int? srcH,
bool blend = true}) {
dstX ??= 0;
dstY ??= 0;
srcX ??= 0;
srcY ??= 0;
srcW ??= src.width;
srcH ??= src.height;
dstW ??= (dst.width < src.width) ? dstW = dst.width : src.width;
dstH ??= (dst.height < src.height) ? dst.height : src.height;
if (blend) {
for (var y = 0; y < dstH; ++y) {
for (var x = 0; x < dstW; ++x) {
final stepX = (x * (srcW / dstW)).toInt();
final stepY = (y * (srcH / dstH)).toInt();
final srcPixel = src.getPixel(srcX + stepX, srcY + stepY);
drawPixel(dst, dstX + x, dstY + y, srcPixel);
}
}
}
else {
for (var y = 0; y < dstH; ++y) {
for (var x = 0; x < dstW; ++x) {
final stepX = (x * (srcW / dstW)).toInt();
final stepY = (y * (srcH / dstH)).toInt();
final srcPixel = src.getPixel(srcX + stepX, srcY + stepY);
dst.setPixel(dstX + x, dstY + y, srcPixel);
}
}
}
return dst;
}