From cf8492a71413071efe6fa4038bf6287c170c6920 Mon Sep 17 00:00:00 2001 From: Moritz Martinius Date: Sun, 12 Nov 2023 12:26:19 +0100 Subject: [PATCH] A somewhat working state, but still struggeling with pangocairo --- src/PtouchPrint.cpp | 1 + src/graphics/Image.cpp | 56 +++++++++++++++++++++++++++++++++++++++--- src/graphics/Image.hpp | 15 +++++++++++ 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/PtouchPrint.cpp b/src/PtouchPrint.cpp index ee08748..e933166 100644 --- a/src/PtouchPrint.cpp +++ b/src/PtouchPrint.cpp @@ -39,6 +39,7 @@ #include "PrinterDriverFactory.hpp" #include "PtouchPrint.hpp" #include "graphics/Bitmap.hpp" +#include "graphics/Image.hpp" #include "libusbwrap/UsbDeviceFactory.hpp" namespace ptprnt { diff --git a/src/graphics/Image.cpp b/src/graphics/Image.cpp index c28e8c0..d1ca4f7 100644 --- a/src/graphics/Image.cpp +++ b/src/graphics/Image.cpp @@ -19,13 +19,23 @@ #include "Image.hpp" +#include +#include + +#include +#include // remove me #include +#include "cairo.h" +#include "pango/pango-context.h" #include "pango/pango-font.h" +#include "pango/pango-layout.h" +#include "pango/pango-types.h" +#include "pango/pangocairo.h" namespace ptprnt::graphics { Image::Image() { - mSurface = cairo_image_surface_create(CAIRO_FORMAT_A8, 512, 128); + /*mSurface = cairo_image_surface_create(CAIRO_FORMAT_A8, 512, 128); cairo_t* cr = cairo_create(mSurface); mFontDescription = pango_font_description_new(); pango_font_description_set_family(mFontDescription, "sans"); @@ -42,7 +52,7 @@ Image::Image() { cairo_move_to(cr, 0.0, 94.0); pango_cairo_show_layout_line(cr, pango_layout_get_line(mLayout, 0)); - cairo_surface_write_to_png(mSurface, "hello.png"); + cairo_surface_write_to_png(mSurface, "hello.png");*/ } uint8_t* Image::getRaw() { @@ -50,8 +60,46 @@ uint8_t* Image::getRaw() { return cairo_image_surface_get_data(mSurface); } +uint8_t Image::getNumLines(std::string_view strv) { + return std::count(strv.begin(), strv.end(), '\n'); +} + +void Image::createLabel(const std::string& str) { + // create Pango layout first, to get the render dimensions + mSurface = cairo_image_surface_create(CAIRO_FORMAT_A8, 512, 128); + cairo_t* cr = cairo_create(mSurface); + //auto pangoCtx{pango_context_new()}; + auto pangoLyt{pango_cairo_create_layout(cr)}; + auto pangoFontDesc{pango_font_description_from_string("FreeSans 32")}; + + pango_layout_set_single_paragraph_mode(pangoLyt, true); + pango_layout_set_height(pangoLyt, getNumLines(str) * -1); + pango_layout_set_alignment(pangoLyt, PANGO_ALIGN_CENTER); + pango_layout_set_font_description(pangoLyt, pangoFontDesc); + pango_layout_set_text(pangoLyt, str.c_str(), static_cast(str.length())); + + // Debug only + GError* gerr{nullptr}; + pango_layout_write_to_file(pangoLyt, PANGO_LAYOUT_SERIALIZE_DEFAULT, "hello.txt", &gerr); + + // create Cairo surface from p ango layout + int* width{}; + int* height{}; // TODO: change me, fixed for current printer (128px) + PangoRectangle* rect{}; + + pango_cairo_show_layout(cr, pangoLyt); + pango_layout_get_extents(pangoLyt, rect, rect); + std::cerr << "Width is: " << rect->width << " height is:" << rect->height << std::endl; + + //auto cairoSfc{cairo_image_surface_create(CAIRO_FORMAT_A8, *width, *height)}; + + cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + + // Debug only + cairo_surface_write_to_png(mSurface, "hellow.png"); +} + Image::~Image() { - g_object_unref(mLayout); - pango_font_description_free(mFontDescription); + spdlog::info("Image dtor..."); } } // namespace ptprnt::graphics \ No newline at end of file diff --git a/src/graphics/Image.hpp b/src/graphics/Image.hpp index 2302787..86f2ca5 100644 --- a/src/graphics/Image.hpp +++ b/src/graphics/Image.hpp @@ -22,15 +22,30 @@ #include #include +#include namespace ptprnt::graphics { + +constexpr const char* DEFAULT_FONT_FAMILY = "sans"; +constexpr const uint8_t DEFAULT_FONT_SIZE = 32; + class Image { public: Image(); ~Image(); + + Image(const Image&) = delete; + Image& operator=(const Image&) = delete; + Image(Image&&) = delete; + Image& operator=(Image&&) = delete; + uint8_t* getRaw(); + void createLabel(const std::string& labelText); private: + // methods + uint8_t getNumLines(std::string_view str); + // members PangoLayout* mLayout; PangoFontDescription* mFontDescription; cairo_surface_t* mSurface;