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

#include "FrameBufferOSX.hpp"

#include "Common/Debug.hpp"

#include <EGL/egl.h>
#import <QuartzCore/QuartzCore.h>

namespace sw {

	FrameBufferOSX::FrameBufferOSX(CALayer* layer, int width, int height)
		: FrameBuffer(width, height, false, false), width(width), height(height),
		  layer(layer), buffer(nullptr), provider(nullptr), currentImage(nullptr)
	{
		destFormat = sw::FORMAT_X8B8G8R8;
		int bufferSize = width * height * 4 * sizeof(uint8_t);
		buffer = new uint8_t[bufferSize];
		provider = CGDataProviderCreateWithData(nullptr, buffer, bufferSize, nullptr);
		colorspace = CGColorSpaceCreateDeviceRGB();
	}

	FrameBufferOSX::~FrameBufferOSX()
	{
		//[CATransaction begin];
		//[layer setContents:nullptr];
		//[CATransaction commit];

		CGImageRelease(currentImage);
		CGColorSpaceRelease(colorspace);
		CGDataProviderRelease(provider);

		delete[] buffer;
	}

	void FrameBufferOSX::flip(void *source, Format sourceFormat, size_t sourceStride)
	{
		blit(source, nullptr, nullptr, sourceFormat, sourceStride);
	}

	void FrameBufferOSX::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
	{
		copy(source, sourceFormat, sourceStride);

		int bytesPerRow = width * 4 * sizeof(uint8_t);
		CGImageRef image = CGImageCreate(width, height, 8, 32, bytesPerRow, colorspace, kCGBitmapByteOrder32Big, provider, nullptr, false, kCGRenderingIntentDefault);

		[CATransaction begin];
		[layer setContents:(id)image];
		[CATransaction commit];
		[CATransaction flush];

		if(currentImage)
		{
			CGImageRelease(currentImage);
		}
		currentImage = image;
	}

	void *FrameBufferOSX::lock()
	{
		stride = width * 4 * sizeof(uint8_t);
		locked = buffer;
		return locked;
	};

	void FrameBufferOSX::unlock()
	{
		locked = nullptr;
	};
}

sw::FrameBuffer *createFrameBuffer(void *display, EGLNativeWindowType nativeWindow, int width, int height)
{
	NSObject *window = reinterpret_cast<NSObject*>(nativeWindow);
	CALayer *layer = nullptr;

	if([window isKindOfClass:[NSView class]])
	{
		NSView *view = reinterpret_cast<NSView*>(window);
		[view setWantsLayer:YES];
		layer = [view layer];
	}
	else if([window isKindOfClass:[CALayer class]])
	{
		layer = reinterpret_cast<CALayer*>(window);
	}
	else ASSERT(0);

	return new sw::FrameBufferOSX(layer, width, height);
}
