X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Frendering-basic-pbr%2Fktx-loader.cpp;h=5b34fda14406408eda4c85967da9fa27ac2d7b6a;hb=1b19fd140ff139b5854a1a62447faf31b175d8f6;hp=175d6c3a4c6320aa04ddfa1dea775bf7b7f922d7;hpb=8e7b79aa32faa45e8a231c7b3e413d7ad1783acf;p=platform%2Fcore%2Fuifw%2Fdali-demo.git diff --git a/examples/rendering-basic-pbr/ktx-loader.cpp b/examples/rendering-basic-pbr/ktx-loader.cpp index 175d6c3..5b34fda 100644 --- a/examples/rendering-basic-pbr/ktx-loader.cpp +++ b/examples/rendering-basic-pbr/ktx-loader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,29 +19,30 @@ #include "ktx-loader.h" // EXTERNAL INCLUDES +#include +#include #include -#include #include +#include namespace PbrDemo { - struct KtxFileHeader { - char identifier[12]; - uint32_t endianness; - uint32_t glType; //(UNSIGNED_BYTE, UNSIGNED_SHORT_5_6_5, etc.) - uint32_t glTypeSize; - uint32_t glFormat; //(RGB, RGBA, BGRA, etc.) - uint32_t glInternalFormat; //For uncompressed textures, specifies the internalformat parameter passed to glTexStorage*D or glTexImage*D - uint32_t glBaseInternalFormat; - uint32_t pixelWidth; - uint32_t pixelHeight; - uint32_t pixelDepth; - uint32_t numberOfArrayElements; - uint32_t numberOfFaces; //Cube map faces are stored in the order: +X, -X, +Y, -Y, +Z, -Z. - uint32_t numberOfMipmapLevels; - uint32_t bytesOfKeyValueData; + char identifier[12]; + uint32_t endianness; + uint32_t glType; //(UNSIGNED_BYTE, UNSIGNED_SHORT_5_6_5, etc.) + uint32_t glTypeSize; + uint32_t glFormat; //(RGB, RGBA, BGRA, etc.) + uint32_t glInternalFormat; //For uncompressed textures, specifies the internalformat parameter passed to glTexStorage*D or glTexImage*D + uint32_t glBaseInternalFormat; + uint32_t pixelWidth; + uint32_t pixelHeight; + uint32_t pixelDepth; + uint32_t numberOfArrayElements; + uint32_t numberOfFaces; //Cube map faces are stored in the order: +X, -X, +Y, -Y, +Z, -Z. + uint32_t numberOfMipmapLevels; + uint32_t bytesOfKeyValueData; }; /** @@ -49,14 +50,14 @@ struct KtxFileHeader */ bool ConvertPixelFormat(const uint32_t ktxPixelFormat, Dali::Pixel::Format& format) { - switch( ktxPixelFormat ) + switch(ktxPixelFormat) { case 0x93B0: // GL_COMPRESSED_RGBA_ASTC_4x4_KHR { format = Dali::Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR; break; } - case 0x881B:// GL_RGB16F + case 0x881B: // GL_RGB16F { format = Dali::Pixel::RGB16F; break; @@ -90,88 +91,55 @@ bool ConvertPixelFormat(const uint32_t ktxPixelFormat, Dali::Pixel::Format& form return true; } -bool LoadCubeMapFromKtxFile( const std::string& path, CubeData& cubedata ) +bool LoadCubeMapFromKtxFile(const std::string& path, CubeData& cubedata) { - FILE* fp = fopen(path.c_str(),"rb"); - - if( NULL == fp ) + std::unique_ptr fp(fopen(path.c_str(), "rb"), [](FILE* fp) { + if(fp) + { + fclose(fp); + } + }); + if(!fp) { return false; } KtxFileHeader header; - - int result = fread(&header,1,sizeof(KtxFileHeader),fp); - if( 0 == result ) + int result = fread(&header, sizeof(KtxFileHeader), 1u, fp.get()); + if(0 == result) { - fclose( fp ); return false; } - long lSize = 0; - // Skip the key-values: - const long int imageSizeOffset = sizeof(KtxFileHeader) + header.bytesOfKeyValueData; - - if( fseek(fp, imageSizeOffset, SEEK_END) ) + if(fseek(fp.get(), header.bytesOfKeyValueData, SEEK_CUR)) { - fclose( fp ); - return false; - } - - lSize = ftell(fp); - if( lSize == -1L ) - { - fclose( fp ); - return false; - } - - rewind(fp); - - if( fseek(fp, imageSizeOffset, SEEK_SET) ) - { - fclose( fp ); return false; } cubedata.img.resize(header.numberOfFaces); - for(unsigned int face=0; face < header.numberOfFaces; ++face) //array_element must be 0 or 1 + for(unsigned int face = 0; face < header.numberOfFaces; ++face) //array_element must be 0 or 1 { cubedata.img[face].resize(header.numberOfMipmapLevels); } - unsigned char* buffer= reinterpret_cast( malloc( lSize ) ); - - unsigned char* img[6]; - unsigned int imgSize[6]; - unsigned char* imgPointer = buffer; - result = fread(buffer,1,lSize,fp); - - fclose(fp); - - if( 0 == result ) - { - free( buffer ); - return false; - } - - if( 0 == header.numberOfMipmapLevels ) + if(0 == header.numberOfMipmapLevels) { header.numberOfMipmapLevels = 1u; } - if( 0 == header.numberOfArrayElements ) + if(0 == header.numberOfArrayElements) { header.numberOfArrayElements = 1u; } - if( 0 == header.pixelDepth ) + if(0 == header.pixelDepth) { header.pixelDepth = 1u; } - if( 0 == header.pixelHeight ) + if(0 == header.pixelHeight) { header.pixelHeight = 1u; } @@ -180,33 +148,36 @@ bool LoadCubeMapFromKtxFile( const std::string& path, CubeData& cubedata ) ConvertPixelFormat(header.glInternalFormat, daliformat); - for( unsigned int mipmapLevel = 0; mipmapLevel < header.numberOfMipmapLevels; ++mipmapLevel ) + for(unsigned int mipmapLevel = 0; mipmapLevel < header.numberOfMipmapLevels; ++mipmapLevel) { - long int byteSize = 0; - int imageSize; - memcpy(&imageSize,imgPointer,sizeof(unsigned int)); - imgPointer += 4u; - for(unsigned int arrayElement=0; arrayElement < header.numberOfArrayElements; ++arrayElement) //arrayElement must be 0 or 1 + uint32_t byteSize = 0; + if(fread(&byteSize, sizeof(byteSize), 1u, fp.get()) != 1) { - for(unsigned int face=0; face < header.numberOfFaces; ++face) + return false; + } + + if(0 != byteSize % 4u) + { + byteSize += 4u - byteSize % 4u; + } + + for(unsigned int arrayElement = 0; arrayElement < header.numberOfArrayElements; ++arrayElement) // arrayElement must be 0 or 1 + { + for(unsigned int face = 0; face < header.numberOfFaces; ++face) { - byteSize = imageSize; - if(byteSize % 4u) + std::unique_ptr img(static_cast(malloc(byteSize)), free); // resources will be freed when the PixelData is destroyed. + if(fread(img.get(), byteSize, 1u, fp.get()) != 1) { - byteSize += 4u - byteSize % 4u; + return false; } - img[face] = reinterpret_cast( malloc( byteSize ) ); // resources will be freed when the PixelData is destroyed. - memcpy(img[face],imgPointer,byteSize); - imgSize[face] = byteSize; - imgPointer += byteSize; - cubedata.img[face][mipmapLevel] = PixelData::New( img[face], imgSize[face], header.pixelWidth , header.pixelHeight , daliformat, PixelData::FREE ); + cubedata.img[face][mipmapLevel] = PixelData::New(img.release(), byteSize, header.pixelWidth, header.pixelHeight, daliformat, PixelData::FREE); } } - header.pixelHeight/=2u; - header.pixelWidth/=2u; + + header.pixelHeight /= 2u; + header.pixelWidth /= 2u; } - free(buffer); return true; }