1#!/usr/bin/perl 2# 3# Produce gamma-correction tables for alpha blending, assuming sRGB space. 4# 5 6sub srgb_to_linear($) 7{ 8 my($s) = @_; 9 10 if ($s <= 10) { 11 return $s/(255*12.92); 12 } else { 13 return (($s+14.025)/269.025)**2.4; 14 } 15} 16 17sub linear_to_srgb($) 18{ 19 my($l) = @_; 20 my $s; 21 22 if ($l <= 0.00304) { 23 $s = 12.92*$l; 24 } else { 25 $s = 1.055*$l**(1.0/2.4) - 0.055; 26 } 27 28 return int($s*255+0.5); 29} 30 31# Header 32print "#include <inttypes.h>\n\n"; 33 34# 35# Table 1: convert 8-bit sRGB values to 16-bit linear values 36# 37 38print "const uint16_t __vesacon_srgb_to_linear[256] = {\n"; 39for ($i = 0; $i <= 255; $i++) { 40 printf "\t%5d,\n", int(srgb_to_linear($i)*65535+0.5); 41} 42print "};\n\n"; 43 44# 45# Table 2: convert linear values in the range [0, 65535*255], 46# shifted right by 12 bits, to sRGB 47# 48 49print "const uint8_t __vesacon_linear_to_srgb[4080] = {\n"; 50for ($i = 0; $i <= 4079; $i++) { 51 printf "\t%3d,\n", linear_to_srgb(($i+0.5)/4079.937744); 52} 53print "};\n\n"; 54