// 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.

#ifndef	sw_FrameBuffer_hpp
#define	sw_FrameBuffer_hpp

#include "Reactor/Reactor.hpp"
#include "Renderer/Surface.hpp"
#include "Common/Thread.hpp"

namespace sw
{
	using namespace rr;

	class Surface;

	struct BlitState
	{
		int width;
		int height;
		Format destFormat;
		Format sourceFormat;
		int destStride;
		int sourceStride;
		int cursorWidth;
		int cursorHeight;
	};

	class [[clang::lto_visibility_public]] FrameBuffer
	{
	public:
		FrameBuffer(int width, int height, bool fullscreen, bool topLeftOrigin);

		virtual ~FrameBuffer() = 0;

		virtual void flip(sw::Surface *source) = 0;
		virtual void blit(sw::Surface *source, const Rect *sourceRect, const Rect *destRect) = 0;

		virtual void *lock() = 0;
		virtual void unlock() = 0;

		static void setCursorImage(sw::Surface *cursor);
		static void setCursorOrigin(int x0, int y0);
		static void setCursorPosition(int x, int y);

		static std::shared_ptr<Routine> copyRoutine(const BlitState &state);

	protected:
		void copy(sw::Surface *source);

		bool windowed;

		void *framebuffer;   // Native window buffer.
		int width;
		int height;
		int stride;
		Format format;

	private:
		void copyLocked();

		static void threadFunction(void *parameters);

		void *renderbuffer;   // Render target buffer.

		struct Cursor
		{
			void *image;
			int x;
			int y;
			int width;
			int height;
			int hotspotX;
			int hotspotY;
			int positionX;
			int positionY;
		};

		static Cursor cursor;

		void (*blitFunction)(void *dst, void *src, Cursor *cursor);
		std::shared_ptr<Routine> blitRoutine;
		BlitState blitState;     // State of the current blitRoutine.
		BlitState updateState;   // State of the routine to be generated.

		static void blend(const BlitState &state, const Pointer<Byte> &d, const Pointer<Byte> &s, const Pointer<Byte> &c);

		Thread *blitThread;
		Event syncEvent;
		Event blitEvent;
		volatile bool terminate;

		static bool topLeftOrigin;
	};
}

#endif	 //	sw_FrameBuffer_hpp
