/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #include "Math/Math.hpp" #include #include struct FT_FaceRec_; namespace OpenVulkano::Scene { struct GlyphForPacking { uint32_t code; Math::Vector2i size; Math::Vector2d atlasPos; size_t firstGlyphByteInAtlas; }; struct Shelf { static std::vector CreateShelves(uint32_t atlasWidth, std::vector& glyphs, FT_FaceRec_* face, int channelsCount); Shelf(uint32_t width, uint32_t height, int pixelSize, uint32_t prevShelvesHeight) : m_width(width), m_height(height), m_remainingWidth(width), m_prevShelvesHeight(prevShelvesHeight), m_pixelSize(pixelSize) {} bool HasSpaceForGlyph(uint32_t glyphWidth, uint32_t glyphHeight) const { return m_remainingWidth >= glyphWidth && m_height >= glyphHeight; } uint32_t GetWidth() const { return m_width; } uint32_t GetHeight() const { return m_height; } uint32_t GetNextGlyphPos() const { return m_nextGlyphPos; }; uint32_t GetOccupiedSize() const { return ((m_width - m_remainingWidth) * m_height); } uint32_t GetPrevShelvesHeight() const { return m_prevShelvesHeight; } int GetPixelSize() const { return m_pixelSize; } std::optional> AddGlyph(uint32_t glyphWidth, uint32_t glyphHeight) { if (!HasSpaceForGlyph(glyphWidth, glyphHeight)) { return {}; } uint32_t insertionPos = m_nextGlyphPos; m_nextGlyphPos += glyphWidth; m_remainingWidth -= glyphWidth; uint32_t hOffset = m_height - (m_height - glyphHeight); uint32_t glyphFirstByte = (insertionPos * m_pixelSize) + ((hOffset * m_width * m_pixelSize) - (m_width * m_pixelSize)) + (m_prevShelvesHeight * m_width * m_pixelSize); return std::make_pair(insertionPos, glyphFirstByte); } private: uint32_t m_width; uint32_t m_height; uint32_t m_remainingWidth; uint32_t m_nextGlyphPos = 0; uint32_t m_prevShelvesHeight; int m_pixelSize; }; }