ability to shrink all images x2 on load
this is for extreme cases when running on devices with very low video memory, so you can still retain compatibility.
This commit is contained in:
parent
0fa5154c0a
commit
89d87294db
11 changed files with 103 additions and 2 deletions
|
|
@ -901,6 +901,66 @@ static void _generate_po2_mipmap(const uint8_t* p_src, uint8_t* p_dst, uint32_t
|
|||
}
|
||||
|
||||
|
||||
void Image::shrink_x2() {
|
||||
|
||||
ERR_FAIL_COND(format==FORMAT_INDEXED || format==FORMAT_INDEXED_ALPHA);
|
||||
ERR_FAIL_COND( data.size()==0 );
|
||||
|
||||
|
||||
|
||||
if (mipmaps) {
|
||||
|
||||
//just use the lower mipmap as base and copy all
|
||||
DVector<uint8_t> new_img;
|
||||
|
||||
int ofs = get_mipmap_offset(1);
|
||||
|
||||
int new_size = data.size()-ofs;
|
||||
new_img.resize(new_size);
|
||||
|
||||
|
||||
{
|
||||
DVector<uint8_t>::Write w=new_img.write();
|
||||
DVector<uint8_t>::Read r=data.read();
|
||||
|
||||
copymem(w.ptr(),&r[ofs],new_size);
|
||||
}
|
||||
|
||||
mipmaps--;
|
||||
width/=2;
|
||||
height/=2;
|
||||
data=new_img;
|
||||
|
||||
} else {
|
||||
|
||||
DVector<uint8_t> new_img;
|
||||
|
||||
ERR_FAIL_COND( format>=FORMAT_INDEXED );
|
||||
int ps = get_format_pixel_size(format);
|
||||
new_img.resize((width/2)*(height/2)*ps);
|
||||
|
||||
{
|
||||
DVector<uint8_t>::Write w=new_img.write();
|
||||
DVector<uint8_t>::Read r=data.read();
|
||||
|
||||
switch(format) {
|
||||
|
||||
case FORMAT_GRAYSCALE:
|
||||
case FORMAT_INTENSITY: _generate_po2_mipmap<1>(r.ptr(), w.ptr(), width,height); break;
|
||||
case FORMAT_GRAYSCALE_ALPHA: _generate_po2_mipmap<2>(r.ptr(), w.ptr(), width,height); break;
|
||||
case FORMAT_RGB: _generate_po2_mipmap<3>(r.ptr(), w.ptr(), width,height); break;
|
||||
case FORMAT_RGBA: _generate_po2_mipmap<4>(r.ptr(), w.ptr(), width,height); break;
|
||||
default: {}
|
||||
}
|
||||
}
|
||||
|
||||
width/=2;
|
||||
height/=2;
|
||||
data=new_img;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Error Image::generate_mipmaps(int p_mipmaps,bool p_keep_existing) {
|
||||
|
||||
if (!_can_modify(format)) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue