27 if(
data.empty() || iy >= nfity){
31 data.push_back(std::make_unique<std::array<png_byte, kTotBytes>>());
48 for(
int newdim = kArenaSize/2; newdim >= 1; newdim /= 2){
49 const int olddim = newdim*2;
56 for(
int y = 0;
y < newdim; ++
y){
57 for(
int x = 0;
x < newdim; ++
x){
60 for(
int dy = 0; dy <= 1; ++dy){
61 for(
int dx = 0; dx <= 1; ++dx){
62 const int i = (
y*2+dy)*olddim + (
x*2+dx);
67 for(
int c = 0;
c < 3; ++
c){
74 const int i =
y*newdim+
x;
75 for(
int c = 0; c < 3; ++c) dest[i*4+c] = tota > 0 ?
std::min(totc[
c]/tota, 255) : 0;
81 dest += 4*newdim*newdim;
90 long unsigned int nbytes)
92 FILE*
fout = (FILE*)png_get_io_ptr(png_ptr);
93 const size_t ret = fwrite(buffer, 1, nbytes, fout);
96 std::cout <<
"Error writing " << nbytes <<
" bytes of png -- returned " << ret <<
std::endl;
110 if(imgIdx >=
int(
data.size())){
111 std::cout <<
"Bad index " << imgIdx <<
std::endl;
116 std::lock_guard<std::mutex> guard(*
fMIPLocks[imgIdx]);
126 if(src + 4*dim*dim - 1 > &(*
data[imgIdx]).back()){
127 std::cout <<
"Bad mipmap size " << dim <<
std::endl;
131 png_struct_def* png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
133 auto info_ptr = png_create_info_struct(png_ptr);
138 png_set_compression_level(png_ptr, 1);
139 png_set_compression_strategy(png_ptr, Z_RLE);
141 png_set_IHDR(png_ptr, info_ptr, dim, dim,
142 8, PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE,
143 PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
145 std::vector<png_byte*> pdatas(dim);
146 for(
int i = 0; i < dim; ++i) pdatas[i] = src + i*dim*4;
148 png_set_rows(png_ptr, info_ptr, pdatas.data());
158 png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
160 png_destroy_write_struct(&png_ptr, &info_ptr);
173 for(
unsigned int d = 0;
d < bytes.
data.size(); ++
d){
177 for(
int y = 0;
y < blockSize && !filled; ++
y){
178 for(
int x = 0;
x < blockSize; ++
x){
179 if(
bytes(
d, ix*blockSize+
x, iy*blockSize+
y, 3) > 0){
185 if(filled) ++nfilled;
void webevd_png_write_fn(png_struct_def *png_ptr, png_byte *buffer, long unsigned int nbytes)
void webevd_png_flush_fn(png_struct_def *png_ptr)
std::vector< std::unique_ptr< std::array< png_byte, kTotBytes > > > data
static constexpr int MipMapOffset(int dim, int maxdim)
void AnalyzeArena(const PNGArena &bytes)
std::vector< bool > fHasMIP
PNGArena(const std::string &name)
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
void WritePNGBytes(FILE *fout, int imgIdx, int dim)
byte bytes
Alias for common language habits.
std::vector< std::mutex * > fMIPLocks
QTextStream & endl(QTextStream &s)