void TextWindow::ScreenBackgroundImage(int link, uint32_t v) { if(SS.bgImage.fromFile) MemFree(SS.bgImage.fromFile); SS.bgImage.fromFile = NULL; if(link == 'l') { FILE *f = NULL; png_struct *png_ptr = NULL; png_info *info_ptr = NULL; char importFile[MAX_PATH] = ""; if(!GetOpenFile(importFile, PNG_EXT, PNG_PATTERN)) goto err; f = fopen(importFile, "rb"); if(!f) goto err; uint8_t header[8]; if (fread(header, 1, 8, f) != 8) goto err; if(png_sig_cmp(header, 0, 8)) goto err; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) goto err; info_ptr = png_create_info_struct(png_ptr); if(!info_ptr) goto err; if(setjmp(png_jmpbuf(png_ptr))) goto err; png_init_io(png_ptr, f); png_set_sig_bytes(png_ptr, 8); png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_ALPHA, NULL); int w; w = (int)png_get_image_width(png_ptr, info_ptr); int h; h = (int)png_get_image_height(png_ptr, info_ptr); uint8_t **rows; rows = png_get_rows(png_ptr, info_ptr); // Round to next-highest powers of two, since the textures require // that. And round up to 4, to guarantee 32-bit alignment. int rw; rw = max(4, RoundUpToPowerOfTwo(w)); int rh; rh = max(4, RoundUpToPowerOfTwo(h)); SS.bgImage.fromFile = (uint8_t *)MemAlloc(rw*rh*3); {for(int i = 0; i < h; i++) { memcpy(SS.bgImage.fromFile + ((h - 1) - i)*(rw*3), rows[i], w*3); }} SS.bgImage.w = w; SS.bgImage.h = h; SS.bgImage.rw = rw; SS.bgImage.rh = rh; SS.bgImage.scale = SS.GW.scale; SS.bgImage.origin = SS.GW.offset.ScaledBy(-1); err: if(png_ptr) png_destroy_read_struct(&png_ptr, &info_ptr, NULL); if(f) fclose(f); } SS.later.showTW = true; }
explicit RingBuffer(size_t max_size, const Allocator& alloc = allocator_type()) : max_size_(max_size), alloc_(alloc), capacity_(RoundUpToPowerOfTwo(max_size + 1)), mask_(capacity_ - 1), data_(alloc_.allocate(capacity_)) { }