// SwiftShader Software Renderer
//
// Copyright(c) 2005-2012 TransGaming Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//

// Surface.h: Defines the egl::Surface class, representing a drawing surface
// such as the client area of a window, including any back buffers.
// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.

#ifndef INCLUDE_SURFACE_H_
#define INCLUDE_SURFACE_H_

#include "Main/FrameBuffer.hpp"

#define EGLAPI
#include <EGL/egl.h>

namespace egl
{
class Display;
class Config;
class Texture2D;
class Image;

class Surface
{
public:
    Surface(Display *display, const egl::Config *config, EGLNativeWindowType window);
    Surface(Display *display, const egl::Config *config, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget);

    virtual ~Surface();

	bool initialize();
    void swap();

	EGLNativeWindowType getWindowHandle();
    
    virtual egl::Image *getRenderTarget();
    virtual egl::Image *getDepthStencil();

    void setSwapInterval(EGLint interval);

    virtual EGLint getConfigID() const;
    virtual EGLint getWidth() const;
    virtual EGLint getHeight() const;
    virtual EGLint getPixelAspectRatio() const;
    virtual EGLenum getRenderBuffer() const;
    virtual EGLenum getSwapBehavior() const;
    virtual EGLenum getTextureFormat() const;
    virtual EGLenum getTextureTarget() const;
    virtual sw::Format getInternalFormat() const;

    virtual void setBoundTexture(egl::Texture2D *texture);
    virtual egl::Texture2D *getBoundTexture() const;

	bool checkForResize();   // Returns true if surface changed due to resize

public:
    void release();
    bool reset();

    Display *const mDisplay;
    egl::Image *mDepthStencil;
	sw::FrameBuffer *frameBuffer;
	egl::Image *backBuffer;
	egl::Texture2D *mTexture;

	bool reset(int backbufferWidth, int backbufferHeight);
    
    const EGLNativeWindowType mWindow;   // Window that the surface is created for.
    bool mWindowSubclassed;              // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
    const egl::Config *mConfig;          // EGL config surface was created with
    EGLint mHeight;                      // Height of surface
    EGLint mWidth;                       // Width of surface
//  EGLint horizontalResolution;         // Horizontal dot pitch
//  EGLint verticalResolution;           // Vertical dot pitch
//  EGLBoolean largestPBuffer;           // If true, create largest pbuffer possible
//  EGLBoolean mipmapTexture;            // True if texture has mipmaps
//  EGLint mipmapLevel;                  // Mipmap level to render to
//  EGLenum multisampleResolve;          // Multisample resolve behavior
    EGLint mPixelAspectRatio;            // Display aspect ratio
    EGLenum mRenderBuffer;               // Render buffer
    EGLenum mSwapBehavior;               // Buffer swap behavior
    EGLenum mTextureFormat;              // Format of texture: RGB, RGBA, or no texture
    EGLenum mTextureTarget;              // Type of texture: 2D or no texture
//  EGLenum vgAlphaFormat;               // Alpha format for OpenVG
//  EGLenum vgColorSpace;                // Color space for OpenVG
    EGLint mSwapInterval;
};
}

#endif   // INCLUDE_SURFACE_H_
