#region Using Statements
using System;
using ANX.Framework.Graphics;

#endregion // Using Statements

// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license

namespace ANX.Framework.NonXNA
{
    public interface INativeGraphicsDevice : IDisposable
    {
        void Clear(ref Color color);
        void Clear(ClearOptions options, Vector4 color, float depth, int stencil);

        void Present();

        void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount);

        void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount);

        void DrawUserIndexedPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration, IndexElementSize indexFormat) where T : struct, IVertexType;

        void DrawUserPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType;

        void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount);

        void SetVertexBuffers(VertexBufferBinding[] vertexBuffers);

        void SetIndexBuffer(IndexBuffer indexBuffer);

        void SetViewport(Viewport viewport);

        void SetRenderTargets(params RenderTargetBinding[] renderTargets);

        void GetBackBufferData<T>(Nullable<Rectangle> rect, T[] data, int startIndex, int elementCount) where T : struct;
        void GetBackBufferData<T>(T[] data) where T : struct;
        void GetBackBufferData<T>(T[] data, int startIndex, int elementCount) where T : struct;

        void ResizeBuffers(PresentationParameters presentationParameters);

        bool VSync { get; set; }
    }
}