---------------------------------------------------------------------
---------------------------------------------------------------------
-- PNG_IO -- Ada95 Portable Network Graphics Input/Output Package --
-- --
-- Copyright (©) 2001 Dr Stephen J. Sangwine (S.Sangwine@IEEE.org) --
-- --
-- This software was created by Stephen J. Sangwine. He hereby --
-- asserts his Moral Right to be identified as author of this --
-- software. --
---------------------------------------------------------------------
---------------------------------------------------------------------
-- PNG_IO is free software; you can redistribute it and/or modify --
-- it under the terms of the GNU General Public License as --
-- published by the Free Software Foundation; either version 2 of --
-- the License, or (at your option) any later version. --
-- --
-- PNG_IO is distributed in the hope that it will be useful, but --
-- WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --
-- GNU General Public License for more details. --
-- --
-- You should have received a copy of the GNU General Public --
-- License along with this software (in the file gpl.txt); if not, --
-- contact the Free Software Foundation, or access www.fsf.org. --
---------------------------------------------------------------------
---------------------------------------------------------------------
-- Date: 12 March 2001 --
---------------------------------------------------------------------
---------------------------------------------------------------------
with Ada.Numerics.Elementary_Functions;
package body PNG_IO.Standard_RGB_Encodings is
Encoding_LUT : array( Linear_Sample) of Encoded_Sample;
Decoding_LUT : array(Encoded_Sample) of Linear_Sample;
function sRGB_Encode(X : Linear_Sample) return Encoded_Sample is
begin
return Encoding_LUT(X);
end sRGB_Encode;
function sRGB_Decode(X : Encoded_Sample) return Linear_Sample is
begin
return Decoding_LUT(X);
end sRGB_Decode;
begin
declare
subtype Normalized_Float is Float range 0.0 .. 1.0;
function Non_Linear(X : Normalized_Float) return Normalized_Float is
use Ada.Numerics.Elementary_Functions;
begin
if X <= 0.003_04 then
return 12.92 * X;
else
return 1.055 * (X ** (1.0/2.4)) - 0.055;
end if;
end Non_Linear;
function Linear(X : Normalized_Float) return Normalized_Float is
use Ada.Numerics.Elementary_Functions;
begin
if X <= 0.039_28 then
return X/12.92;
else
return ((X + 0.055)/1.055) ** 2.4;
end if;
end Linear;
ESL : constant Float := Float(Encoded_Sample'Pos(Encoded_Sample'Last));
SL : constant Float := Float( Linear_Sample'Pos( Linear_Sample'Last));
begin
for I in Encoding_LUT'range loop
Encoding_LUT(I) := Encoded_Sample'Val(Integer(ESL * Non_Linear(Float(Linear_Sample'Pos(I))/SL)));
end loop;
for I in Decoding_LUT'range loop
Decoding_LUT(I) := Linear_Sample'Val(Integer(SL * Linear(Float(Encoded_Sample'Pos(I))/ESL)));
end loop;
end;
end PNG_IO.Standard_RGB_Encodings;