diff options
author | zachr@google.com <zachr@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-16 15:47:07 +0000 |
---|---|---|
committer | zachr@google.com <zachr@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-16 15:47:07 +0000 |
commit | 92fe073efbd9287cdb4d01a1b9c0664fc5d4fdd0 (patch) | |
tree | 0092c1da2ef9005d44acfc0478a4ca60433510a6 /experimental/skpdiff/generate_pmetric_tables.py | |
parent | f2e7dbb09fabc31fe5b16f6dc1a16593f518ca7d (diff) |
add table pregeneration script for pmetric
R=djsollen@google.com
Review URL: https://codereview.chromium.org/19256002
git-svn-id: http://skia.googlecode.com/svn/trunk@10106 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'experimental/skpdiff/generate_pmetric_tables.py')
-rwxr-xr-x | experimental/skpdiff/generate_pmetric_tables.py | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/experimental/skpdiff/generate_pmetric_tables.py b/experimental/skpdiff/generate_pmetric_tables.py new file mode 100755 index 0000000000..12c226347f --- /dev/null +++ b/experimental/skpdiff/generate_pmetric_tables.py @@ -0,0 +1,149 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from __future__ import print_function +from math import * + + +COPYRIGHT = '''/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */''' + + +HELP = '// To regenerate SkPMetricUtil_generated.h, simply run ./generate_pmetric_tables.py' + + +# From Barten SPIE 1989 +def contrast_sensitivity(cycles_per_degree, luminance): + a = 440.0 * pow(1.0 + 0.7 / luminance, -0.2) + b = 0.3 * pow(1 + 100.0 / luminance, 0.15) + return a * cycles_per_degree * exp(-b * cycles_per_degree) * sqrt(1.0 + 0.06 * exp(b * cycles_per_degree)) + + +# From Ward Larson Siggraph 1997 +def threshold_vs_intensity(adaptation_luminance): + log_lum = float('-inf') # Works in Python 2.6+ + try: + log_lum = log10(adaptation_luminance) + except ValueError: + pass + + x = 0.0 + + if log_lum < -3.94: + x = -2.86 + + elif log_lum < -1.44: + x = pow(0.405 * log_lum + 1.6, 2.18) - 2.86 + + elif log_lum < -0.0184: + x = log_lum - 0.395 + + elif log_lum < 1.9: + x = pow(0.249 * log_lum + 0.65, 2.7) - 0.72 + + else: + x = log_lum - 1.255 + + return pow(10.0, x) + + +# From Daly 1993 +def visual_mask(contrast): + x = pow(392.498 * contrast, 0.7) + x = pow(0.0153 * x, 4.0) + return pow(1.0 + x, 0.25) + + +# float gCubeRootTable[] +CUBE_ROOT_ACCESS_FUNCTION = ''' +float get_cube_root(float value) { + SkASSERT(value >= 0.0f); + SkASSERT(value * 1023.0f < 1024.0f); + return gCubeRootTable[(int)(value * 1023.0f)]; +} +''' +def generate_cube_root_table(stream): + print('static float gCubeRootTable[] = {', end='', file=stream) + for i in range(1024): + if i % 6 == 0: + print('\n ', end='', file=stream) + print("%.10f" % pow(i / 1024.0, 1.0 / 3.0), end='f,', file=stream) + print('\n};', end='', file=stream) + print(CUBE_ROOT_ACCESS_FUNCTION, file=stream) + + +# float gGammaTable[] +GAMMA_ACCESS_FUNCTION = ''' +float get_gamma(unsigned char value) { + return gGammaTable[value]; +} +''' +def generate_gamma_table(stream): + print('static float gGammaTable[] = {', end='', file=stream) + for i in range(256): + if i % 6 == 0: + print('\n ', end='', file=stream) + print("%.10f" % pow(i / 255.0, 2.2), end='f,', file=stream) + print('\n};', end='', file=stream) + print(GAMMA_ACCESS_FUNCTION, file=stream) + + +# float gTVITable[] +TVI_ACCESS_FUNCTION = ''' +float get_threshold_vs_intensity(float value) { + SkASSERT(value >= 0.0f); + SkASSERT(value < 100.0f); + return gTVITable[(int)(value * 100.0f)]; +} +''' +def generate_tvi_table(stream): + print('static float gTVITable[] = {', end='', file=stream) + for i in range(10000): + if i % 6 == 0: + print('\n ', end='', file=stream) + print("%.10f" % threshold_vs_intensity(i / 100.0), end='f,', file=stream) + print('\n};', end='', file=stream) + print(TVI_ACCESS_FUNCTION, file=stream) + + +# float gVisualMaskTable[] +VISUAL_MASK_DOMAIN = 4000 +VISUAL_MASK_ACCESS_FUNCTION = ''' +float get_visual_mask(float value) {{ + SkASSERT(value >= 0.0f); + SkASSERT(value < {}.0f); + return gVisualMaskTable[(int)value]; +}}''' +def generate_visual_mask_table(stream): + print('static float gVisualMaskTable[] = {', end='', file=stream) + for i in range(VISUAL_MASK_DOMAIN): + if i % 6 == 0: + print('\n ', end='', file=stream) + print("%.10f" % visual_mask(i), end='f,', file=stream) + print('\n};', end='', file=stream) + print(VISUAL_MASK_ACCESS_FUNCTION.format(VISUAL_MASK_DOMAIN), file=stream) + + +def generate_lookup_tables(stream): + print(COPYRIGHT, file=stream) + print(HELP, file=stream) + print('namespace SkPMetricUtil {', file=stream) + generate_cube_root_table(stream) + generate_gamma_table(stream) + generate_tvi_table(stream) + generate_visual_mask_table(stream) + print('}', file=stream) + + +def main(): + pmetric_util_out = open('SkPMetricUtil_generated.h', 'wb') + generate_lookup_tables(pmetric_util_out) + pmetric_util_out.close() + + +if __name__ == '__main__': + main() |