public static void WeightedColorAverage(ref int prevAveraged, ref MyDColor average, ref MyColor toAdd) { average.R = (average.R * prevAveraged + toAdd.R) / (prevAveraged + 1); average.G = (average.G * prevAveraged + toAdd.G) / (prevAveraged + 1); average.B = (average.B * prevAveraged + toAdd.B) / (prevAveraged + 1); prevAveraged += 1; }
internal MyDColor Add(MyDColor a) { return(new MyDColor() { R = R + a.R, G = G + a.G, B = B + a.B, }); }
internal MyDColor Mult(MyDColor a) { return(new MyDColor() { R = R * a.R, G = G * a.G, B = B * a.B, }); }
public void DrawAt(DirectBitmap chunkBmp, int tileX, int tileY, int numX, int numY) { MyDColor[][] tmpC = new MyDColor[Height / numY][]; int[][] tmpN = new int[tmpC.Length][]; for (int j = 0; j < Height / numY; j++) { tmpC[j] = new MyDColor[Width / numX]; tmpN[j] = new int[tmpC[j].Length]; } MyColor tmp2 = new MyColor(); unsafe { byte *dst = (byte *)chunkBmp.arrayPtr.ToPointer(); for (int j = 0; j < chunkBmp.Height; j++) { int jP = j * tmpC.Length / chunkBmp.Height; for (int i = 0; i < chunkBmp.Width; i++) { int iP = i * tmpC[jP].Length / chunkBmp.Width; tmp2.B = *dst++; tmp2.G = *dst++; tmp2.R = *dst++; tmp2.A = *dst++; Utils.WeightedColorAverage(ref tmpN[jP][iP], ref tmpC[jP][iP], ref tmp2); } } } int v0 = (numX - 1 - tileX) * Width / numX; int v1 = tileY * Height / numY; for (int j = 0; j < Height / numY; j++) { for (int i = 0; i < Width / numX; i++) { int iP = i; int jP = (Height / numY - 1 - j); this.SetPixel(iP + v0, jP + v1, tmpC[j][i].ToMyColor()); } } }