/* ptrnt - print labels on linux Copyright (C) 2025 Moritz Martinius This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #pragma once #include #include #include #include constexpr const char* DEFAULT_FONT_FAMILY = "sans"; constexpr const double DEFAULT_FONT_SIZE = 32.0; enum class HAlignPosition { UNKNOWN = 0, LEFT = 1, CENTER = 2, RIGHT = 3, JUSTIFY = 4, }; const std::map HALignPositionMap{{"", HAlignPosition::UNKNOWN}, {"left", HAlignPosition::LEFT}, {"center", HAlignPosition::CENTER}, {"right", HAlignPosition::RIGHT}, {"justify", HAlignPosition::JUSTIFY}}; enum class VAlignPosition { UNKNOWN = 0, TOP = 1, MIDDLE = 2, BOTTOM = 3, }; const std::map VALignPositionMap{{"", VAlignPosition::UNKNOWN}, {"top", VAlignPosition::TOP}, {"middle", VAlignPosition::MIDDLE}, {"bottom", VAlignPosition::BOTTOM}}; struct PrintableText { std::string text{""}; std::string fontFamily{DEFAULT_FONT_FAMILY}; double fontSize{DEFAULT_FONT_SIZE}; HAlignPosition hAlign{HAlignPosition::LEFT}; VAlignPosition vAlign{VAlignPosition::MIDDLE}; }; namespace ptprnt::graphics { class ILabel { public: virtual ~ILabel() = default; virtual bool create(PrintableText printableText) = 0; virtual bool create(const std::string& labelText) = 0; virtual std::vector getRaw() const = 0; virtual int getWidth() const = 0; virtual int getHeight() const = 0; virtual void setText(const std::string& text) = 0; virtual void setFontSize(const double fontSize) = 0; virtual void setFontFamily(const std::string& fontFamily) = 0; virtual void setHAlign(HAlignPosition hpos) = 0; virtual void setVAlign(VAlignPosition vpos) = 0; /** * @brief Append another label horizontally with spacing * @param other The label to append * @param spacingPx Spacing between labels in pixels (default: 60px ~5mm at 300dpi) * @return true on success, false if heights don't match */ virtual bool append(const ILabel& other, uint32_t spacingPx = 60) = 0; }; } // namespace ptprnt::graphics