diff options
| author | Juan Linietsky | 2015-05-04 13:24:02 -0300 |
|---|---|---|
| committer | Juan Linietsky | 2015-05-04 13:24:02 -0300 |
| commit | fbbe7dcdfbd09fc6ef5614dea2183481a27e4f4e (patch) | |
| tree | 4e783f0e4347a2f612e6b85398c83a492d7b090f /drivers/pvr/texture_loader_pvr.cpp | |
| parent | 7f5b744b92256e42aa3c700ee88d8318732935c6 (diff) | |
| parent | 6f8bd899311d459b9e391b4acf72ccfa5cc1d806 (diff) | |
| download | godot-fbbe7dcdfbd09fc6ef5614dea2183481a27e4f4e.tar.gz godot-fbbe7dcdfbd09fc6ef5614dea2183481a27e4f4e.tar.zst godot-fbbe7dcdfbd09fc6ef5614dea2183481a27e4f4e.zip | |
Merge remote-tracking branch 'origin/master'
Conflicts:
drivers/windows/dir_access_windows.cpp
Diffstat (limited to 'drivers/pvr/texture_loader_pvr.cpp')
| -rw-r--r-- | drivers/pvr/texture_loader_pvr.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/pvr/texture_loader_pvr.cpp b/drivers/pvr/texture_loader_pvr.cpp index b12e0c28b..5268b953f 100644 --- a/drivers/pvr/texture_loader_pvr.cpp +++ b/drivers/pvr/texture_loader_pvr.cpp @@ -1,6 +1,8 @@ #include "texture_loader_pvr.h" #include "os/file_access.h" #include <string.h> +#include "PvrTcEncoder.h" +#include "RgbaBitmap.h" static void _pvrtc_decompress(Image* p_img); @@ -154,10 +156,59 @@ String ResourceFormatPVR::get_resource_type(const String &p_path) const { } + +static void _compress_pvrtc4(Image * p_img) { + + Image img = *p_img; + + bool make_mipmaps=false; + if (img.get_width()%8 || img.get_height()%8) { + make_mipmaps=img.get_mipmaps()>0; + img.resize(img.get_width()+(8-(img.get_width()%8)),img.get_height()+(8-(img.get_height()%8))); + } + img.convert(Image::FORMAT_RGBA); + if (img.get_mipmaps()==0 && make_mipmaps) + img.generate_mipmaps(); + + bool use_alpha=img.detect_alpha(); + + Image new_img; + new_img.create(img.get_width(),img.get_height(),true,use_alpha?Image::FORMAT_PVRTC4_ALPHA:Image::FORMAT_PVRTC4); + DVector<uint8_t> data=new_img.get_data(); + { + DVector<uint8_t>::Write wr=data.write(); + DVector<uint8_t>::Read r=img.get_data().read(); + + + for(int i=0;i<=new_img.get_mipmaps();i++) { + + int ofs,size,w,h; + img.get_mipmap_offset_size_and_dimensions(i,ofs,size,w,h); + Javelin::RgbaBitmap bm(w,h); + copymem(bm.GetData(),&r[ofs],size); + { + Javelin::ColorRgba<unsigned char> *dp = bm.GetData(); + for(int j=0;j<size/4;j++) { + SWAP(dp[j].r,dp[j].b); + } + } + + new_img.get_mipmap_offset_size_and_dimensions(i,ofs,size,w,h); + Javelin::PvrTcEncoder::EncodeRgba4Bpp(&wr[ofs],bm); + } + + } + + *p_img = Image(new_img.get_width(),new_img.get_height(),new_img.get_mipmaps(),new_img.get_format(),data); + +} + ResourceFormatPVR::ResourceFormatPVR() { Image::_image_decompress_pvrtc=_pvrtc_decompress; + Image::_image_compress_pvrtc4_func=_compress_pvrtc4; + Image::_image_compress_pvrtc2_func=_compress_pvrtc4; } |
