Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::GCodeThumbnails Namespace Reference

Classes

struct  CompressedImageBuffer
 
struct  CompressedJPG
 
struct  CompressedPNG
 
struct  CompressedQOI
 

Functions

std::unique_ptr< CompressedImageBuffercompress_thumbnail_png (const ThumbnailData &data)
 
std::unique_ptr< CompressedImageBuffercompress_thumbnail_jpg (const ThumbnailData &data)
 
std::unique_ptr< CompressedImageBuffercompress_thumbnail_qoi (const ThumbnailData &data)
 
std::unique_ptr< CompressedImageBuffercompress_thumbnail (const ThumbnailData &data, GCodeThumbnailsFormat format)
 
template<typename WriteToOutput , typename ThrowIfCanceledCallback >
void export_thumbnails_to_file (ThumbnailsGeneratorCallback &thumbnail_cb, const std::vector< Vec2d > &sizes, GCodeThumbnailsFormat format, WriteToOutput output, ThrowIfCanceledCallback throw_if_canceled)
 

Function Documentation

◆ compress_thumbnail()

std::unique_ptr< CompressedImageBuffer > Slic3r::GCodeThumbnails::compress_thumbnail ( const ThumbnailData data,
GCodeThumbnailsFormat  format 
)
107{
108 switch (format) {
109 case GCodeThumbnailsFormat::PNG:
110 default:
111 return compress_thumbnail_png(data);
112 case GCodeThumbnailsFormat::JPG:
113 return compress_thumbnail_jpg(data);
114 case GCodeThumbnailsFormat::QOI:
115 return compress_thumbnail_qoi(data);
116 }
117}
std::unique_ptr< CompressedImageBuffer > compress_thumbnail_qoi(const ThumbnailData &data)
Definition Thumbnails.cpp:85
std::unique_ptr< CompressedImageBuffer > compress_thumbnail_jpg(const ThumbnailData &data)
Definition Thumbnails.cpp:37
std::unique_ptr< CompressedImageBuffer > compress_thumbnail_png(const ThumbnailData &data)
Definition Thumbnails.cpp:30

References compress_thumbnail_jpg(), compress_thumbnail_png(), compress_thumbnail_qoi(), Slic3r::format(), Slic3r::JPG, Slic3r::PNG, and Slic3r::QOI.

Referenced by export_thumbnails_to_file().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ compress_thumbnail_jpg()

std::unique_ptr< CompressedImageBuffer > Slic3r::GCodeThumbnails::compress_thumbnail_jpg ( const ThumbnailData data)
38{
39 // Take vector of RGBA pixels and flip the image vertically
40 std::vector<unsigned char> rgba_pixels(data.pixels.size());
41 const unsigned int row_size = data.width * 4;
42 for (unsigned int y = 0; y < data.height; ++y) {
43 ::memcpy(rgba_pixels.data() + (data.height - y - 1) * row_size, data.pixels.data() + y * row_size, row_size);
44 }
45
46 // Store pointers to scanlines start for later use
47 std::vector<unsigned char*> rows_ptrs;
48 rows_ptrs.reserve(data.height);
49 for (unsigned int y = 0; y < data.height; ++y) {
50 rows_ptrs.emplace_back(&rgba_pixels[y * row_size]);
51 }
52
53 std::vector<unsigned char> compressed_data(data.pixels.size());
54 unsigned char* compressed_data_ptr = compressed_data.data();
55 unsigned long compressed_data_size = data.pixels.size();
56
57 jpeg_error_mgr err;
58 jpeg_compress_struct info;
59 info.err = jpeg_std_error(&err);
60 jpeg_create_compress(&info);
61 jpeg_mem_dest(&info, &compressed_data_ptr, &compressed_data_size);
62
63 info.image_width = data.width;
64 info.image_height = data.height;
65 info.input_components = 4;
66 info.in_color_space = JCS_EXT_RGBA;
67
68 jpeg_set_defaults(&info);
69 jpeg_set_quality(&info, 85, TRUE);
70 jpeg_start_compress(&info, TRUE);
71
72 jpeg_write_scanlines(&info, rows_ptrs.data(), data.height);
73 jpeg_finish_compress(&info);
74 jpeg_destroy_compress(&info);
75
76 // FIXME -> Add error checking
77
78 auto out = std::make_unique<CompressedJPG>();
79 out->data = malloc(compressed_data_size);
80 out->size = size_t(compressed_data_size);
81 ::memcpy(out->data, (const void*)compressed_data.data(), out->size);
82 return out;
83}
void * malloc(YYSIZE_T)
#define TRUE
Definition mesh.c:42

References malloc(), and TRUE.

Referenced by compress_thumbnail().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ compress_thumbnail_png()

std::unique_ptr< CompressedImageBuffer > Slic3r::GCodeThumbnails::compress_thumbnail_png ( const ThumbnailData data)
31{
32 auto out = std::make_unique<CompressedPNG>();
33 out->data = tdefl_write_image_to_png_file_in_memory_ex((const void*)data.pixels.data(), data.width, data.height, 4, &out->size, MZ_DEFAULT_LEVEL, 1);
34 return out;
35}
void * tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip)
Definition miniz.c:2102
@ MZ_DEFAULT_LEVEL
Definition miniz.h:237

References MZ_DEFAULT_LEVEL, and tdefl_write_image_to_png_file_in_memory_ex().

Referenced by compress_thumbnail().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ compress_thumbnail_qoi()

std::unique_ptr< CompressedImageBuffer > Slic3r::GCodeThumbnails::compress_thumbnail_qoi ( const ThumbnailData data)
86{
87 qoi_desc desc;
88 desc.width = data.width;
89 desc.height = data.height;
90 desc.channels = 4;
91 desc.colorspace = QOI_SRGB;
92
93 // Take vector of RGBA pixels and flip the image vertically
94 std::vector<uint8_t> rgba_pixels(data.pixels.size() * 4);
95 size_t row_size = data.width * 4;
96 for (size_t y = 0; y < data.height; ++ y)
97 memcpy(rgba_pixels.data() + (data.height - y - 1) * row_size, data.pixels.data() + y * row_size, row_size);
98
99 auto out = std::make_unique<CompressedQOI>();
100 int size;
101 out->data = qoi_encode((const void*)rgba_pixels.data(), &desc, &size);
102 out->size = size;
103 return out;
104}
unsigned int width
Definition qoi.h:257
#define QOI_SRGB
Definition qoi.h:253
unsigned int height
Definition qoi.h:258
unsigned char colorspace
Definition qoi.h:260
void * qoi_encode(const void *data, const qoi_desc *desc, int *out_len)
unsigned char channels
Definition qoi.h:259
Definition qoi.h:256

References qoi_desc::channels, qoi_desc::colorspace, qoi_desc::height, qoi_encode(), QOI_SRGB, and qoi_desc::width.

Referenced by compress_thumbnail().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ export_thumbnails_to_file()

template<typename WriteToOutput , typename ThrowIfCanceledCallback >
void Slic3r::GCodeThumbnails::export_thumbnails_to_file ( ThumbnailsGeneratorCallback thumbnail_cb,
const std::vector< Vec2d > &  sizes,
GCodeThumbnailsFormat  format,
WriteToOutput  output,
ThrowIfCanceledCallback  throw_if_canceled 
)
inline
28{
29 // Write thumbnails using base64 encoding
30 if (thumbnail_cb != nullptr) {
31 static constexpr const size_t max_row_length = 78;
32 ThumbnailsList thumbnails = thumbnail_cb(ThumbnailsParams{ sizes, true, true, true, true });
33 for (const ThumbnailData& data : thumbnails)
34 if (data.is_valid()) {
35 auto compressed = compress_thumbnail(data, format);
36 if (compressed->data && compressed->size) {
37 std::string encoded;
38 encoded.resize(boost::beast::detail::base64::encoded_size(compressed->size));
39 encoded.resize(boost::beast::detail::base64::encode((void*)encoded.data(), (const void*)compressed->data, compressed->size));
40
41 output((boost::format("\n;\n; %s begin %dx%d %d\n") % compressed->tag() % data.width % data.height % encoded.size()).str().c_str());
42
43 while (encoded.size() > max_row_length) {
44 output((boost::format("; %s\n") % encoded.substr(0, max_row_length)).str().c_str());
45 encoded = encoded.substr(max_row_length);
46 }
47
48 if (encoded.size() > 0)
49 output((boost::format("; %s\n") % encoded).str().c_str());
50
51 output((boost::format("; %s end\n;\n") % compressed->tag()).str().c_str());
52 }
53 throw_if_canceled();
54 }
55 }
56}
if(!(yy_init))
Definition lexer.c:1190
std::vector< ThumbnailData > ThumbnailsList
Definition ThumbnailData.hpp:22
Definition ThumbnailData.hpp:25
Definition ThumbnailData.hpp:10

References compress_thumbnail(), and Slic3r::format().

Referenced by Slic3r::GCode::_do_export().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: