diff --git a/src/PtouchPrint.cpp b/src/PtouchPrint.cpp index 60caab3..e9375c3 100644 --- a/src/PtouchPrint.cpp +++ b/src/PtouchPrint.cpp @@ -39,6 +39,7 @@ #include "CLI/Option.hpp" #include "P700Printer.hpp" #include "graphics/Bitmap.hpp" +#include "graphics/Image.hpp" #include "libusbwrap/UsbDeviceFactory.hpp" namespace ptprnt { @@ -98,6 +99,10 @@ int PtouchPrint::run() { for (auto& cmd : mCommands) { spdlog::debug("Command: {}", cmd.second); + if (cmd.first == CliCmdType::Text) { + auto label{graphics::Image()}; + label.createLabel(cmd.second); + } } return 0; 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;