/* Crafter®.Graphics Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ module; #define STB_IMAGE_IMPLEMENTATION #include "../lib/stb_image.h" #include "../lib/stb_truetype.h" module Crafter.Graphics:RenderingElement_impl; import :RenderingElement; import :Window; import :Types; import :Font; import std; using namespace Crafter; RenderingElement::RenderingElement() : Transform() { } RenderingElement::RenderingElement(std::int_fast32_t anchorX, std::int_fast32_t anchorY, std::uint_fast32_t relativeWidth, std::uint_fast32_t relativeHeight, std::int_fast32_t anchorOffsetX, std::int_fast32_t anchorOffsetY, std::int_fast32_t z, bool ignoreScaling) : Transform(anchorX, anchorY, relativeWidth, relativeHeight, anchorOffsetX, anchorOffsetY, z, ignoreScaling) { } RenderingElement::RenderingElement(std::uint_fast32_t bufferWidth, std::uint_fast32_t bufferHeight, std::int_fast32_t anchorX, std::int_fast32_t anchorY, std::uint_fast32_t relativeWidth, std::uint_fast32_t relativeHeight, std::int_fast32_t anchorOffsetX, std::int_fast32_t anchorOffsetY, std::int_fast32_t z, bool ignoreScaling) : bufferWidth(bufferWidth), bufferHeight(bufferHeight), buffer(bufferWidth*bufferHeight), Transform(anchorX, anchorY, relativeWidth, relativeHeight, anchorOffsetX, anchorOffsetY, z, ignoreScaling) { } void RenderingElement::ResizeBuffer(std::uint_fast32_t width, std::uint_fast32_t height) { this->bufferWidth = width; this->bufferHeight = height; buffer.resize(width * height); } void RenderingElement::CopyNearestNeighbour(Pixel_BU8_GU8_RU8_AU8* dst, std::uint_fast32_t dstWidth, std::uint_fast32_t dstHeight) const { for (std::uint_fast32_t y = 0; y < dstHeight; y++) { std::uint_fast32_t srcY = y * bufferHeight / dstHeight; for (std::uint_fast32_t x = 0; x < dstWidth; x++) { std::uint_fast32_t srcX = x * bufferWidth / dstWidth; dst[y * dstWidth + x] = buffer[srcY * bufferWidth + srcX]; } } } void RenderingElement::UpdatePosition(Window& window) { window.ScaleElement(*this); bufferScaled.resize(scaled.width * scaled.height); CopyNearestNeighbour(bufferScaled.data(), scaled.width, scaled.height); for(Transform* child : children) { child->UpdatePosition(window, *this); } } void RenderingElement::UpdatePosition(Window& window, Transform& parent) { window.ScaleElement(*this, parent); bufferScaled.resize(scaled.width * scaled.height); CopyNearestNeighbour(bufferScaled.data(), scaled.width, scaled.height); for(Transform* child : children) { child->UpdatePosition(window, *this); } }