2017-04-12 01:23:07 +09:00

278 lines
5.5 KiB
C#

using UnityEngine;
[System.Serializable]
public class D2D_Pixels
{
[SerializeField]
private int width;
[SerializeField]
private int height;
[SerializeField]
private Color32[] pixels;
public int Width
{
get
{
return width;
}
}
public int Height
{
get
{
return height;
}
}
public Color32[] Pixels
{
get
{
return pixels;
}
}
public D2D_Pixels()
{
}
public D2D_Pixels(Texture texture) : this((Texture2D)texture)
{
}
public D2D_Pixels(Sprite sprite)
{
if (sprite == null) throw new System.ArgumentNullException();
#if UNITY_EDITOR
D2D_Helper.MakeTextureReadable(sprite.texture);
#endif
var rect = sprite.textureRect;
var sourceWidth = sprite.texture.width;
var sourcePixels = sprite.texture.GetPixels32();
var sourceOffset = sourceWidth * (int)rect.yMin + (int)rect.xMin;
var targetOffset = 0;
width = (int)rect.width;
height = (int)rect.height;
pixels = new Color32[width * height];
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
pixels[targetOffset + x] = sourcePixels[sourceOffset + x];
}
sourceOffset += sourceWidth;
targetOffset += width;
}
}
public D2D_Pixels(Texture2D texture)
{
if (texture == null) throw new System.ArgumentNullException();
#if UNITY_EDITOR
D2D_Helper.MakeTextureReadable(texture);
#endif
width = texture.width;
height = texture.height;
pixels = texture.GetPixels32();
}
public D2D_Pixels(int newWidth, int newHeight)
{
if (newWidth < 0) throw new System.ArgumentOutOfRangeException();
if (newHeight < 0) throw new System.ArgumentOutOfRangeException();
width = newWidth;
height = newHeight;
pixels = new Color32[newWidth * newHeight];
}
public D2D_Pixels(int newWidth, int newHeight, Color32[] newPixels)
{
if (newWidth < 0) throw new System.ArgumentOutOfRangeException();
if (newHeight < 0) throw new System.ArgumentOutOfRangeException();
if (newPixels == null) throw new System.ArgumentNullException();
if (newWidth * newHeight != newPixels.Length) throw new System.ArgumentOutOfRangeException();
width = newWidth;
height = newHeight;
pixels = newPixels;
}
public Color32 GetPixel(int x, int y)
{
return pixels[x + width * y];
}
public Color32 GetPixelTransparent(int x, int y)
{
if (x < 0 || y < 0 || x >= width || y >= height) return new Color32(0, 0, 0, 0);
return pixels[x + width * y];
}
public Color32 GetPixelClamp(int x, int y)
{
if (x < 0) x = 0; else if (x >= width ) x = width -1;
if (y < 0) y = 0; else if (y >= height) y = height -1;
return pixels[x + width * y];
}
public Color32 GetPixelRepeat(int x, int y)
{
x = x >= 0 ? x % width : width + (x % width );
y = y >= 0 ? y % height : height + (y % height);
return pixels[x + width * y];
}
public Color32 GetPixelBilinear(float u, float v)
{
u = u * (width - 1);
v = v * (height - 1);
var x = Mathf.FloorToInt(u);
var y = Mathf.FloorToInt(v);
var s = u - x;
var t = v - y;
var bl = GetPixelClamp(x , y );
var br = GetPixelClamp(x + 1, y );
var tl = GetPixelClamp(x , y + 1);
var tr = GetPixelClamp(x + 1, y + 1);
var bb = Color32.Lerp(bl, br, s);
var tt = Color32.Lerp(tl, tr, s);
return Color32.Lerp(bb, tt, t);
}
public void SetPixel(int x, int y, Color32 colour)
{
pixels[x + width * y] = colour;
}
public void SetPixelClamp(int x, int y, Color32 colour)
{
if (x < 0) x = 0; else if (x >= width ) x = width -1;
if (y < 0) y = 0; else if (y >= height) y = height -1;
pixels[x + width * y] = colour;
}
public void SetPixels(int x, int y, D2D_Pixels s)
{
for (var sy = 0; sy < s.height; sy++)
{
for (var sx = 0; sx < s.width; sx++)
{
SetPixel(x + sx, y + sy, s.GetPixel(sx, sy));
}
}
}
public void SetPixelsClamp(int x, int y, D2D_Pixels s)
{
for (var sy = 0; sy < s.height; sy++)
{
for (var sx = 0; sx < s.width; sx++)
{
SetPixelClamp(x + sx, y + sy, s.GetPixelClamp(sx, sy));
}
}
}
public D2D_Pixels GetResized(int newWidth, int newHeight)
{
var o = new D2D_Pixels(newWidth, newHeight);
var w = (float)(newWidth - 1);
var h = (float)(newHeight - 1);
for (var y = 0; y < newHeight; y++)
{
for (var x = 0; x < newWidth; x++)
{
var pixel = GetPixelBilinear((float)x / w, (float)y / h);
o.SetPixel(x, y, pixel);
}
}
return o;
}
public D2D_Pixels GetBlurredAlpha()
{
var o = new D2D_Pixels(width, height);
// Horizontal
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
var a = GetPixelTransparent(x - 1, y);
var b = GetPixelTransparent(x , y);
var c = GetPixelTransparent(x + 1, y);
var t = (int)a.a + (int)b.a + (int)c.a;
b.a = (byte)(t / 3);
o.SetPixel(x, y, b);
}
}
// Vertical
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
var a = GetPixelTransparent(x, y - 1);
var b = GetPixelTransparent(x, y );
var c = GetPixelTransparent(x, y + 1);
var t = (int)a.a + (int)b.a + (int)c.a;
b.a = (byte)(t / 3);
o.SetPixel(x, y, b);
}
}
return o;
}
public Texture2D Apply(TextureFormat format, bool mipmap = false, bool linear = false)
{
var texture = new Texture2D(width, height, format, mipmap, linear);
texture.SetPixels32(pixels);
texture.Apply();
return texture;
}
public byte[] ApplyAlpha()
{
var alphas = new byte[pixels.Length];
for (var i = 0; i < pixels.Length; i++)
{
alphas[i] = pixels[i].a;
}
return alphas;
}
}