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 57926 : int BASISUDriverIdentify(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 57926 : 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 57914 : constexpr int HEADER_SIZE = 77; 31 57914 : if (!(poOpenInfo->fpL != nullptr && 32 3110 : poOpenInfo->nHeaderBytes >= HEADER_SIZE && 33 2813 : 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 57849 : 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 1761 : void BASISUDriverSetCommonMetadata(GDALDriver *poDriver) 52 : { 53 1761 : poDriver->SetDescription(BASISU_DRIVER_NAME); 54 1761 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 55 1761 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, 56 1761 : "Basis Universal texture format"); 57 1761 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/basisu.html"); 58 1761 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "basis"); 59 1761 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte"); 60 : 61 1761 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 62 : 63 1761 : poDriver->SetMetadataItem( 64 : GDAL_DMD_CREATIONOPTIONLIST, 65 3522 : GDAL_KTX2_BASISU_GetCreationOptions(/* bIsKTX2 = */ false).c_str()); 66 : 67 1761 : poDriver->pfnIdentify = BASISUDriverIdentify; 68 1761 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 69 1761 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 70 1761 : } 71 : 72 : /************************************************************************/ 73 : /* DeclareDeferredBASISUPlugin() */ 74 : /************************************************************************/ 75 : 76 : #ifdef PLUGIN_FILENAME 77 2033 : void DeclareDeferredBASISUPlugin() 78 : { 79 2033 : if (GDALGetDriverByName(BASISU_DRIVER_NAME) != nullptr) 80 : { 81 283 : return; 82 : } 83 1750 : 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 1750 : BASISUDriverSetCommonMetadata(poDriver); 89 1750 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 90 : } 91 : 92 2033 : void DeclareDeferredBASISU_KTX2Plugin() 93 : { 94 2033 : DeclareDeferredBASISUPlugin(); 95 2033 : DeclareDeferredKTX2Plugin(); 96 2033 : } 97 : 98 : #endif