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 : * Permission is hereby granted, free of charge, to any person obtaining a 12 : * copy of this software and associated documentation files (the "Software"), 13 : * to deal in the Software without restriction, including without limitation 14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense, 15 : * and/or sell copies of the Software, and to permit persons to whom the 16 : * Software is furnished to do so, subject to the following conditions: 17 : * 18 : * The above copyright notice and this permission notice shall be included 19 : * in all copies or substantial portions of the Software. 20 : * 21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 27 : * DEALINGS IN THE SOFTWARE. 28 : ******************************************************************************/ 29 : 30 : #include "pngdrivercore.h" 31 : 32 : /************************************************************************/ 33 : /* PNGDriverIdentify() */ 34 : /************************************************************************/ 35 : 36 67442 : int PNGDriverIdentify(GDALOpenInfo *poOpenInfo) 37 : 38 : { 39 67442 : constexpr GByte png_signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; 40 67442 : if (poOpenInfo->fpL == nullptr || 41 16795 : poOpenInfo->nHeaderBytes < static_cast<int>(sizeof(png_signature))) 42 50897 : return FALSE; 43 : 44 16545 : if (memcmp(poOpenInfo->pabyHeader, png_signature, sizeof(png_signature)) != 45 : 0) 46 6855 : return FALSE; 47 : 48 9690 : return TRUE; 49 : } 50 : 51 : /************************************************************************/ 52 : /* PNGDriverSetCommonMetadata() */ 53 : /************************************************************************/ 54 : 55 1258 : void PNGDriverSetCommonMetadata(GDALDriver *poDriver) 56 : { 57 1258 : poDriver->SetDescription(DRIVER_NAME); 58 1258 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 59 1258 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Portable Network Graphics"); 60 1258 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/png.html"); 61 1258 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "png"); 62 1258 : poDriver->SetMetadataItem(GDAL_DMD_MIMETYPE, "image/png"); 63 : 64 1258 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte UInt16"); 65 1258 : poDriver->SetMetadataItem( 66 : GDAL_DMD_CREATIONOPTIONLIST, 67 : "<CreationOptionList>\n" 68 : " <Option name='WORLDFILE' type='boolean' description='Create world " 69 : "file' default='FALSE'/>\n" 70 : " <Option name='ZLEVEL' type='int' description='DEFLATE compression " 71 : "level 1-9' default='6'/>\n" 72 : " <Option name='SOURCE_ICC_PROFILE' type='string' description='ICC " 73 : "Profile'/>\n" 74 : " <Option name='SOURCE_ICC_PROFILE_NAME' type='string' " 75 : "description='ICC Profile name'/>\n" 76 : " <Option name='SOURCE_PRIMARIES_RED' type='string' " 77 : "description='x,y,1.0 (xyY) red chromaticity'/>\n" 78 : " <Option name='SOURCE_PRIMARIES_GREEN' type='string' " 79 : "description='x,y,1.0 (xyY) green chromaticity'/>\n" 80 : " <Option name='SOURCE_PRIMARIES_BLUE' type='string' " 81 : "description='x,y,1.0 (xyY) blue chromaticity'/>\n" 82 : " <Option name='SOURCE_WHITEPOINT' type='string' " 83 : "description='x,y,1.0 (xyY) whitepoint'/>\n" 84 : " <Option name='PNG_GAMMA' type='string' description='Gamma'/>\n" 85 : " <Option name='TITLE' type='string' description='Title'/>\n" 86 : " <Option name='DESCRIPTION' type='string' " 87 : "description='Description'/>\n" 88 : " <Option name='COPYRIGHT' type='string' description='Copyright'/>\n" 89 : " <Option name='COMMENT' type='string' description='Comment'/>\n" 90 : " <Option name='WRITE_METADATA_AS_TEXT' type='boolean' " 91 : "description='Whether to write source dataset metadata in TEXT chunks' " 92 : "default='FALSE'/>\n" 93 : " <Option name='NBITS' type='int' description='Force output bit " 94 : "depth: 1, 2 or 4'/>\n" 95 1258 : "</CreationOptionList>\n"); 96 : 97 1258 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 98 : 99 1258 : poDriver->pfnIdentify = PNGDriverIdentify; 100 1258 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 101 1258 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 102 1258 : } 103 : 104 : /************************************************************************/ 105 : /* DeclareDeferredPNGPlugin() */ 106 : /************************************************************************/ 107 : 108 : #ifdef PLUGIN_FILENAME 109 1512 : void DeclareDeferredPNGPlugin() 110 : { 111 1512 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 112 : { 113 295 : return; 114 : } 115 1217 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 116 : #ifdef PLUGIN_INSTALLATION_MESSAGE 117 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 118 : PLUGIN_INSTALLATION_MESSAGE); 119 : #endif 120 1217 : PNGDriverSetCommonMetadata(poDriver); 121 1217 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 122 : } 123 : #endif