/// <summary> /// Traverse the tree, building up the color palette /// </summary> /// <param name="palette">The palette</param> /// <param name="index">The current palette index</param> public void ConstructPalette(TPixel[] palette, ref int index) { if (this.leaf) { // This seems faster than using Vector4 byte r = (this.red / this.pixelCount).ToByte(); byte g = (this.green / this.pixelCount).ToByte(); byte b = (this.blue / this.pixelCount).ToByte(); // And set the color of the palette entry TPixel pixel = default; pixel.PackFromRgba32(new Rgba32(r, g, b, 255)); palette[index] = pixel; // Consume the next palette index this.paletteIndex = index++; } else { // Loop through children looking for leaves for (int i = 0; i < 8; i++) { if (this.children[i] != null) { this.children[i].ConstructPalette(palette, ref index); } } } }
public override Image <TPixel> GetImage() { Image <TPixel> image = base.GetImage(); TPixel color = default(TPixel); color.PackFromRgba32(new Rgba32(this.r, this.g, this.b, this.a)); return(image.Fill(color)); }
public void ConstructPalette(TPixel[] palette, ref int index) { if (this.leaf) { // Set the color of the palette entry var vector = Vector3.Clamp(new Vector3(this.red, this.green, this.blue) / this.pixelCount, Vector3.Zero, new Vector3(255)); TPixel pixel = default; pixel.PackFromRgba32(new Rgba32((byte)vector.X, (byte)vector.Y, (byte)vector.Z, byte.MaxValue)); palette[index] = pixel; // Consume the next palette index this.paletteIndex = index++; } else { // Loop through children looking for leaves for (int i = 0; i < 8; i++) { this.children[i]?.ConstructPalette(palette, ref index); } } }