Generate labels with pangocairo (#8)
All checks were successful
Build ptprnt / build (push) Successful in 3m41s

Goal of this PR is to have some basic labels generated with pangocairo
- size of the canvas should be matching the input text and grow/shrink accordingly
- basic formatting options like fontsize and align should be working

Reviewed-on: moritz/ptouch-prnt#8
This commit was merged in pull request #8.
This commit is contained in:
2025-10-12 20:07:18 +00:00
parent fec8ee231b
commit 05cd9d244c
43 changed files with 2087 additions and 622 deletions

View File

@@ -1,6 +1,6 @@
/*
ptrnt - print labels on linux
Copyright (C) 2023 Moritz Martinius
Copyright (C) 2023-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
@@ -20,22 +20,81 @@
#pragma once
#include <cstdint>
#include <span>
#include <vector>
#include "graphics/Bitmap.hpp"
namespace ptprnt::graphics {
class Monochrome {
public:
Monochrome(const std::vector<uint8_t>& grayscale);
~Monochrome() = default;
void setThreshold(uint8_t);
enum class Orientation {
LANDSCAPE = 0, // 0 degrees
PORTRAIT = 1, // 90 degrees clockwise
LANDSCAPE_FLIPPED = 2, // 180 degrees
PORTRAIT_FLIPPED = 3 // 270 degrees clockwise (90 counter-clockwise)
};
class MonochromeData {
public:
// Constructors
MonochromeData() : stride(0), orientation(Orientation::LANDSCAPE), width(0), height(0) {}
MonochromeData(std::vector<uint8_t> data, uint32_t stride_bytes, Orientation orient = Orientation::LANDSCAPE,
uint32_t w = 0, uint32_t h = 0)
: bytes(std::move(data)), stride(stride_bytes), orientation(orient), width(w), height(h) {}
// Constructor from grayscale data (replaces old Monochrome class)
MonochromeData(const std::vector<uint8_t>& grayscale, uint32_t width, uint32_t height,
Orientation orient = Orientation::LANDSCAPE);
MonochromeData(const std::span<uint8_t> grayscale, uint32_t width, uint32_t height,
Orientation orient = Orientation::LANDSCAPE);
~MonochromeData() = default;
// Copy constructor and assignment
MonochromeData(const MonochromeData&) = default;
MonochromeData& operator=(const MonochromeData&) = default;
// Move constructor and assignment
MonochromeData(MonochromeData&&) = default;
MonochromeData& operator=(MonochromeData&&) = default;
// Configuration methods
void setThreshold(uint8_t threshold);
void invert(bool shouldInvert);
std::vector<uint8_t> get();
// Get processed monochrome data
MonochromeData get();
// Transform the image data to the target orientation
void transformTo(Orientation targetOrientation);
// Visualize the monochrome data on stdout
void visualize() const;
// Helper methods for orientation transformations
[[nodiscard]] bool getBit(uint32_t x, uint32_t y) const;
void setBit(uint32_t x, uint32_t y, bool value);
[[nodiscard]] std::vector<uint8_t> createRotatedData(Orientation targetOrientation) const;
// Public member access for backward compatibility
std::vector<uint8_t> bytes;
uint32_t stride;
Orientation orientation;
uint32_t width; // Width in pixels
uint32_t height; // Height in pixels
private:
const std::vector<uint8_t>& mPixels;
uint8_t mThreshhold = 127;
bool mShouldInvert = false;
// Processing parameters (for old Monochrome class compatibility)
std::vector<uint8_t> mPixels; // Original grayscale pixels
uint8_t mThreshold = UINT8_MAX / 2;
bool mShouldInvert = false;
bool mIsProcessed = false; // Flag to indicate if conversion has been done
// Helper method to convert grayscale to monochrome
void processGrayscaleToMonochrome();
};
// For backward compatibility, create a type alias
using Monochrome = MonochromeData;
} // namespace ptprnt::graphics