Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: PNG Driver 4 : * Purpose: Implement GDAL PNG Support 5 : * Author: Frank Warmerdam, warmerda@home.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2000, Frank Warmerdam 9 : * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com> 10 : * 11 : * SPDX-License-Identifier: MIT 12 : ******************************************************************************/ 13 : 14 : #include "gdal_frmts.h" 15 : #include "gdalplugindriverproxy.h" 16 : 17 : #include "pngdrivercore.h" 18 : 19 : /************************************************************************/ 20 : /* PNGDriverIdentify() */ 21 : /************************************************************************/ 22 : 23 80531 : int PNGDriverIdentify(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 80531 : constexpr GByte png_signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; 27 80531 : if (poOpenInfo->fpL == nullptr || 28 20026 : poOpenInfo->nHeaderBytes < static_cast<int>(sizeof(png_signature))) 29 60750 : return FALSE; 30 : 31 19781 : if (memcmp(poOpenInfo->pabyHeader, png_signature, sizeof(png_signature)) != 32 : 0) 33 6945 : return FALSE; 34 : 35 12836 : return TRUE; 36 : } 37 : 38 : /************************************************************************/ 39 : /* PNGDriverSetCommonMetadata() */ 40 : /************************************************************************/ 41 : 42 1821 : void PNGDriverSetCommonMetadata(GDALDriver *poDriver) 43 : { 44 1821 : poDriver->SetDescription(DRIVER_NAME); 45 1821 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 46 1821 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Portable Network Graphics"); 47 1821 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/png.html"); 48 1821 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "png"); 49 1821 : poDriver->SetMetadataItem(GDAL_DMD_MIMETYPE, "image/png"); 50 : 51 1821 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte UInt16"); 52 1821 : poDriver->SetMetadataItem( 53 : GDAL_DMD_CREATIONOPTIONLIST, 54 : "<CreationOptionList>\n" 55 : " <Option name='WORLDFILE' type='boolean' description='Create world " 56 : "file' default='FALSE'/>\n" 57 : " <Option name='ZLEVEL' type='int' description='DEFLATE compression " 58 : "level 0 (no compression)-9 (best compression)' default='6'/>\n" 59 : " <Option name='SOURCE_ICC_PROFILE' type='string' description='ICC " 60 : "Profile'/>\n" 61 : " <Option name='SOURCE_ICC_PROFILE_NAME' type='string' " 62 : "description='ICC Profile name'/>\n" 63 : " <Option name='SOURCE_PRIMARIES_RED' type='string' " 64 : "description='x,y,1.0 (xyY) red chromaticity'/>\n" 65 : " <Option name='SOURCE_PRIMARIES_GREEN' type='string' " 66 : "description='x,y,1.0 (xyY) green chromaticity'/>\n" 67 : " <Option name='SOURCE_PRIMARIES_BLUE' type='string' " 68 : "description='x,y,1.0 (xyY) blue chromaticity'/>\n" 69 : " <Option name='SOURCE_WHITEPOINT' type='string' " 70 : "description='x,y,1.0 (xyY) whitepoint'/>\n" 71 : " <Option name='PNG_GAMMA' type='string' description='Gamma'/>\n" 72 : " <Option name='TITLE' type='string' description='Title'/>\n" 73 : " <Option name='DESCRIPTION' type='string' " 74 : "description='Description'/>\n" 75 : " <Option name='COPYRIGHT' type='string' description='Copyright'/>\n" 76 : " <Option name='COMMENT' type='string' description='Comment'/>\n" 77 : " <Option name='WRITE_METADATA_AS_TEXT' type='boolean' " 78 : "description='Whether to write source dataset metadata in TEXT chunks' " 79 : "default='FALSE'/>\n" 80 : " <Option name='NBITS' type='int' description='Force output bit " 81 : "depth: 1, 2 or 4'/>\n" 82 1821 : "</CreationOptionList>\n"); 83 : 84 1821 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 85 1821 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_ONLY_VISIBLE_AT_CLOSE_TIME, 86 1821 : "YES"); 87 : 88 1821 : poDriver->pfnIdentify = PNGDriverIdentify; 89 1821 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 90 1821 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 91 1821 : } 92 : 93 : /************************************************************************/ 94 : /* DeclareDeferredPNGPlugin() */ 95 : /************************************************************************/ 96 : 97 : #ifdef PLUGIN_FILENAME 98 2033 : void DeclareDeferredPNGPlugin() 99 : { 100 2033 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 101 : { 102 283 : return; 103 : } 104 1750 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 105 : #ifdef PLUGIN_INSTALLATION_MESSAGE 106 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 107 : PLUGIN_INSTALLATION_MESSAGE); 108 : #endif 109 1750 : PNGDriverSetCommonMetadata(poDriver); 110 1750 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 111 : } 112 : #endif