using UnityEngine;

// TODO: Confirm that there's actually value in this.  I suspect it only appears to be smaller due to how Unity's
// TODO: profiler is accounting for things.  Things that may impact this:
// TODO: * Whether texture is marked as readable.
// TODO: * Whether rendering pipeline is GLES or Metal (not sure about analogues on the Direct3D front).
// TODO:   * Specifically, whether or not semantics require the GL stack to keep a local copy of the texture data in
// TODO:     host RAM to avoid clobbering the GPU if the GL app writes to that area again.
// TODO: * Internal representation of texture (24bpp vs. 32bpp).
public class SVGDeviceSmall : ISVGDevice {
  private Texture2D _texture;

  private int _width;
  private int _height;

  public int Width { get { return _width; } }

  public int Height { get { return _height; } }

  private Color _color = Color.white;

  public void SetDevice(int width, int height) {
    SetDevice(width, height, false, false);
  }

  public void SetDevice(int width, int height, bool mipmaps, bool linear) {
    if(_texture == null) {
      _texture = new Texture2D(width, height, TextureFormat.RGB24, mipmaps, linear);
      _texture.hideFlags = HideFlags.HideAndDontSave;
      _width = width;
      _height = height;
    }
  }

  public void SetPixel(int x, int y) {
    if((x >= 0) && (x < _width) && (y >= 0) && (y < _height))
      _texture.SetPixel(_width - x, y, _color);
  }

  public Color GetPixel(int x, int y) {
    return _texture.GetPixel(x, y);
  }

  public void SetColor(Color color) {
    _color.r = color.r;
    _color.g = color.g;
    _color.b = color.b;
  }

  public Texture2D Render() {
    _texture.Apply();
    return _texture;
  }
}