Files
ptprnt/src/graphics/CairoWrapper.hpp
Moritz Martinius dae16f4a26
Some checks failed
Build ptprnt / build (push) Failing after 1m1s
Fix includes, fix copy ctor and mov ctor for CairoWrapper
2025-10-15 19:12:15 +02:00

146 lines
5.6 KiB
C++

/*
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 <https://www.gnu.org/licenses/>.
*/
#pragma once
#include "graphics/interface/ICairoWrapper.hpp"
namespace ptprnt::graphics {
/**
* @brief Real implementation of ICairoWrapper that forwards to actual Cairo/Pango C API
*
* This class simply forwards all calls to the real Cairo and Pango library functions.
* It's used as the default implementation in production code.
*/
class CairoWrapper : public ICairoWrapper {
public:
~CairoWrapper() override = default;
// No copy, no move
CairoWrapper(const CairoWrapper&) = delete;
CairoWrapper& operator=(const CairoWrapper&) = delete;
CairoWrapper(CairoWrapper&&) = delete;
CairoWrapper& operator=(CairoWrapper&&) = delete;
// Cairo image surface functions
cairo_surface_t* cairo_image_surface_create(cairo_format_t format, int width, int height) override {
return ::cairo_image_surface_create(format, width, height);
}
void cairo_surface_destroy(cairo_surface_t* surface) override { ::cairo_surface_destroy(surface); }
void cairo_surface_flush(cairo_surface_t* surface) override { ::cairo_surface_flush(surface); }
void cairo_surface_mark_dirty(cairo_surface_t* surface) override { ::cairo_surface_mark_dirty(surface); }
cairo_status_t cairo_surface_status(cairo_surface_t* surface) override { return ::cairo_surface_status(surface); }
cairo_format_t cairo_image_surface_get_format(cairo_surface_t* surface) override {
return ::cairo_image_surface_get_format(surface);
}
int cairo_image_surface_get_width(cairo_surface_t* surface) override {
return ::cairo_image_surface_get_width(surface);
}
int cairo_image_surface_get_height(cairo_surface_t* surface) override {
return ::cairo_image_surface_get_height(surface);
}
int cairo_image_surface_get_stride(cairo_surface_t* surface) override {
return ::cairo_image_surface_get_stride(surface);
}
unsigned char* cairo_image_surface_get_data(cairo_surface_t* surface) override {
return ::cairo_image_surface_get_data(surface);
}
cairo_status_t cairo_surface_write_to_png(cairo_surface_t* surface, const char* filename) override {
return ::cairo_surface_write_to_png(surface, filename);
}
// Cairo context functions
cairo_t* cairo_create(cairo_surface_t* surface) override { return ::cairo_create(surface); }
void cairo_destroy(cairo_t* cr) override { ::cairo_destroy(cr); }
void cairo_move_to(cairo_t* cr, double x, double y) override { ::cairo_move_to(cr, x, y); }
void cairo_set_source_rgb(cairo_t* cr, double red, double green, double blue) override {
::cairo_set_source_rgb(cr, red, green, blue);
}
// Pango-Cairo functions
PangoFontMap* pango_cairo_font_map_new() override { return ::pango_cairo_font_map_new(); }
PangoContext* pango_cairo_create_context(cairo_t* cr) override { return ::pango_cairo_create_context(cr); }
void pango_cairo_show_layout(cairo_t* cr, PangoLayout* layout) override { ::pango_cairo_show_layout(cr, layout); }
// Pango layout functions
PangoLayout* pango_layout_new(PangoContext* context) override { return ::pango_layout_new(context); }
void pango_layout_set_font_description(PangoLayout* layout, const PangoFontDescription* desc) override {
::pango_layout_set_font_description(layout, desc);
}
void pango_layout_set_text(PangoLayout* layout, const char* text, int length) override {
::pango_layout_set_text(layout, text, length);
}
void pango_layout_set_height(PangoLayout* layout, int height) override {
::pango_layout_set_height(layout, height);
}
void pango_layout_set_alignment(PangoLayout* layout, PangoAlignment alignment) override {
::pango_layout_set_alignment(layout, alignment);
}
void pango_layout_set_justify(PangoLayout* layout, gboolean justify) override {
::pango_layout_set_justify(layout, justify);
}
#if PANGO_VERSION_MAJOR >= 1 && PANGO_VERSION_MINOR >= 50
void pango_layout_set_justify_last_line(PangoLayout* layout, gboolean justify) override {
::pango_layout_set_justify_last_line(layout, justify);
}
#endif
void pango_layout_get_size(PangoLayout* layout, int* width, int* height) override {
::pango_layout_get_size(layout, width, height);
}
// Pango font description functions
PangoFontDescription* pango_font_description_new() override { return ::pango_font_description_new(); }
void pango_font_description_set_size(PangoFontDescription* desc, gint size) override {
::pango_font_description_set_size(desc, size);
}
void pango_font_description_set_family(PangoFontDescription* desc, const char* family) override {
::pango_font_description_set_family(desc, family);
}
// GObject reference counting
void g_object_unref(gpointer object) override { ::g_object_unref(object); }
};
} // namespace ptprnt::graphics