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

Classes

struct  Image
 
struct  IStream
 
struct  PNGDescr
 
struct  ReadBuf
 

Typedefs

using ImageGreyscale = Image< uint8_t >
 

Functions

bool is_png (const ReadBuf &rb)
 
static void png_read_callback (png_struct *png_ptr, png_bytep outBytes, png_size_t byteCountToRead)
 
bool decode_png (IStream &in_buf, ImageGreyscale &out_img)
 
static bool write_rgb_or_gray_to_file (const char *file_name_utf8, size_t width, size_t height, int png_color_type, const uint8_t *data)
 
bool write_rgb_to_file (const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb)
 
bool write_rgb_to_file (const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb)
 
bool write_rgb_to_file (const std::string &file_name_utf8, size_t width, size_t height, const std::vector< uint8_t > &data_rgb)
 
bool write_gray_to_file (const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_gray)
 
bool write_gray_to_file (const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_gray)
 
bool write_gray_to_file (const std::string &file_name_utf8, size_t width, size_t height, const std::vector< uint8_t > &data_gray)
 
static bool write_rgb_or_gray_to_file_scaled (const char *file_name_utf8, size_t width, size_t height, int png_color_type, const uint8_t *data, size_t scale)
 
bool write_rgb_to_file_scaled (const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb, size_t scale)
 
bool write_rgb_to_file_scaled (const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb, size_t scale)
 
bool write_rgb_to_file_scaled (const std::string &file_name_utf8, size_t width, size_t height, const std::vector< uint8_t > &data_rgb, size_t scale)
 
bool write_gray_to_file_scaled (const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_gray, size_t scale)
 
bool write_gray_to_file_scaled (const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_gray, size_t scale)
 
bool write_gray_to_file_scaled (const std::string &file_name_utf8, size_t width, size_t height, const std::vector< uint8_t > &data_gray, size_t scale)
 
template<class Img >
bool decode_png (const ReadBuf &in_buf, Img &out_img)
 

Class Documentation

◆ Slic3r::png::ReadBuf

struct Slic3r::png::ReadBuf
Class Members
const void * buf = nullptr
const size_t sz = 0

Typedef Documentation

◆ ImageGreyscale

Function Documentation

◆ decode_png() [1/2]

template<class Img >
bool Slic3r::png::decode_png ( const ReadBuf in_buf,
Img &  out_img 
)
44{
45 struct ReadBufStream: public IStream {
46 const ReadBuf &rbuf_ref; size_t pos = 0;
47
48 explicit ReadBufStream(const ReadBuf &buf): rbuf_ref{buf} {}
49
50 size_t read(std::uint8_t *outp, size_t amount) override
51 {
52 if (amount > rbuf_ref.sz - pos) return 0;
53
54 auto buf = static_cast<const std::uint8_t *>(rbuf_ref.buf);
55 std::copy(buf + pos, buf + (pos + amount), outp);
56 pos += amount;
57
58 return amount;
59 }
60
61 bool is_ok() const override { return pos < rbuf_ref.sz; }
62 } stream{in_buf};
63
64 return decode_png(stream, out_img);
65}
const void * buf
Definition PNGReadWrite.hpp:39
const size_t sz
Definition PNGReadWrite.hpp:39
bool decode_png(IStream &in_buf, ImageGreyscale &out_img)
Definition PNGReadWrite.cpp:61
Definition PNGReadWrite.hpp:39
Definition PNGReadWrite.hpp:12
virtual size_t read(std::uint8_t *outp, size_t amount)=0
virtual bool is_ok() const =0

References Slic3r::png::ReadBuf::buf, decode_png(), and Slic3r::png::ReadBuf::sz.

+ Here is the call graph for this function:

◆ decode_png() [2/2]

bool Slic3r::png::decode_png ( IStream in_buf,
ImageGreyscale out_img 
)
62{
63 static const constexpr int PNG_SIG_BYTES = 8;
64
65 std::vector<png_byte> sig(PNG_SIG_BYTES, 0);
66 in_buf.read(sig.data(), PNG_SIG_BYTES);
67 if (!png_check_sig(sig.data(), PNG_SIG_BYTES))
68 return false;
69
70 PNGDescr dsc;
71 dsc.png = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr,
72 nullptr);
73
74 if(!dsc.png) return false;
75
76 dsc.info = png_create_info_struct(dsc.png);
77 if(!dsc.info) return false;
78
79 png_set_read_fn(dsc.png, static_cast<void *>(&in_buf), png_read_callback);
80
81 // Tell that we have already read the first bytes to check the signature
82 png_set_sig_bytes(dsc.png, PNG_SIG_BYTES);
83
84 png_read_info(dsc.png, dsc.info);
85
86 out_img.cols = png_get_image_width(dsc.png, dsc.info);
87 out_img.rows = png_get_image_height(dsc.png, dsc.info);
88 size_t color_type = png_get_color_type(dsc.png, dsc.info);
89 size_t bit_depth = png_get_bit_depth(dsc.png, dsc.info);
90
91 if (color_type != PNG_COLOR_TYPE_GRAY || bit_depth != 8)
92 return false;
93
94 out_img.buf.resize(out_img.rows * out_img.cols);
95
96 auto readbuf = static_cast<png_bytep>(out_img.buf.data());
97 for (size_t r = 0; r < out_img.rows; ++r)
98 png_read_row(dsc.png, readbuf + r * out_img.cols, nullptr);
99
100 return true;
101}
size_t rows
Definition PNGReadWrite.hpp:22
std::vector< PxT > buf
Definition PNGReadWrite.hpp:21
size_t cols
Definition PNGReadWrite.hpp:22
Definition PNGReadWrite.cpp:13
png_struct * png
Definition PNGReadWrite.cpp:14
png_info * info
Definition PNGReadWrite.cpp:14

References Slic3r::png::Image< PxT >::buf, Slic3r::png::Image< PxT >::cols, Slic3r::png::PNGDescr::info, Slic3r::png::PNGDescr::png, png_read_callback(), Slic3r::png::IStream::read(), and Slic3r::png::Image< PxT >::rows.

Referenced by decode_png(), and Slic3r::anonymous_namespace{SL1.cpp}::extract_slices_from_sla_archive().

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

◆ is_png()

bool Slic3r::png::is_png ( const ReadBuf rb)
30{
31 static const constexpr int PNG_SIG_BYTES = 8;
32
33#if PNG_LIBPNG_VER_MINOR <= 2
34 // Earlier libpng versions had png_sig_cmp(png_bytep, ...) which is not
35 // a const pointer. It is not possible to cast away the const qualifier from
36 // the input buffer so... yes... life is challenging...
37 png_byte buf[PNG_SIG_BYTES];
38 auto inbuf = static_cast<const std::uint8_t *>(rb.buf);
39 std::copy(inbuf, inbuf + PNG_SIG_BYTES, buf);
40#else
41 auto buf = static_cast<png_const_bytep>(rb.buf);
42#endif
43
44 return rb.sz >= PNG_SIG_BYTES && !png_sig_cmp(buf, 0, PNG_SIG_BYTES);
45}

References Slic3r::png::ReadBuf::buf, and Slic3r::png::ReadBuf::sz.

◆ png_read_callback()

static void Slic3r::png::png_read_callback ( png_struct *  png_ptr,
png_bytep  outBytes,
png_size_t  byteCountToRead 
)
static
52{
53 // Retrieve our input buffer through the png_ptr
54 auto reader = static_cast<IStream *>(png_get_io_ptr(png_ptr));
55
56 if (!reader || !reader->is_ok()) return;
57
58 reader->read(static_cast<std::uint8_t *>(outBytes), byteCountToRead);
59}

References Slic3r::png::IStream::read().

Referenced by decode_png().

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

◆ write_gray_to_file() [1/3]

bool Slic3r::png::write_gray_to_file ( const char *  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_gray 
)
201{
202 return write_rgb_or_gray_to_file(file_name_utf8, width, height, PNG_COLOR_TYPE_GRAY, data_gray);
203}
static bool write_rgb_or_gray_to_file(const char *file_name_utf8, size_t width, size_t height, int png_color_type, const uint8_t *data)
Definition PNGReadWrite.cpp:107

References write_rgb_or_gray_to_file().

Referenced by write_gray_to_file(), and write_gray_to_file().

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

◆ write_gray_to_file() [2/3]

bool Slic3r::png::write_gray_to_file ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const std::vector< uint8_t > &  data_gray 
)
211{
212 assert(width * height == data_gray.size());
213 return write_gray_to_file(file_name_utf8.c_str(), width, height, data_gray.data());
214}
bool write_gray_to_file(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_gray)
Definition PNGReadWrite.cpp:200

References write_gray_to_file().

+ Here is the call graph for this function:

◆ write_gray_to_file() [3/3]

bool Slic3r::png::write_gray_to_file ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_gray 
)
206{
207 return write_gray_to_file(file_name_utf8.c_str(), width, height, data_gray);
208}

References write_gray_to_file().

+ Here is the call graph for this function:

◆ write_gray_to_file_scaled() [1/3]

bool Slic3r::png::write_gray_to_file_scaled ( const char *  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_gray,
size_t  scale 
)
260{
261 return write_rgb_or_gray_to_file_scaled(file_name_utf8, width, height, PNG_COLOR_TYPE_GRAY, data_gray, scale);
262}
int scale(const int val)
Definition WipeTowerDialog.cpp:14
static bool write_rgb_or_gray_to_file_scaled(const char *file_name_utf8, size_t width, size_t height, int png_color_type, const uint8_t *data, size_t scale)
Definition PNGReadWrite.cpp:219

References scale(), and write_rgb_or_gray_to_file_scaled().

Referenced by Slic3r::SupportGridPattern::SupportGridPattern(), write_gray_to_file_scaled(), and write_gray_to_file_scaled().

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

◆ write_gray_to_file_scaled() [2/3]

bool Slic3r::png::write_gray_to_file_scaled ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const std::vector< uint8_t > &  data_gray,
size_t  scale 
)
270{
271 assert(width * height == data_gray.size());
272 return write_gray_to_file_scaled(file_name_utf8.c_str(), width, height, data_gray.data(), scale);
273}
bool write_gray_to_file_scaled(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_gray, size_t scale)
Definition PNGReadWrite.cpp:259

References scale(), and write_gray_to_file_scaled().

+ Here is the call graph for this function:

◆ write_gray_to_file_scaled() [3/3]

bool Slic3r::png::write_gray_to_file_scaled ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_gray,
size_t  scale 
)
265{
266 return write_gray_to_file_scaled(file_name_utf8.c_str(), width, height, data_gray, scale);
267}

References scale(), and write_gray_to_file_scaled().

+ Here is the call graph for this function:

◆ write_rgb_or_gray_to_file()

static bool Slic3r::png::write_rgb_or_gray_to_file ( const char *  file_name_utf8,
size_t  width,
size_t  height,
int  png_color_type,
const uint8_t data 
)
static
108{
109 bool result = false;
110
111 // Forward declaration due to the gotos.
112 png_structp png_ptr = nullptr;
113 png_infop info_ptr = nullptr;
114 png_byte **row_pointers = nullptr;
115
116 FILE *fp = boost::nowide::fopen(file_name_utf8, "wb");
117 if (! fp) {
118 BOOST_LOG_TRIVIAL(error) << "write_png_file: File could not be opened for writing: " << file_name_utf8;
119 goto fopen_failed;
120 }
121
122 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
123 if (! png_ptr) {
124 BOOST_LOG_TRIVIAL(error) << "write_png_file: png_create_write_struct() failed";
125 goto png_create_write_struct_failed;
126 }
127
128 info_ptr = png_create_info_struct(png_ptr);
129 if (! info_ptr) {
130 BOOST_LOG_TRIVIAL(error) << "write_png_file: png_create_info_struct() failed";
131 goto png_create_info_struct_failed;
132 }
133
134 // Set up error handling.
135 if (setjmp(png_jmpbuf(png_ptr))) {
136 BOOST_LOG_TRIVIAL(error) << "write_png_file: setjmp() failed";
137 goto png_failure;
138 }
139
140 // Set image attributes.
141 png_set_IHDR(png_ptr,
142 info_ptr,
143 png_uint_32(width),
144 png_uint_32(height),
145 8, // depth
146 png_color_type,
147 PNG_INTERLACE_NONE,
148 PNG_COMPRESSION_TYPE_DEFAULT,
149 PNG_FILTER_TYPE_DEFAULT);
150
151 // Initialize rows of PNG.
152 row_pointers = reinterpret_cast<png_byte**>(::png_malloc(png_ptr, height * sizeof(png_byte*)));
153 {
154 int line_width = width;
155 if (png_color_type == PNG_COLOR_TYPE_RGB)
156 line_width *= 3;
157 for (size_t y = 0; y < height; ++ y) {
158 auto row = reinterpret_cast<png_byte*>(::png_malloc(png_ptr, line_width));
159 row_pointers[y] = row;
160 memcpy(row, data + line_width * y, line_width);
161 }
162 }
163
164 // Write the image data to "fp".
165 png_init_io(png_ptr, fp);
166 png_set_rows(png_ptr, info_ptr, row_pointers);
167 png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, nullptr);
168
169 for (size_t y = 0; y < height; ++ y)
170 png_free(png_ptr, row_pointers[y]);
171 png_free(png_ptr, row_pointers);
172
173 result = true;
174
175png_failure:
176png_create_info_struct_failed:
177 ::png_destroy_write_struct(&png_ptr, &info_ptr);
178png_create_write_struct_failed:
179 ::fclose(fp);
180fopen_failed:
181 return result;
182}
EIGEN_DEVICE_FUNC RowXpr row(Index i)
This is the const version of row(). *‍/.
Definition BlockMethods.h:859
const Scalar & y
Definition MathFunctions.h:552
coord_t width(const BoundingBox &box)
Definition Arrange.cpp:539
coord_t height(const BoundingBox &box)
Definition Arrange.cpp:540
static char error[256]
Definition tga.cpp:50

References error, and row().

Referenced by write_gray_to_file(), write_rgb_or_gray_to_file_scaled(), and write_rgb_to_file().

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

◆ write_rgb_or_gray_to_file_scaled()

static bool Slic3r::png::write_rgb_or_gray_to_file_scaled ( const char *  file_name_utf8,
size_t  width,
size_t  height,
int  png_color_type,
const uint8_t data,
size_t  scale 
)
static
220{
221 if (scale <= 1)
222 return write_rgb_or_gray_to_file(file_name_utf8, width, height, png_color_type, data);
223 else {
224 size_t pixel_bytes = png_color_type == PNG_COLOR_TYPE_RGB ? 3 : 1;
225 size_t line_width = width * pixel_bytes;
226 std::vector<uint8_t> scaled(line_width * height * scale * scale);
227 uint8_t *dst = scaled.data();
228 for (size_t r = 0; r < height; ++ r) {
229 for (size_t repr = 0; repr < scale; ++ repr) {
230 const uint8_t *row = data + line_width * r;
231 for (size_t c = 0; c < width; ++ c) {
232 for (size_t repc = 0; repc < scale; ++ repc)
233 for (size_t b = 0; b < pixel_bytes; ++ b)
234 *dst ++ = row[b];
235 row += pixel_bytes;
236 }
237 }
238 }
239 return write_rgb_or_gray_to_file(file_name_utf8, width * scale, height * scale, png_color_type, scaled.data());
240 }
241}
BoundingBox scaled(const BoundingBoxf &bb)
Definition BoundingBox.hpp:240
unsigned __int8 uint8_t
Definition unistd.h:77

References row(), scale(), Slic3r::scaled(), and write_rgb_or_gray_to_file().

Referenced by write_gray_to_file_scaled(), and write_rgb_to_file_scaled().

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

◆ write_rgb_to_file() [1/3]

bool Slic3r::png::write_rgb_to_file ( const char *  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_rgb 
)
185{
186 return write_rgb_or_gray_to_file(file_name_utf8, width, height, PNG_COLOR_TYPE_RGB, data_rgb);
187}

References write_rgb_or_gray_to_file().

Referenced by write_rgb_to_file(), and write_rgb_to_file().

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

◆ write_rgb_to_file() [2/3]

bool Slic3r::png::write_rgb_to_file ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const std::vector< uint8_t > &  data_rgb 
)
195{
196 assert(width * height * 3 == data_rgb.size());
197 return write_rgb_to_file(file_name_utf8.c_str(), width, height, data_rgb.data());
198}
bool write_rgb_to_file(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb)
Definition PNGReadWrite.cpp:184

References write_rgb_to_file().

+ Here is the call graph for this function:

◆ write_rgb_to_file() [3/3]

bool Slic3r::png::write_rgb_to_file ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_rgb 
)
190{
191 return write_rgb_to_file(file_name_utf8.c_str(), width, height, data_rgb);
192}

References write_rgb_to_file().

+ Here is the call graph for this function:

◆ write_rgb_to_file_scaled() [1/3]

bool Slic3r::png::write_rgb_to_file_scaled ( const char *  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_rgb,
size_t  scale 
)
244{
245 return write_rgb_or_gray_to_file_scaled(file_name_utf8, width, height, PNG_COLOR_TYPE_RGB, data_rgb, scale);
246}

References scale(), and write_rgb_or_gray_to_file_scaled().

Referenced by Slic3r::EdgeGrid::Grid::calculate_sdf(), Slic3r::EdgeGrid::save_png(), write_rgb_to_file_scaled(), and write_rgb_to_file_scaled().

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

◆ write_rgb_to_file_scaled() [2/3]

bool Slic3r::png::write_rgb_to_file_scaled ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const std::vector< uint8_t > &  data_rgb,
size_t  scale 
)
254{
255 assert(width * height * 3 == data_rgb.size());
256 return write_rgb_to_file_scaled(file_name_utf8.c_str(), width, height, data_rgb.data(), scale);
257}
bool write_rgb_to_file_scaled(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb, size_t scale)
Definition PNGReadWrite.cpp:243

References scale(), and write_rgb_to_file_scaled().

+ Here is the call graph for this function:

◆ write_rgb_to_file_scaled() [3/3]

bool Slic3r::png::write_rgb_to_file_scaled ( const std::string &  file_name_utf8,
size_t  width,
size_t  height,
const uint8_t data_rgb,
size_t  scale 
)
249{
250 return write_rgb_to_file_scaled(file_name_utf8.c_str(), width, height, data_rgb, scale);
251}

References scale(), and write_rgb_to_file_scaled().

+ Here is the call graph for this function: