// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Surface.h: Defines the Surface class, representing a drawing surface
// such as the client area of a window, including any back buffers.

#ifndef INCLUDE_SURFACE_H_
#define INCLUDE_SURFACE_H_

#include "Main/FrameBuffer.hpp"

#define _GDI32_
#include <windows.h>
#include <GL/GL.h>
#include <GL/glext.h>

#if defined(_WIN32)
typedef HDC     NativeDisplayType;
typedef HBITMAP NativePixmapType;
typedef HWND    NativeWindowType;
#else
#error
#endif

namespace gl
{
class Image;
class Display;

class Surface
{
public:
	Surface(Display *display, NativeWindowType window);
	Surface(Display *display, GLint width, GLint height, GLenum textureFormat, GLenum textureTarget);

	virtual ~Surface();

	bool initialize();
	void swap();

	virtual Image *getRenderTarget();
	virtual Image *getDepthStencil();

	void setSwapInterval(GLint interval);

	virtual GLint getWidth() const;
	virtual GLint getHeight() const;
	virtual GLenum getTextureFormat() const;
	virtual GLenum getTextureTarget() const;

	bool checkForResize();   // Returns true if surface changed due to resize

private:
	void release();
	bool reset();

	Display *const mDisplay;
	Image *mDepthStencil;
	sw::FrameBuffer *frameBuffer;
	Image *backBuffer;

	bool reset(int backbufferWidth, int backbufferHeight);

	const NativeWindowType mWindow;   // Window that the surface is created for.
	bool mWindowSubclassed;           // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
	GLint mHeight;                    // Height of surface
	GLint mWidth;                     // Width of surface
	GLenum mTextureFormat;            // Format of texture: RGB, RGBA, or no texture
	GLenum mTextureTarget;            // Type of texture: 2D or no texture
	GLint mSwapInterval;
};
}

#endif   // INCLUDE_SURFACE_H_
