LCOV - code coverage report
Current view: top level - frmts/webp - webpdrivercore.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 31 31 100.0 %
Date: 2024-04-26 23:38:17 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GDAL WEBP Driver
       4             :  * Purpose:  Implement GDAL WEBP Support based on libwebp
       5             :  * Author:   Even Rouault, <even dot rouault at spatialys.com>
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2011-2013, Even Rouault <even dot rouault at spatialys.com>
       9             :  *
      10             :  * Permission is hereby granted, free of charge, to any person obtaining a
      11             :  * copy of this software and associated documentation files (the "Software"),
      12             :  * to deal in the Software without restriction, including without limitation
      13             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      14             :  * and/or sell copies of the Software, and to permit persons to whom the
      15             :  * Software is furnished to do so, subject to the following conditions:
      16             :  *
      17             :  * The above copyright notice and this permission notice shall be included
      18             :  * in all copies or substantial portions of the Software.
      19             :  *
      20             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
      21             :  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      22             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      23             :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      24             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      25             :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      26             :  * DEALINGS IN THE SOFTWARE.
      27             :  ****************************************************************************/
      28             : 
      29             : #include "webp_headers.h"
      30             : #include "webpdrivercore.h"
      31             : 
      32             : /************************************************************************/
      33             : /*                     WEBPDriverIdentify()                             */
      34             : /************************************************************************/
      35             : 
      36       48425 : int WEBPDriverIdentify(GDALOpenInfo *poOpenInfo)
      37             : 
      38             : {
      39       48425 :     const int nHeaderBytes = poOpenInfo->nHeaderBytes;
      40       48425 :     const GByte *pabyHeader = poOpenInfo->pabyHeader;
      41             : 
      42       48425 :     if (nHeaderBytes < 20)
      43       45352 :         return FALSE;
      44             : 
      45        3748 :     return memcmp(pabyHeader, "RIFF", 4) == 0 &&
      46        3748 :            memcmp(pabyHeader + 8, "WEBP", 4) == 0 &&
      47         675 :            (memcmp(pabyHeader + 12, "VP8 ", 4) == 0 ||
      48         562 :             memcmp(pabyHeader + 12, "VP8L", 4) == 0 ||
      49        3596 :             memcmp(pabyHeader + 12, "VP8X", 4) == 0);
      50             : }
      51             : 
      52             : /************************************************************************/
      53             : /*                      WEBPDriverSetCommonMetadata()                   */
      54             : /************************************************************************/
      55             : 
      56        1223 : void WEBPDriverSetCommonMetadata(GDALDriver *poDriver)
      57             : {
      58        1223 :     poDriver->SetDescription(DRIVER_NAME);
      59        1223 :     poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
      60        1223 :     poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "WEBP");
      61        1223 :     poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/webp.html");
      62        1223 :     poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "webp");
      63        1223 :     poDriver->SetMetadataItem(GDAL_DMD_MIMETYPE, "image/webp");
      64        1223 :     poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, "Byte");
      65             : 
      66        1223 :     poDriver->SetMetadataItem(
      67             :         GDAL_DMD_CREATIONOPTIONLIST,
      68             :         "<CreationOptionList>\n"
      69             :         "   <Option name='QUALITY' type='float' description='good=100, bad=0' "
      70             :         "default='75'/>\n"
      71             : #if WEBP_ENCODER_ABI_VERSION >= 0x0100
      72             :         "   <Option name='LOSSLESS' type='boolean' description='Whether "
      73             :         "lossless compression should be used' default='FALSE'/>\n"
      74             : #endif
      75             :         "   <Option name='LOSSLESS_COPY' type='string-select' "
      76             :         "description='Whether conversion should be lossless' default='AUTO'>"
      77             :         "     <Value>AUTO</Value>"
      78             :         "     <Value>YES</Value>"
      79             :         "     <Value>NO</Value>"
      80             :         "   </Option>"
      81             :         "   <Option name='PRESET' type='string-select' description='kind of "
      82             :         "image' default='DEFAULT'>\n"
      83             :         "       <Value>DEFAULT</Value>\n"
      84             :         "       <Value>PICTURE</Value>\n"
      85             :         "       <Value>PHOTO</Value>\n"
      86             :         "       <Value>DRAWING</Value>\n"
      87             :         "       <Value>ICON</Value>\n"
      88             :         "       <Value>TEXT</Value>\n"
      89             :         "   </Option>\n"
      90             :         "   <Option name='TARGETSIZE' type='int' description='if non-zero, "
      91             :         "desired target size in bytes. Has precedence over QUALITY'/>\n"
      92             :         "   <Option name='PSNR' type='float' description='if non-zero, minimal "
      93             :         "distortion to to achieve. Has precedence over TARGETSIZE'/>\n"
      94             :         "   <Option name='METHOD' type='int' description='quality/speed "
      95             :         "trade-off. fast=0, slower-better=6' default='4'/>\n"
      96             :         "   <Option name='SEGMENTS' type='int' description='maximum number of "
      97             :         "segments [1-4]' default='4'/>\n"
      98             :         "   <Option name='SNS_STRENGTH' type='int' description='Spatial Noise "
      99             :         "Shaping. off=0, maximum=100' default='50'/>\n"
     100             :         "   <Option name='FILTER_STRENGTH' type='int' description='Filter "
     101             :         "strength. off=0, strongest=100' default='20'/>\n"
     102             :         "   <Option name='FILTER_SHARPNESS' type='int' description='Filter "
     103             :         "sharpness. off=0, least sharp=7' default='0'/>\n"
     104             :         "   <Option name='FILTER_TYPE' type='int' description='Filtering type. "
     105             :         "simple=0, strong=1' default='0'/>\n"
     106             :         "   <Option name='AUTOFILTER' type='int' description=\"Auto adjust "
     107             :         "filter's strength. off=0, on=1\" default='0'/>\n"
     108             :         "   <Option name='PASS' type='int' description='Number of entropy "
     109             :         "analysis passes [1-10]' default='1'/>\n"
     110             :         "   <Option name='PREPROCESSING' type='int' description='Preprocessing "
     111             :         "filter. none=0, segment-smooth=1' default='0'/>\n"
     112             :         "   <Option name='PARTITIONS' type='int' description='log2(number of "
     113             :         "token partitions) in [0..3]' default='0'/>\n"
     114             : #if WEBP_ENCODER_ABI_VERSION >= 0x0002
     115             :         "   <Option name='PARTITION_LIMIT' type='int' description='quality "
     116             :         "degradation allowed to fit the 512k limit on prediction modes coding "
     117             :         "(0=no degradation, 100=full)' default='0'/>\n"
     118             : #endif
     119             : #if WEBP_ENCODER_ABI_VERSION >= 0x0209
     120             :         "   <Option name='EXACT' type='int' description='preserve the exact "
     121             :         "RGB values under transparent area. off=0, on=1' default='0'/>\n"
     122             : #endif
     123        1223 :         "</CreationOptionList>\n");
     124             : 
     125        1223 :     poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
     126             : 
     127        1223 :     poDriver->pfnIdentify = WEBPDriverIdentify;
     128             : 
     129        1223 :     poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES");
     130        1223 :     poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES");
     131        1223 : }
     132             : 
     133             : /************************************************************************/
     134             : /*                     DeclareDeferredWEBPPlugin()                      */
     135             : /************************************************************************/
     136             : 
     137             : #ifdef PLUGIN_FILENAME
     138        1509 : void DeclareDeferredWEBPPlugin()
     139             : {
     140        1509 :     if (GDALGetDriverByName(DRIVER_NAME) != nullptr)
     141             :     {
     142         295 :         return;
     143             :     }
     144        1214 :     auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME);
     145             : #ifdef PLUGIN_INSTALLATION_MESSAGE
     146             :     poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE,
     147             :                               PLUGIN_INSTALLATION_MESSAGE);
     148             : #endif
     149        1214 :     WEBPDriverSetCommonMetadata(poDriver);
     150        1214 :     GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver);
     151             : }
     152             : #endif

Generated by: LCOV version 1.14