package org.kne.codec.kif;

public class ImageCopy {
	/**
	 * 图像块拷贝：将源图像中的一个矩形区域拷贝到目标图像的指定位置
	 * 
	 * @param src      源像素数组 (ARGB/RGB)
	 * @param srcw     源图像宽度
	 * @param srch     源图像高度
	 * @param dst      目标像素数组 (ARGB/RGB)
	 * @param dstw     目标图像宽度
	 * @param dsth     目标图像高度
	 * @param srcposx  源区域左上角 x 坐标
	 * @param srcposy  源区域左上角 y 坐标
	 * @param dstposx  目标区域左上角 x 坐标
	 * @param dstposy  目标区域左上角 y 坐标
	 * @param copyw    拷贝宽度
	 * @param copyh    拷贝高度
	 * @throws IllegalArgumentException 如果参数越界或无效
	 */
	public static void imageCopy(int[] src, int srcw, int srch,
	                             int[] dst, int dstw, int dsth,
	                             int srcposx, int srcposy,
	                             int dstposx, int dstposy,
	                             int copyw, int copyh) {
	    // 参数校验
	    if (src == null || dst == null) {
	        throw new IllegalArgumentException("源或目标数组不能为空");
	    }
	    if (srcposx < 0 || srcposy < 0 || dstposx < 0 || dstposy < 0) {
	        throw new IllegalArgumentException("起始坐标不能为负数");
	    }
	    if (copyw <= 0 || copyh <= 0) {
	        throw new IllegalArgumentException("拷贝宽度和高度必须大于0");
	    }
	    if (srcposx + copyw > srcw || srcposy + copyh > srch) {
	        throw new IllegalArgumentException("源区域超出边界");
	    }
	    if (dstposx + copyw > dstw || dstposy + copyh > dsth) {
	        throw new IllegalArgumentException("目标区域超出边界");
	    }
	    
	    // 逐行拷贝（比逐像素快，利用内存连续性）
	    for (int row = 0; row < copyh; row++) {
	        int srcIdx = (srcposy + row) * srcw + srcposx;
	        int dstIdx = (dstposy + row) * dstw + dstposx;
	        System.arraycopy(src, srcIdx, dst, dstIdx, copyw);
	    }
	}
}
