Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: Implements Basis Universal / KTX2 driver. 5 : * Author: Even Rouault, <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2022, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "gdal_frmts.h" 14 : #include "gdalplugindriverproxy.h" 15 : 16 : #include "basisudrivercore.h" 17 : #include "commoncore.h" 18 : 19 : /************************************************************************/ 20 : /* BASISUDriverIdentify() */ 21 : /************************************************************************/ 22 : 23 58312 : int BASISUDriverIdentify(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 58312 : if (STARTS_WITH(poOpenInfo->pszFilename, "BASISU:")) 27 12 : return true; 28 : // See 29 : // https://github.com/BinomialLLC/basis_universal/blob/master/spec/basis_spec.txt 30 58300 : constexpr int HEADER_SIZE = 77; 31 58300 : if (!(poOpenInfo->fpL != nullptr && 32 3114 : poOpenInfo->nHeaderBytes >= HEADER_SIZE && 33 2817 : poOpenInfo->pabyHeader[0] == 0x73 && // Signature 34 65 : poOpenInfo->pabyHeader[1] == 0x42 && // Signature 35 65 : poOpenInfo->pabyHeader[4] == HEADER_SIZE && // Header size 36 65 : poOpenInfo->pabyHeader[5] == 0)) // Header size 37 : { 38 58235 : return false; 39 : } 40 65 : const uint32_t nDataSize = CPL_LSBUINT32PTR(poOpenInfo->pabyHeader + 8); 41 65 : VSIFSeekL(poOpenInfo->fpL, 0, SEEK_END); 42 65 : const auto nFileSize = VSIFTellL(poOpenInfo->fpL); 43 65 : VSIFSeekL(poOpenInfo->fpL, 0, SEEK_SET); 44 65 : return nDataSize + HEADER_SIZE == nFileSize; 45 : } 46 : 47 : /************************************************************************/ 48 : /* BASISUDriverSetCommonMetadata() */ 49 : /************************************************************************/ 50 : 51 1782 : void BASISUDriverSetCommonMetadata(GDALDriver *poDriver) 52 : { 53 1782 : poDriver->SetDescription(BASISU_DRIVER_NAME); 54 1782 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 55 1782 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, 56 1782 : "Basis Universal texture format"); 57 1782 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/basisu.html"); 58 1782 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "basis"); 59 1782 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte"); 60 : 61 1782 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 62 : 63 1782 : poDriver->SetMetadataItem( 64 : GDAL_DMD_CREATIONOPTIONLIST, 65 3564 : GDAL_KTX2_BASISU_GetCreationOptions(/* bIsKTX2 = */ false).c_str()); 66 : 67 1782 : poDriver->pfnIdentify = BASISUDriverIdentify; 68 1782 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 69 1782 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 70 1782 : } 71 : 72 : /************************************************************************/ 73 : /* DeclareDeferredBASISUPlugin() */ 74 : /************************************************************************/ 75 : 76 : #ifdef PLUGIN_FILENAME 77 2054 : void DeclareDeferredBASISUPlugin() 78 : { 79 2054 : if (GDALGetDriverByName(BASISU_DRIVER_NAME) != nullptr) 80 : { 81 283 : return; 82 : } 83 1771 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 84 : #ifdef PLUGIN_INSTALLATION_MESSAGE 85 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 86 : PLUGIN_INSTALLATION_MESSAGE); 87 : #endif 88 1771 : BASISUDriverSetCommonMetadata(poDriver); 89 1771 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 90 : } 91 : 92 2054 : void DeclareDeferredBASISU_KTX2Plugin() 93 : { 94 2054 : DeclareDeferredBASISUPlugin(); 95 2054 : DeclareDeferredKTX2Plugin(); 96 2054 : } 97 : 98 : #endif