|
|
|
|
@@ -148,6 +148,176 @@ void TSE::Texture::GetPixel(const Vector2 &pos, Color &c) const
|
|
|
|
|
GetPixel(pos.x, pos.y, c);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSE::Texture TSE::Texture::CutOut(const Vector2 &pos, Vector2 &size) const
|
|
|
|
|
{
|
|
|
|
|
Texture result = Texture(0,0);
|
|
|
|
|
if(bmp == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to cut out texture. Source bitmap was nullptr.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int left = static_cast<int>(pos.x);
|
|
|
|
|
const int top = static_cast<int>(pos.y);
|
|
|
|
|
const int width = static_cast<int>(size.x);
|
|
|
|
|
const int height = static_cast<int>(size.y);
|
|
|
|
|
|
|
|
|
|
if(width <= 0 || height <= 0)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to cut out texture. Size must be greater than 0.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int texWidth = static_cast<int>(Width());
|
|
|
|
|
const int texHeight = static_cast<int>(Height());
|
|
|
|
|
if(left < 0 || top < 0 || left + width > texWidth || top + height > texHeight)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to cut out texture. Region out of bounds.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FIBITMAP* cut = FreeImage_Copy(bmp, left, top, left + width, top + height);
|
|
|
|
|
if(cut == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to cut out texture. FreeImage_Copy returned nullptr.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Texture out = Texture(width, height, Bpp);
|
|
|
|
|
if(out.bmp != nullptr)
|
|
|
|
|
FreeImage_Unload(out.bmp);
|
|
|
|
|
out.bmp = cut;
|
|
|
|
|
out.imagePtr = FreeImage_GetBits(cut);
|
|
|
|
|
out.Bpp = Bpp;
|
|
|
|
|
out.chanels = chanels;
|
|
|
|
|
out.Size = Vector2(width, height);
|
|
|
|
|
out.Apply();
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSE::Texture TSE::Texture::Upscale(const Vector2 &size) const
|
|
|
|
|
{
|
|
|
|
|
Texture result = Texture(0,0);
|
|
|
|
|
if(bmp == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to upscale texture. Source bitmap was nullptr.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int width = static_cast<int>(size.x);
|
|
|
|
|
const int height = static_cast<int>(size.y);
|
|
|
|
|
if(width <= 0 || height <= 0)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to upscale texture. Size must be greater than 0.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FIBITMAP* scaled = FreeImage_Rescale(bmp, width, height, FILTER_NEAREST);
|
|
|
|
|
if(scaled == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to upscale texture. FreeImage_Rescale returned nullptr.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Texture out = Texture(width, height, Bpp);
|
|
|
|
|
if(out.bmp != nullptr)
|
|
|
|
|
FreeImage_Unload(out.bmp);
|
|
|
|
|
out.bmp = scaled;
|
|
|
|
|
out.imagePtr = FreeImage_GetBits(scaled);
|
|
|
|
|
out.Bpp = Bpp;
|
|
|
|
|
out.chanels = chanels;
|
|
|
|
|
out.Size = Vector2(width, height);
|
|
|
|
|
out.Apply();
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TSE::Texture TSE::Texture::Downscale(const Vector2 &size) const
|
|
|
|
|
{
|
|
|
|
|
Texture result = Texture(0,0);
|
|
|
|
|
if(bmp == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to downscale texture. Source bitmap was nullptr.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int width = static_cast<int>(size.x);
|
|
|
|
|
const int height = static_cast<int>(size.y);
|
|
|
|
|
if(width <= 0 || height <= 0)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to downscale texture. Size must be greater than 0.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FIBITMAP* scaled = FreeImage_Rescale(bmp, width, height, FILTER_NEAREST);
|
|
|
|
|
if(scaled == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to downscale texture. FreeImage_Rescale returned nullptr.");
|
|
|
|
|
Texture::makeError(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Texture out = Texture(width, height, Bpp);
|
|
|
|
|
if(out.bmp != nullptr)
|
|
|
|
|
FreeImage_Unload(out.bmp);
|
|
|
|
|
out.bmp = scaled;
|
|
|
|
|
out.imagePtr = FreeImage_GetBits(scaled);
|
|
|
|
|
out.Bpp = Bpp;
|
|
|
|
|
out.chanels = chanels;
|
|
|
|
|
out.Size = Vector2(width, height);
|
|
|
|
|
out.Apply();
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TSE::Texture::PasteIn(const Vector2 &pos, Texture &t)
|
|
|
|
|
{
|
|
|
|
|
if(bmp == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to paste texture. Destination bitmap was nullptr.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(t.bmp == nullptr)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to paste texture. Source bitmap was nullptr.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(Bpp != t.Bpp)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to paste texture. Source and destination Bpp do not match.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int left = static_cast<int>(pos.x);
|
|
|
|
|
const int top = static_cast<int>(pos.y);
|
|
|
|
|
const int srcWidth = static_cast<int>(t.Width());
|
|
|
|
|
const int srcHeight = static_cast<int>(t.Height());
|
|
|
|
|
const int texWidth = static_cast<int>(Width());
|
|
|
|
|
const int texHeight = static_cast<int>(Height());
|
|
|
|
|
|
|
|
|
|
if(left < 0 || top < 0 || left + srcWidth > texWidth || top + srcHeight > texHeight)
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to paste texture. Region out of bounds.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!FreeImage_Paste(bmp, t.bmp, left, top, 256))
|
|
|
|
|
{
|
|
|
|
|
TSE_ERROR("Failed to paste texture. FreeImage_Paste returned false.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
imagePtr = FreeImage_GetBits(bmp);
|
|
|
|
|
Apply();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TSE::Texture::SetPixelNoApply(const Vector2 &pos, const Color &c)
|
|
|
|
|
{
|
|
|
|
|
SetPixelNoApply(pos.x, pos.y, c);
|
|
|
|
|
|