/// <summary> /// Copies the given area of source array into the same area of current array without updating the changes array. /// </summary> /// <param name="source"></param> /// <param name="minX"></param> /// <param name="minY"></param> /// <param name="maxX"></param> /// <param name="maxY"></param> public void CopyAreaBatch(FastBitmapArray source, int minX, int minY, int maxX, int maxY) { if (minX < 0) { minX = 0; } if (minY < 0) { minY = 0; } if (maxX >= width) { maxX = width - 1; } if (maxY >= height) { maxY = height - 1; } for (int x = minX; x <= maxX; x++) { for (int y = minY; y <= maxY; y++) { R[x][y] = source.R[x][y]; G[x][y] = source.G[x][y]; B[x][y] = source.B[x][y]; A[x][y] = source.A[x][y]; } } }
public FastBitmapArray ScaleUp(int scaling) { var scaledUp = new FastBitmapArray(scaling * width, scaling * height); int xScaled = 0; int yScaled = 0; for (int x = 0; x < width; ++x) { yScaled = 0; for (int y = 0; y < height; ++y) { for (int yy = 0; yy < scaling; ++yy) { for (int xx = 0; xx < scaling; ++xx) { int xxx = xScaled + xx; int yyy = yScaled + yy; scaledUp.R[xxx][yyy] = R[x][y]; scaledUp.G[xxx][yyy] = G[x][y]; scaledUp.B[xxx][yyy] = B[x][y]; scaledUp.A[xxx][yyy] = A[x][y]; scaledUp.changed[xxx][yyy] = true; } } yScaled += scaling; } xScaled += scaling; } return(scaledUp); }
public FastBitmapArray ScaleDown(int scaling) { if (width % scaling > 0 || height % scaling > 0) { throw new ArgumentException("such bitmap cannot be scaled down"); } var scaledDown = new FastBitmapArray(width / scaling, height / scaling); double divisor = scaling * scaling; int xScaled = 0; int yScaled = 0; for (int x = 0; x < scaledDown.width; ++x) { yScaled = 0; for (int y = 0; y < scaledDown.height; ++y) { double avgR = 0, avgG = 0, avgB = 0, avgA = 0; for (int yy = 0; yy < scaling; ++yy) { for (int xx = 0; xx < scaling; ++xx) { int xxx = xScaled + xx; int yyy = yScaled + yy; avgR += R[xxx][yyy]; avgG += G[xxx][yyy]; avgB += B[xxx][yyy]; avgA += A[xxx][yyy]; } } scaledDown.R[x][y] = avgR / divisor; scaledDown.G[x][y] = avgG / divisor; scaledDown.B[x][y] = avgB / divisor; scaledDown.A[x][y] = avgA / divisor; scaledDown.changed[x][y] = true; yScaled += scaling; } xScaled += scaling; } return(scaledDown); }
/// <summary> /// Copies the given area of source array into the same area of current array and updates the array with changes. /// </summary> /// <param name="source"></param> /// <param name="minX"></param> /// <param name="minY"></param> /// <param name="maxX"></param> /// <param name="maxY"></param> public void CopyArea(FastBitmapArray source, int minX, int minY, int maxX, int maxY) { CopyAreaBatch(source, minX, minY, maxX, maxY); SetBatchArea(minX, minY, maxX, maxY); }
/// <summary> /// Copies the whole source array into the current array and updates the array with changes. /// </summary> /// <param name="source"></param> public void CopyArea(FastBitmapArray source) { CopyArea(source, 0, 0, source.width - 1, source.height - 1); }
/// <summary> /// Copies the source array. /// </summary> /// <param name="source"></param> public FastBitmapArray(FastBitmapArray source) : this(source.width, source.height) { CopyAreaBatch(source); }