github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/webp/libwebp/src/enc/config.c (about)

     1  // Copyright 2011 Google Inc. All Rights Reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style license
     4  // that can be found in the COPYING file in the root of the source
     5  // tree. An additional intellectual property rights grant can be found
     6  // in the file PATENTS. All contributing project authors may
     7  // be found in the AUTHORS file in the root of the source tree.
     8  // -----------------------------------------------------------------------------
     9  //
    10  // Coding tools configuration
    11  //
    12  // Author: Skal (pascal.massimino@gmail.com)
    13  
    14  #include "../webp/encode.h"
    15  
    16  //------------------------------------------------------------------------------
    17  // WebPConfig
    18  //------------------------------------------------------------------------------
    19  
    20  int WebPConfigInitInternal(WebPConfig* config,
    21                             WebPPreset preset, float quality, int version) {
    22    if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_ENCODER_ABI_VERSION)) {
    23      return 0;   // caller/system version mismatch!
    24    }
    25    if (config == NULL) return 0;
    26  
    27    config->quality = quality;
    28    config->target_size = 0;
    29    config->target_PSNR = 0.;
    30    config->method = 4;
    31    config->sns_strength = 50;
    32    config->filter_strength = 60;   // mid-filtering
    33    config->filter_sharpness = 0;
    34    config->filter_type = 1;        // default: strong (so U/V is filtered too)
    35    config->partitions = 0;
    36    config->segments = 4;
    37    config->pass = 1;
    38    config->show_compressed = 0;
    39    config->preprocessing = 0;
    40    config->autofilter = 0;
    41    config->partition_limit = 0;
    42    config->alpha_compression = 1;
    43    config->alpha_filtering = 1;
    44    config->alpha_quality = 100;
    45    config->lossless = 0;
    46    config->image_hint = WEBP_HINT_DEFAULT;
    47    config->emulate_jpeg_size = 0;
    48    config->thread_level = 0;
    49    config->low_memory = 0;
    50  
    51    // TODO(skal): tune.
    52    switch (preset) {
    53      case WEBP_PRESET_PICTURE:
    54        config->sns_strength = 80;
    55        config->filter_sharpness = 4;
    56        config->filter_strength = 35;
    57        config->preprocessing &= ~2;   // no dithering
    58        break;
    59      case WEBP_PRESET_PHOTO:
    60        config->sns_strength = 80;
    61        config->filter_sharpness = 3;
    62        config->filter_strength = 30;
    63        config->preprocessing |= 2;
    64        break;
    65      case WEBP_PRESET_DRAWING:
    66        config->sns_strength = 25;
    67        config->filter_sharpness = 6;
    68        config->filter_strength = 10;
    69        break;
    70      case WEBP_PRESET_ICON:
    71        config->sns_strength = 0;
    72        config->filter_strength = 0;   // disable filtering to retain sharpness
    73        config->preprocessing &= ~2;   // no dithering
    74        break;
    75      case WEBP_PRESET_TEXT:
    76        config->sns_strength = 0;
    77        config->filter_strength = 0;   // disable filtering to retain sharpness
    78        config->preprocessing &= ~2;   // no dithering
    79        config->segments = 2;
    80        break;
    81      case WEBP_PRESET_DEFAULT:
    82      default:
    83        break;
    84    }
    85    return WebPValidateConfig(config);
    86  }
    87  
    88  int WebPValidateConfig(const WebPConfig* config) {
    89    if (config == NULL) return 0;
    90    if (config->quality < 0 || config->quality > 100)
    91      return 0;
    92    if (config->target_size < 0)
    93      return 0;
    94    if (config->target_PSNR < 0)
    95      return 0;
    96    if (config->method < 0 || config->method > 6)
    97      return 0;
    98    if (config->segments < 1 || config->segments > 4)
    99      return 0;
   100    if (config->sns_strength < 0 || config->sns_strength > 100)
   101      return 0;
   102    if (config->filter_strength < 0 || config->filter_strength > 100)
   103      return 0;
   104    if (config->filter_sharpness < 0 || config->filter_sharpness > 7)
   105      return 0;
   106    if (config->filter_type < 0 || config->filter_type > 1)
   107      return 0;
   108    if (config->autofilter < 0 || config->autofilter > 1)
   109      return 0;
   110    if (config->pass < 1 || config->pass > 10)
   111      return 0;
   112    if (config->show_compressed < 0 || config->show_compressed > 1)
   113      return 0;
   114    if (config->preprocessing < 0 || config->preprocessing > 3)
   115      return 0;
   116    if (config->partitions < 0 || config->partitions > 3)
   117      return 0;
   118    if (config->partition_limit < 0 || config->partition_limit > 100)
   119      return 0;
   120    if (config->alpha_compression < 0)
   121      return 0;
   122    if (config->alpha_filtering < 0)
   123      return 0;
   124    if (config->alpha_quality < 0 || config->alpha_quality > 100)
   125      return 0;
   126    if (config->lossless < 0 || config->lossless > 1)
   127      return 0;
   128    if (config->image_hint >= WEBP_HINT_LAST)
   129      return 0;
   130    if (config->emulate_jpeg_size < 0 || config->emulate_jpeg_size > 1)
   131      return 0;
   132    if (config->thread_level < 0 || config->thread_level > 1)
   133      return 0;
   134    if (config->low_memory < 0 || config->low_memory > 1)
   135      return 0;
   136    return 1;
   137  }
   138  
   139  //------------------------------------------------------------------------------
   140