// Copyright (c) 2021 - 2021 kio@little-bat.de
// BSD-2-Clause license
// https://opensource.org/licenses/BSD-2-Clause

#include "kio/kio.h"
#include "DrawingCommand.h"
#include "Templates/Array.h"
#include "Image.h"

namespace gterm
{

#if maybe_faster_new

// size of memory in list is i*16:
static thread_local Array<void*> lists[10];


void* DrawingCommand::operator new (std::size_t size)
{
	assert((size&15) == 0);
	assert(size <= NELEM(lists)*16);

	uint i = uint(size) / 16;
	Array<void*>& list = lists[i];

	if (unlikely(list.count() == 0))
	{
		list.growmax(256);

		int sz = 0x1000;
		ptr p = new char[sz];
		while((sz-=size) >= 0)
		{
			list.append(p+sz);
		}
	}

	return list.pop();
}

void DrawingCommand::operator delete (void* p, std::size_t size) noexcept
{
	if (p)
	{
		uint i = uint(size) / 16;
		Array<void*>& list = lists[i];

		list.append(p);
	}
}

#endif


CmdDrawImage::CmdDrawImage(std::shared_ptr<class Image> image, int x, int y) noexcept
	: image(image)
	, z(QPoint(x,y),image->size)
	, q(QPoint(),image->size)
{
}

CmdDrawImage::CmdDrawImage(std::shared_ptr<class Image> image, const QPoint& z) noexcept
	: image(image)
	, z(z,image->size)
	, q(QPoint(),image->size)
{
}

CmdDrawImage::CmdDrawImage(std::shared_ptr<class Image> image, const QRect& z) noexcept // scaling
	: image(image)
	, z(z)
	, q(QPoint(),image->size)
{
}

CmdDrawImage::CmdDrawImage(std::shared_ptr<class Image> image, const QPoint& z, const QRect& q) noexcept
	: image(image)
	, z(z,q.size())
	, q(q)
{
}

CmdDrawImage::CmdDrawImage(std::shared_ptr<class Image> image, const QRect& z, const QPoint& q) noexcept
	: image(image)
	, z(z)
	, q(QRect(q,z.size()))
{
}



} // namespace




