using System;
using System.Collections.Generic;
using System.Text;
using CommonUI.Display;
using CommonUI.Gemo;

namespace CommonUI.Display
{

    public enum Blend : byte
    {
        BLEND_MODE_NORMAL = Data.Blend.BLEND_MODE_NORMAL,
        BLEND_MODE_SCREEN = Data.Blend.BLEND_MODE_SCREEN,
        BLEND_MODE_GRAY = Data.Blend.BLEND_MODE_GRAY,
    }

    public enum Anchor : byte
    {
        NONE = Data.Anchor.NONE,
        ANCHOR_LEFT = Data.Anchor.ANCHOR_LEFT,
        ANCHOR_HCENTER = Data.Anchor.ANCHOR_HCENTER,
        ANCHOR_RIGHT = Data.Anchor.ANCHOR_RIGHT,

        ANCHOR_TOP = Data.Anchor.ANCHOR_TOP,
        ANCHOR_VCENTER = Data.Anchor.ANCHOR_VCENTER,
        ANCHOR_BOTTOM = Data.Anchor.ANCHOR_BOTTOM,
    }

    public enum Trans : byte
    {
        TRANS_NONE = Data.Trans.TRANS_NONE,
        TRANS_ROT90 = Data.Trans.TRANS_ROT90,
        TRANS_ROT180 = Data.Trans.TRANS_ROT180,
        TRANS_ROT270 = Data.Trans.TRANS_ROT270,
        TRANS_MIRROR = Data.Trans.TRANS_MIRROR,
        TRANS_MIRROR_ROT90 = Data.Trans.TRANS_MIRROR_ROT90,
        TRANS_MIRROR_ROT180 = Data.Trans.TRANS_MIRROR_ROT180,
        TRANS_MIRROR_ROT270 = Data.Trans.TRANS_MIRROR_ROT270,
    }

    public enum ImageAnchor : byte
    {
        L_T = Data.ImageAnchor.L_T,
        C_T = Data.ImageAnchor.C_T,
        R_T = Data.ImageAnchor.R_T,
        L_C = Data.ImageAnchor.L_C,
        C_C = Data.ImageAnchor.C_C,
        R_C = Data.ImageAnchor.R_C,
        L_B = Data.ImageAnchor.L_B,
        C_B = Data.ImageAnchor.C_B,
        R_B = Data.ImageAnchor.R_B,
    }

    public enum ImageTrans : byte
    {
        NONE = (Trans.TRANS_NONE),
        R_90 = (Trans.TRANS_ROT90),
        R_180 = (Trans.TRANS_ROT180),
        R_270 = (Trans.TRANS_ROT270),
        MIRROR = (Trans.TRANS_MIRROR),
        MR_90 = (Trans.TRANS_MIRROR_ROT90),
        MR_180 = (Trans.TRANS_MIRROR_ROT180),
        MR_270 = (Trans.TRANS_MIRROR_ROT270),
    }

	

	//	------------------------------------------------------------------------------------------
	//	-by zhangyifei
	//	------------------------------------------------------------------------------------------

    public abstract class Graphics : IDisposable
    {
        public const float ANGLE_90 = (float)(90);
        public const float ANGLE_180 = (float)(180);
        public const float ANGLE_270 = (float)(270);

        public abstract void setBlend(Blend blend);
        public abstract Blend getBlend();
        public abstract uint getColor();
        public abstract void setColor(uint color);
        public abstract void setColor(int red, int green, int blue);
        public abstract void setColor(int red, int green, int blue, int alpha);
        public abstract void setColor(float red, float green, float blue, float alpha);
        public abstract void setAlpha(float alpha);
        public abstract float getAlpha();
        public virtual void addAlpha(float add)
        {
            setAlpha(getAlpha() * add);
        }

        public abstract void SetClip(Rectangle2D rect);
        public abstract void SetClip(float x, float y, float w, float h);
        public abstract void PushClip();
        public abstract void PopClip();

        #region TRANSFORM

        public abstract void translate(float x, float y);
        public abstract void rotate(float angle);
        public abstract void scale(float sx, float sy);
        public abstract void pushTransform();
        public abstract void popTransform();

        #endregion

        #region IMAGE

        public abstract void beginImage(Image image);
        public abstract void drawVertex(VertexBuffer vertex);
        public abstract void drawVertex(VertexBuffer vertex, int[] indices, VertexTopology mode);
        public abstract void drawVertexSequence(VertexBuffer vertex, VertexTopology mode);

        public abstract void drawImageZoom(
           float x, float y, float w, float h);
        public abstract void drawImage(
            float x, float y);
        public abstract void drawImage(
            float x, float y, Anchor anchor);
        public abstract void drawImageTrans(
            float x, float y, Trans trans);
        public abstract void drawRegion(
            float sx, float sy,
            float w, float h,
            Trans tx,
            float dx, float dy);
        public abstract void drawRegion(
            float sx, float sy,
            float sw, float sh,
            float dx, float dy,
            float dw, float dh);
        public abstract void drawImageEllipse(
            float sx, float sy,
            float sw, float sh,
            float startAngle,
            float endAngle);
      

        public abstract void drawImageZoom(Image image,
            float x, float y, float w, float h);
        public abstract void drawImage(Image image,
            float x, float y);
        public abstract void drawImage(Image image,
            float x, float y, Anchor anchor);
        public abstract void drawImageTrans(Image image,
            float x, float y, Trans trans);
        public abstract void drawRegion(Image src,
            float sx, float sy, 
            float w, float h, 
            Trans tx, 
            float dx, float dy);
        public abstract void drawRegion(Image src,
            float sx, float sy,
            float sw, float sh,
            float dx, float dy,
            float dw, float dh);
     
        #endregion

        #region SHAPE

        public abstract void drawLine(float x1, float y1, float x2, float y2);

        public abstract void drawRect(float x, float y, float w, float h);
        public abstract void fillRect(float x, float y, float w, float h);

        public abstract void drawRoundRect(float x, float y, float w, float h, float rx, float ry);
        public abstract void fillRoundRect(float x, float y, float w, float h, float rx, float ry);

        public abstract void drawArc(float x, float y, float w, float h, float startAngle, float arcAngle);
        public abstract void fillArc(float x, float y, float w, float h, float startAngle, float arcAngle);

        public abstract void fillRect4Color(float x, float y, float w, float h, uint[] rgba);

        #endregion

        public abstract void drawTextLayer(
            TextLayer text, 
            float x, float y, 
            Anchor anchor);

        public abstract void drawTextLayer(
            TextLayer text, 
            float x, float y, float w, float h,
            ImageAnchor anchor);

        public abstract void Dispose();
    }




    public class NullGraphics : CommonUI.Display.Graphics
    {
        public static NullGraphics SimpleGraphics = new NullGraphics();

        private float m_alpha = 1f;
        private Blend m_blend = Blend.BLEND_MODE_NORMAL;
        private uint m_color = 0xffffffff;

        public override void Dispose() { }

        public override void beginImage(Image image) { }
        public override void drawImage(float x, float y) { }
        public override void drawImage(Image image, float x, float y) { }
        public override void drawImage(float x, float y, Anchor anchor) { }
        public override void drawImage(Image image, float x, float y, Anchor anchor) { }
        public override void drawImageEllipse(float sx, float sy, float sw, float sh, float startAngle, float endAngle) { }
        public override void drawImageTrans(float x, float y, Trans trans) { }
        public override void drawImageTrans(Image image, float x, float y, Trans trans) { }
        public override void drawImageZoom(float x, float y, float w, float h) { }
        public override void drawImageZoom(Image image, float x, float y, float w, float h) { }

        public override void drawArc(float x, float y, float w, float h, float startAngle, float arcAngle) { }
        public override void drawLine(float x1, float y1, float x2, float y2) { }

        public override void drawRect(float x, float y, float w, float h) { }
        public override void drawRegion(float sx, float sy, float w, float h, Trans tx, float dx, float dy) { }
        public override void drawRegion(Image src, float sx, float sy, float w, float h, Trans tx, float dx, float dy) { }
        public override void drawRegion(float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh) { }
        public override void drawRegion(Image src, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh) { }
        public override void drawRoundRect(float x, float y, float w, float h, float rx, float ry) { }

        public override void fillRect4Color(float x, float y, float w, float h, uint[] rgba) { }
        public override void fillRoundRect(float x, float y, float w, float h, float rx, float ry) { }
        public override void fillArc(float x, float y, float w, float h, float startAngle, float arcAngle) { }
        public override void fillRect(float x, float y, float w, float h) { }

        public override void drawTextLayer(TextLayer text, float x, float y, Anchor anchor) { }
        public override void drawTextLayer(TextLayer text, float x, float y, float w, float h, ImageAnchor anchor) { }
        public override void drawVertex(VertexBuffer vertex) { }
        public override void drawVertex(VertexBuffer vertex, int[] indices, VertexTopology mode) { }
        public override void drawVertexSequence(VertexBuffer vertex, VertexTopology mode) { }

        public override float getAlpha() { return m_alpha; }
        public override Blend getBlend() { return m_blend; }
        public override uint getColor() { return m_color; }
        public override void setAlpha(float alpha) { }
        public override void setBlend(Blend blend) { }
        public override void setColor(uint color) { }
        public override void setColor(int red, int green, int blue) { }
        public override void setColor(float red, float green, float blue, float alpha) { }
        public override void setColor(int red, int green, int blue, int alpha) { }

        public override void PopClip() { }
        public override void PushClip() { }
        public override void SetClip(Rectangle2D rect) { }
        public override void SetClip(float x, float y, float w, float h) { }

        public override void pushTransform() { }
        public override void translate(float x, float y) { }
        public override void rotate(float angle) { }
        public override void scale(float sx, float sy) { }
        public override void popTransform() { }


    }
}