Commit dc1f48c0 authored by Øyvind Kolås's avatar Øyvind Kolås

added a manual white balance corrector that computes the adjustment based

* operations/common/color-temperature.c: added a manual white balance
corrector that computes the adjustment based on color temperature
values from Jan Heller.
* AUTHORS: added Jan Heller.

svn path=/trunk/; revision=2236
parent c3983f7b
......@@ -6,7 +6,7 @@ Sven Neumann, Michael Natterer, Øyvind Kolås, Philip Lafleur, Dominik Ernst,
Richard Kralovic, Kevin Cozens, Victor Bogado, Martin Nordholts, Geert
Jordaens, Michael Schumacher, John Marshall, Étienne Bersac, Mark Probst, Håkon
Hitland, Tor Lillqvist, Hans Breuer, Deji Akingunola and Bradley Broom,
Hans Petter Jansson.
Hans Petter Jansson, Jan Heller.
Documentation:
^^^^^^^^^^^^^^
......
2008-04-26 Øyvind Kolås <pippin@gimp.org>
* operations/common/color-temperature.c: added a manual white balance
corrector that computes the adjustment based on color temperature
values from Jan Heller.
* AUTHORS: added Jan Heller.
2008-04-25 João S. O. Bueno <gwidion@mpc.com.br>
* bindings/pygegl/samples/render-test.py: Updated operation names
for fractal-explorer and screen
......
/* This file is an image processing operation for GEGL
*
* GEGL is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* GEGL 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2008 Jan Heller <jan.heller@matfyz.cz>
*/
#ifdef GEGL_CHANT_PROPERTIES
gegl_chant_double (original_temp, "Original temperature", 1000, 12000, 6500, "Estimated temperature of the light source in K the image was taken with.")
gegl_chant_double (intended_temp, "Intended temperature", 1000, 12000, 6500, "Corrected estimation of the temperatureof the light source in K.")
#else
#define GEGL_CHANT_TYPE_POINT_FILTER
#define GEGL_CHANT_C_FILE "color-temperature.c"
#include "gegl-chant.h"
#define LOWEST_TEMPERATURE 1000
#define HIGHEST_TEMPERATURE 12000
#define TEMPERATURE_STEP 20
#define LERP(x, x0, y0, x1, y1) (y0 + (x - x0) * (gfloat) (y1 - y0) / (gfloat) (x1 - x0))
gfloat planckian_locus[][3];
static void
convert_k_to_rgb (gfloat temperature,
gfloat *rgb)
{
int ilow, ihigh;
int delta_temperature;
gfloat resid_temperature;
if (temperature < LOWEST_TEMPERATURE)
temperature = LOWEST_TEMPERATURE;
if (temperature > HIGHEST_TEMPERATURE)
temperature = HIGHEST_TEMPERATURE;
delta_temperature = temperature - LOWEST_TEMPERATURE;
ilow = delta_temperature / TEMPERATURE_STEP;
ihigh = (delta_temperature % TEMPERATURE_STEP) ? ilow + 1 : ilow;
resid_temperature = temperature - (ilow * TEMPERATURE_STEP + LOWEST_TEMPERATURE);
rgb[0] = LERP(resid_temperature,
0,
planckian_locus[ilow][0],
TEMPERATURE_STEP,
planckian_locus[ihigh][0]);
rgb[1] = LERP(resid_temperature,
0,
planckian_locus[ilow][1],
TEMPERATURE_STEP,
planckian_locus[ihigh][1]);
rgb[2] = LERP(resid_temperature,
0,
planckian_locus[ilow][2],
TEMPERATURE_STEP,
planckian_locus[ihigh][2]);
}
static void prepare (GeglOperation *operation)
{
Babl *format = babl_format ("RGBA float");
gegl_operation_set_format (operation, "input", format);
gegl_operation_set_format (operation, "output", format);
}
/* GeglOperationPointFilter gives us a linear buffer to operate on
* in our requested pixel format
*/
static gboolean
process (GeglOperation *op,
void *in_buf,
void *out_buf,
glong n_pixels)
{
GeglChantO *o = GEGL_CHANT_PROPERTIES (op);
gfloat *in_pixel;
gfloat *out_pixel;
gfloat original_temp, original_temp_rgb[3];
gfloat intended_temp, intended_temp_rgb[3];
gfloat coefs[3];
glong i;
in_pixel = in_buf;
out_pixel = out_buf;
original_temp = o->original_temp;
intended_temp = o->intended_temp;
convert_k_to_rgb (original_temp, original_temp_rgb);
convert_k_to_rgb (intended_temp, intended_temp_rgb);
coefs[0] = original_temp_rgb[0] / intended_temp_rgb[0];
coefs[1] = original_temp_rgb[1] / intended_temp_rgb[1];
coefs[2] = original_temp_rgb[2] / intended_temp_rgb[2];
for (i = 0; i < n_pixels; i++)
{
out_pixel[0] = in_pixel[0] * coefs[0];
out_pixel[1] = in_pixel[1] * coefs[1];
out_pixel[2] = in_pixel[2] * coefs[2];
in_pixel += 4;
out_pixel += 4;
}
return TRUE;
}
static void
gegl_chant_class_init (GeglChantClass *klass)
{
GeglOperationClass *operation_class;
GeglOperationPointFilterClass *point_filter_class;
operation_class = GEGL_OPERATION_CLASS (klass);
point_filter_class = GEGL_OPERATION_POINT_FILTER_CLASS (klass);
point_filter_class->process = process;
operation_class->prepare = prepare;
operation_class->name = "color-temperature";
operation_class->categories = "color";
operation_class->description =
"Allows changing the color temperature of an image.";
}
/* linear RGB coordinates of the range 1000K-12000K of the Planckian locus
* with a step of 20K. Original CIE-xy data from
*
* http://www.aim-dtp.net/aim/technology/cie_xyz/k2xy.txt
*
* converted to the linear RGB space assuming the ITU-R BT.709-5/sRGB primaries
*/
gfloat planckian_locus[][3] = {
{4.600356578826904, 0.039673976600170, -0.090084008872509},
{4.529547214508057, 0.060751978307962, -0.090336769819260},
{4.460455894470215, 0.081308871507645, -0.090486899018288},
{4.393052101135254, 0.101353414356709, -0.090532697737217},
{4.327302455902100, 0.120895706117153, -0.090473271906376},
{4.263172149658203, 0.139945656061172, -0.090306982398033},
{4.200626373291016, 0.158513724803925, -0.090033084154129},
{4.139626502990723, 0.176611170172691, -0.089650854468346},
{4.080136775970459, 0.194248676300049, -0.089159496128559},
{4.022119522094727, 0.211437240242958, -0.088558793067932},
{3.965537071228027, 0.228188246488571, -0.087848260998726},
{3.910352706909180, 0.244512572884560, -0.087028004229069},
{3.856527805328369, 0.260421544313431, -0.086097948253155},
{3.804027318954468, 0.275925725698471, -0.085058398544788},
{3.752812623977661, 0.291036576032639, -0.083909429609776},
{3.702850103378296, 0.305764228105545, -0.082651883363724},
{3.654103517532349, 0.320119321346283, -0.081285811960697},
{3.606539249420166, 0.334112167358398, -0.079812526702881},
{3.560122966766357, 0.347752898931503, -0.078232251107693},
{3.514821767807007, 0.361051410436630, -0.076546311378479},
{3.470603942871094, 0.374017328023911, -0.074755765497684},
{3.427437543869019, 0.386660069227219, -0.072861269116402},
{3.385292530059814, 0.398988872766495, -0.070864379405975},
{3.344139337539673, 0.411012589931488, -0.068766348063946},
{3.303948402404785, 0.422740101814270, -0.066568255424500},
{3.264692068099976, 0.434179782867432, -0.064271673560143},
{3.226344108581543, 0.445339679718018, -0.061878167092800},
{3.188876152038574, 0.456228226423264, -0.059388883411884},
{3.152264595031738, 0.466852724552155, -0.056805800646544},
{3.116483449935913, 0.477220892906189, -0.054130155593157},
{3.081508159637451, 0.487340450286865, -0.051363691687584},
{3.047317266464233, 0.497217774391174, -0.048508264124393},
{3.013886213302612, 0.506860315799713, -0.045565359294415},
{2.981194734573364, 0.516274333000183, -0.042536824941635},
{2.949220180511475, 0.525466740131378, -0.039424113929272},
{2.917943477630615, 0.534443438053131, -0.036229386925697},
{2.887344598770142, 0.543210446834564, -0.032954134047031},
{2.857403039932251, 0.551774084568024, -0.029600324109197},
{2.828101158142090, 0.560139715671539, -0.026169350370765},
{2.799420833587646, 0.568313062191010, -0.022663576528430},
{2.771345376968384, 0.576299130916595, -0.019084414467216},
{2.743856906890869, 0.584103465080261, -0.015433621592820},
{2.716940402984619, 0.591730713844299, -0.011713179759681},
{2.690578937530518, 0.599186122417450, -0.007924740202725},
{2.664757251739502, 0.606474399566650, -0.004070047754794},
{2.639461040496826, 0.613599836826324, -0.000150968160597},
{2.614676475524902, 0.620566844940186, 0.003830861533061},
{2.590389728546143, 0.627379775047302, 0.007873660884798},
{2.566586494445801, 0.634042918682098, 0.011975705623627},
{2.543254852294922, 0.640560030937195, 0.016135273501277},
{2.520380973815918, 0.646935403347015, 0.020350834354758},
{2.497954607009888, 0.653172314167023, 0.024620544165373},
{2.475962400436401, 0.659274816513062, 0.028942735865712},
{2.454393863677979, 0.665246248245239, 0.033316079527140},
{2.433237075805664, 0.671090126037598, 0.037738852202892},
{2.412482976913452, 0.676809608936310, 0.042209245264530},
{2.392119884490967, 0.682408094406128, 0.046725895255804},
{2.372138500213623, 0.687888622283936, 0.051287215203047},
{2.352528810501099, 0.693254292011261, 0.055891864001751},
{2.333281755447388, 0.698507964611053, 0.060538198798895},
{2.314387559890747, 0.703652620315552, 0.065224684774876},
{2.295837879180908, 0.708690941333771, 0.069950088858604},
{2.277624368667603, 0.713625550270081, 0.074713014066219},
{2.259738922119141, 0.718458950519562, 0.079511843621731},
{2.242172718048096, 0.723193943500519, 0.084345355629921},
{2.224918365478516, 0.727832853794098, 0.089212194085121},
{2.207968950271606, 0.732377946376801, 0.094111092388630},
{2.191315889358521, 0.736831724643707, 0.099040694534779},
{2.174952745437622, 0.741196334362030, 0.103999935090542},
{2.158872842788696, 0.745473921298981, 0.108987331390381},
{2.143069744110107, 0.749666452407837, 0.114001899957657},
{2.127536296844482, 0.753776252269745, 0.119042240083218},
{2.112266302108765, 0.757805168628693, 0.124107331037521},
{2.097253799438477, 0.761755228042603, 0.129196092486382},
{2.082492589950562, 0.765628278255463, 0.134307265281677},
{2.067977190017700, 0.769426047801971, 0.139439776539803},
{2.053702354431152, 0.773150265216827, 0.144592776894569},
{2.039661645889282, 0.776802897453308, 0.149764969944954},
{2.025850772857666, 0.780385375022888, 0.154955506324768},
{2.012264013290405, 0.783899486064911, 0.160163298249245},
{1.998896837234497, 0.787346661090851, 0.165387541055679},
{1.985743761062622, 0.790728628635406, 0.170627027750015},
{1.972800254821777, 0.794046819210052, 0.175881043076515},
{1.960062384605408, 0.797302544116974, 0.181148663163185},
{1.947524785995483, 0.800497353076935, 0.186428979039192},
{1.935183405876160, 0.803632676601410, 0.191721111536026},
{1.923034787178040, 0.806709587574005, 0.197024166584015},
{1.911073446273804, 0.809729814529419, 0.202337324619293},
{1.899296402931213, 0.812694251537323, 0.207660064101219},
{1.887699604034424, 0.815604269504547, 0.212991267442703},
{1.876278638839722, 0.818461239337921, 0.218330368399620},
{1.865030884742737, 0.821265995502472, 0.223676487803459},
{1.853951811790466, 0.824019908905029, 0.229029044508934},
{1.843038678169250, 0.826723933219910, 0.234387174248695},
{1.832287549972534, 0.829379320144653, 0.239750444889069},
{1.821695566177368, 0.831986904144287, 0.245118007063866},
{1.811258912086487, 0.834547936916351, 0.250489175319672},
{1.800974726676941, 0.837063372135162, 0.255863308906555},
{1.790840029716492, 0.839534103870392, 0.261240065097809},
{1.780852079391479, 0.841960966587067, 0.266618460416794},
{1.771007299423218, 0.844345211982727, 0.271998167037964},
{1.761303305625916, 0.846687555313110, 0.277378499507904},
{1.751737356185913, 0.848988771438599, 0.282759010791779},
{1.742306828498840, 0.851249814033508, 0.288138985633850},
{1.733008503913879, 0.853471636772156, 0.293518036603928},
{1.723840355873108, 0.855654895305634, 0.298895686864853},
{1.714800238609314, 0.857800304889679, 0.304271370172501},
{1.705884695053101, 0.859908878803253, 0.309644550085068},
{1.697092413902283, 0.861981093883514, 0.315014898777008},
{1.688419818878174, 0.864018142223358, 0.320381879806519},
{1.679865837097168, 0.866020262241364, 0.325744897127151},
{1.671427965164185, 0.867988288402557, 0.331103801727295},
{1.663103699684143, 0.869923055171967, 0.336457997560501},
{1.654891252517700, 0.871825039386749, 0.341807216405869},
{1.646788477897644, 0.873694956302643, 0.347150772809982},
{1.638793230056763, 0.875533521175385, 0.352488607168198},
{1.630903482437134, 0.877341389656067, 0.357820123434067},
{1.623117566108704, 0.879118978977203, 0.363145112991333},
{1.615433573722839, 0.880867004394531, 0.368463158607483},
{1.607849478721619, 0.882586002349854, 0.373773962259293},
{1.600364089012146, 0.884276509284973, 0.379077196121216},
{1.592974781990051, 0.885939180850983, 0.384372293949127},
{1.585680484771729, 0.887574493885040, 0.389659285545349},
{1.578479290008545, 0.889182925224304, 0.394937753677368},
{1.571369290351868, 0.890765190124512, 0.400207370519638},
{1.564349532127380, 0.892321527004242, 0.405467867851257},
{1.557418107986450, 0.893852591514587, 0.410718828439713},
{1.550573587417603, 0.895358681678772, 0.415960371494293},
{1.543814182281494, 0.896840572357178, 0.421191781759262},
{1.537138938903809, 0.898298442363739, 0.426413089036942},
{1.530545711517334, 0.899732947349548, 0.431623935699463},
{1.524033904075623, 0.901144325733185, 0.436824172735214},
{1.517602086067200, 0.902533113956451, 0.442013531923294},
{1.511248230934143, 0.903899729251862, 0.447191774845123},
{1.504971385002136, 0.905244648456573, 0.452358692884445},
{1.498770475387573, 0.906568109989166, 0.457514166831970},
{1.492643952369690, 0.907870650291443, 0.462657809257507},
{1.486590981483459, 0.909152567386627, 0.467789590358734},
{1.480609774589539, 0.910414278507233, 0.472909420728683},
{1.474699854850769, 0.911656081676483, 0.478016793727875},
{1.468859672546387, 0.912878453731537, 0.483111858367920},
{1.463087797164917, 0.914081752300262, 0.488194227218628},
{1.457384228706360, 0.915266036987305, 0.493263840675354},
{1.451746344566345, 0.916432082653046, 0.498320400714874},
{1.446174144744873, 0.917579889297485, 0.503364145755768},
{1.440666317939758, 0.918709933757782, 0.508394539356232},
{1.435221672058105, 0.919822514057159, 0.513411521911621},
{1.429839849472046, 0.920917809009552, 0.518415093421936},
{1.424519181251526, 0.921996235847473, 0.523405134677887},
{1.419258952140808, 0.923058152198792, 0.528381288051605},
{1.414058208465576, 0.924103736877441, 0.533343613147736},
{1.408916234970093, 0.925133287906647, 0.538291990756989},
{1.403831481933594, 0.926147222518921, 0.543226242065430},
{1.398804068565369, 0.927145540714264, 0.548146426677704},
{1.393832087516785, 0.928128838539124, 0.553052127361298},
{1.388915657997131, 0.929097056388855, 0.557943582534790},
{1.384053111076355, 0.930050730705261, 0.562820494174957},
{1.379244089126587, 0.930989921092987, 0.567683041095734},
{1.374488115310669, 0.931914865970612, 0.572530686855316},
{1.369783401489258, 0.932826042175293, 0.577363669872284},
{1.365130066871643, 0.933723449707031, 0.582181930541992},
{1.360527276992798, 0.934607267379761, 0.586985290050507},
{1.355973720550537, 0.935478031635284, 0.591773748397827},
{1.351469039916992, 0.936335742473602, 0.596547186374664},
{1.347012400627136, 0.937180697917938, 0.601305484771729},
{1.342603445053101, 0.938013017177582, 0.606048703193665},
{1.338241338729858, 0.938832879066467, 0.610776722431183},
{1.333925366401672, 0.939640641212463, 0.615489482879639},
{1.329654574394226, 0.940436422824860, 0.620186984539032},
{1.325428485870361, 0.941220521926880, 0.624869227409363},
{1.321246981620789, 0.941992878913879, 0.629536151885986},
{1.317108154296875, 0.942754149436951, 0.634187519550323},
{1.313013195991516, 0.943503916263580, 0.638823509216309},
{1.308959841728210, 0.944242835044861, 0.643444001674652},
{1.304948329925537, 0.944970965385437, 0.648048877716064},
{1.300978183746338, 0.945688307285309, 0.652638375759125},
{1.297047972679138, 0.946395337581635, 0.657212138175964},
{1.293158292770386, 0.947091937065125, 0.661770343780518},
{1.289307832717896, 0.947778403759003, 0.666312992572784},
{1.285496711730957, 0.948454797267914, 0.670839965343475},
{1.281723260879517, 0.949121534824371, 0.675351321697235},
{1.277987837791443, 0.949778556823730, 0.679846882820129},
{1.274289965629578, 0.950426042079926, 0.684326887130737},
{1.270628690719604, 0.951064169406891, 0.688791036605835},
{1.267003893852234, 0.951693058013916, 0.693239629268646},
{1.263414740562439, 0.952312946319580, 0.697672367095947},
{1.259861230850220, 0.952923774719238, 0.702089607715607},
{1.256342172622681, 0.953526020050049, 0.706490933895111},
{1.252857446670532, 0.954119563102722, 0.710876584053040},
{1.249407052993774, 0.954704582691193, 0.715246379375458},
{1.245989918708801, 0.955281257629395, 0.719600617885590},
{1.242605805397034, 0.955849707126617, 0.723939061164856},
{1.239254355430603, 0.956409990787506, 0.728261649608612},
{1.235935211181641, 0.956962287425995, 0.732568800449371},
{1.232647776603699, 0.957506716251373, 0.736860096454620},
{1.229391694068909, 0.958043456077576, 0.741135597229004},
{1.226166844367981, 0.958572447299957, 0.745395600795746},
{1.222972393035889, 0.959093987941742, 0.749639868736267},
{1.219807744026184, 0.959608256816864, 0.753868281841278},
{1.216673135757446, 0.960115194320679, 0.758081257343292},
{1.213567852973938, 0.960614979267120, 0.762278616428375},
{1.210491538047791, 0.961107730865479, 0.766460120677948},
{1.207444310188293, 0.961593389511108, 0.770626366138458},
{1.204424738883972, 0.962072372436523, 0.774776875972748},
{1.201433539390564, 0.962544560432434, 0.778911709785461},
{1.198469519615173, 0.963010191917419, 0.783031165599823},
{1.195533514022827, 0.963469088077545, 0.787135124206543},
{1.192623853683472, 0.963921666145325, 0.791223466396332},
{1.189740896224976, 0.964367866516113, 0.795296430587769},
{1.186884045600891, 0.964807927608490, 0.799353957176208},
{1.184053182601929, 0.965241730213165, 0.803396046161652},
{1.181247830390930, 0.965669572353363, 0.807422816753387},
{1.178467750549316, 0.966091394424438, 0.811434268951416},
{1.175712823867798, 0.966507315635681, 0.815430343151093},
{1.172982692718506, 0.966917395591736, 0.819411098957062},
{1.170276761054993, 0.967321813106537, 0.823376417160034},
{1.167594790458679, 0.967720687389374, 0.827326774597168},
{1.164936423301697, 0.968114018440247, 0.831261813640594},
{1.162301778793335, 0.968501865863800, 0.835181832313538},
{1.159690499305725, 0.968884229660034, 0.839086711406708},
{1.157102108001709, 0.969261407852173, 0.842976272106171},
{1.154536485671997, 0.969633281230927, 0.846850931644440},
{1.151992917060852, 0.970000088214874, 0.850710630416870},
{1.149471640586853, 0.970361828804016, 0.854555308818817},
{1.146972298622131, 0.970718562602997, 0.858385086059570},
{1.144494652748108, 0.971070289611816, 0.862199842929840},
{1.142037987709045, 0.971417367458344, 0.865999758243561},
{1.139602899551392, 0.971759438514709, 0.869784832000732},
{1.137188553810120, 0.972096860408783, 0.873555123806000},
{1.134794712066650, 0.972429692745209, 0.877310872077942},
{1.132421493530273, 0.972757875919342, 0.881051778793335},
{1.130067944526672, 0.973081648349762, 0.884777843952179},
{1.127734661102295, 0.973400950431824, 0.888489544391632},
{1.125420808792114, 0.973715841770172, 0.892186582088470},
{1.123126864433289, 0.974026381969452, 0.895869076251984},
{1.120851874351501, 0.974332690238953, 0.899537205696106},
{1.118595838546753, 0.974634826183319, 0.903190553188324},
{1.116358876228333, 0.974932730197906, 0.906829833984375},
{1.114140152931213, 0.975226700305939, 0.910454571247101},
{1.111939907073975, 0.975516617298126, 0.914064943790436},
{1.109758019447327, 0.975802481174469, 0.917661309242249},
{1.107594132423401, 0.976084470748901, 0.921243369579315},
{1.105447888374329, 0.976362586021423, 0.924811065196991},
{1.103319168090820, 0.976636946201324, 0.928364753723145},
{1.101208209991455, 0.976907491683960, 0.931904435157776},
{1.099113702774048, 0.977174460887909, 0.935429990291595},
{1.097036838531494, 0.977437674999237, 0.938941597938538},
{1.094976425170898, 0.977697372436523, 0.942439198493958},
{1.092932939529419, 0.977953493595123, 0.945922911167145},
{1.090905427932739, 0.978206217288971, 0.949392855167389},
{1.088894486427307, 0.978455424308777, 0.952848851680756},
{1.086899876594543, 0.978701114654541, 0.956291317939758},
{1.084920644760132, 0.978943645954132, 0.959720015525818},
{1.082957744598389, 0.979182720184326, 0.963135004043579},
{1.081009864807129, 0.979418694972992, 0.966536343097687},
{1.079077482223511, 0.979651451110840, 0.969924092292786},
{1.077160596847534, 0.979880928993225, 0.973298370838165},
{1.075258612632751, 0.980107307434082, 0.976659297943115},
{1.073371648788452, 0.980330646038055, 0.980006754398346},
{1.071499586105347, 0.980550825595856, 0.983340799808502},
{1.069641590118408, 0.980768203735352, 0.986661732196808},
{1.067798376083374, 0.980982482433319, 0.989969193935394},
{1.065969586372375, 0.981193840503693, 0.993263661861420},
{1.064154863357544, 0.981402337551117, 0.996544659137726},
{1.062353730201721, 0.981608152389526, 0.999812722206116},
{1.060566782951355, 0.981811046600342, 1.003067970275879},
{1.058793783187866, 0.982011079788208, 1.006309747695923},
{1.057034254074097, 0.982208490371704, 1.009538769721985},
{1.055287957191467, 0.982403218746185, 1.012754917144775},
{1.053554892539978, 0.982595264911652, 1.015958189964294},
{1.051834940910339, 0.982784748077393, 1.019148588180542},
{1.050127744674683, 0.982971727848053, 1.022326231002808},
{1.048433899879456, 0.983156025409698, 1.025491237640381},
{1.046752452850342, 0.983337879180908, 1.028643608093262},
{1.045083761215210, 0.983517289161682, 1.031783342361450},
{1.043427705764771, 0.983694136142731, 1.034910559654236},
{1.041784048080444, 0.983868539333344, 1.038025259971619},
{1.040152311325073, 0.984040737152100, 1.041127443313599},
{1.038532853126526, 0.984210491180420, 1.044217228889465},
{1.036925196647644, 0.984377980232239, 1.047294616699219},
{1.035329580307007, 0.984543144702911, 1.050359725952148},
{1.033745884895325, 0.984705984592438, 1.053412795066833},
{1.032173275947571, 0.984866738319397, 1.056453466415405},
{1.030612468719482, 0.985025227069855, 1.059481978416443},
{1.029063105583191, 0.985181570053101, 1.062498450279236},
{1.027524828910828, 0.985335826873779, 1.065502882003784},
{1.025997996330261, 0.985487818717957, 1.068495154380798},
{1.024481892585754, 0.985637903213501, 1.071475505828857},
{1.022977113723755, 0.985785841941833, 1.074444055557251},
{1.021482825279236, 0.985931813716888, 1.077400803565979},
{1.019999623298645, 0.986075639724731, 1.080345749855042},
{1.018526792526245, 0.986217617988586, 1.083279013633728},
{1.017064571380615, 0.986357629299164, 1.086200475692749},
{1.015612721443176, 0.986495673656464, 1.089110136032104},
{1.014171242713928, 0.986631870269775, 1.092008352279663},
{1.012739896774292, 0.986766219139099, 1.094895005226135},
{1.011318802833557, 0.986898660659790, 1.097770094871521},
{1.009907722473145, 0.987029254436493, 1.100633859634399},
{1.008506536483765, 0.987158060073853, 1.103486180305481},
{1.007115006446838, 0.987285137176514, 1.106327176094055},
{1.005733489990234, 0.987410426139832, 1.109156847000122},
{1.004361510276794, 0.987533986568451, 1.111975073814392},
{1.002998828887939, 0.987655878067017, 1.114782214164734},
{1.001645803451538, 0.987776100635529, 1.117578387260437},
{1.000302076339722, 0.987894654273987, 1.120363116264343},
{0.998967826366425, 0.988011479377747, 1.123137116432190},
{0.997642576694489, 0.988126754760742, 1.125899910926819},
{0.996326565742493, 0.988240361213684, 1.128651738166809},
{0.995019733905792, 0.988352417945862, 1.131392478942871},
{0.993721723556519, 0.988462865352631, 1.134122729301453},
{0.992432057857513, 0.988572001457214, 1.136841893196106},
{0.991151869297028, 0.988679349422455, 1.139550447463989},
{0.989880084991455, 0.988785266876221, 1.142248153686523},
{0.988616764545441, 0.988889753818512, 1.144935369491577},
{0.987362325191498, 0.988992691040039, 1.147611618041992},
{0.986115872859955, 0.989094316959381, 1.150277614593506},
{0.984878301620483, 0.989194393157959, 1.152933001518250},
{0.983648777008057, 0.989293098449707, 1.155577898025513},
{0.982427418231964, 0.989390432834625, 1.158212423324585},
{0.981214284896851, 0.989486396312714, 1.160836338996887},
{0.980009019374847, 0.989581048488617, 1.163450002670288},
{0.978812098503113, 0.989674210548401, 1.166053414344788},
{0.977622807025909, 0.989766180515289, 1.168646454811096},
{0.976441740989685, 0.989856779575348, 1.171229600906372},
{0.975268185138702, 0.989946067333221, 1.173802375793457},
{0.974102079868317, 0.990034282207489, 1.176364898681641},
{0.972944200038910, 0.990121006965637, 1.178917407989502},
{0.971793532371521, 0.990206599235535, 1.181460022926331},
{0.970650196075439, 0.990290999412537, 1.183992624282837},
{0.969514727592468, 0.990374028682709, 1.186515450477600},
{0.968386352062225, 0.990456044673920, 1.189028024673462},
{0.967265307903290, 0.990536808967590, 1.191530942916870},
{0.966151714324951, 0.990616381168365, 1.194024205207825},
{0.965044915676117, 0.990694880485535, 1.196507573127747},
{0.963945746421814, 0.990772068500519, 1.198981404304504},
{0.962853491306305, 0.990848302841187, 1.201445221900940},
{0.961767673492432, 0.990923464298248, 1.203899741172791},
{0.960689663887024, 0.990997314453125, 1.206344485282898},
{0.959617972373962, 0.991070270538330, 1.208779811859131},
{0.958553135395050, 0.991142094135284, 1.211205601692200},
{0.957494974136353, 0.991212904453278, 1.213621854782104},
{0.956443488597870, 0.991282701492310, 1.216028928756714},
{0.955398559570312, 0.991351485252380, 1.218426585197449},
{0.954360365867615, 0.991419196128845, 1.220814824104309},
{0.953328728675842, 0.991485893726349, 1.223193883895874},
{0.952303349971771, 0.991551637649536, 1.225563645362854},
{0.951284825801849, 0.991616308689117, 1.227924346923828},
{0.950272321701050, 0.991680085659027, 1.230275988578796},
{0.949266076087952, 0.991742968559265, 1.232617974281311},
{0.948266208171844, 0.991804838180542, 1.234951615333557},
{0.947272419929504, 0.991865754127502, 1.237275958061218},
{0.946284711360931, 0.991925835609436, 1.239591002464294},
{0.945303261280060, 0.991984963417053, 1.241897463798523},
{0.944327831268311, 0.992043197154999, 1.244194865226746},
{0.943358182907104, 0.992100536823273, 1.246483683586121},
{0.942394614219666, 0.992157042026520, 1.248763442039490},
{0.941436886787415, 0.992212653160095, 1.251034379005432},
{0.940485358238220, 0.992267310619354, 1.253296852111816},
{0.939539134502411, 0.992321252822876, 1.255550503730774},
{0.938598811626434, 0.992374300956726, 1.257795691490173},
{0.937663972377777, 0.992426633834839, 1.260031819343567},
{0.936734676361084, 0.992478132247925, 1.262259840965271},
{0.935811281204224, 0.992528796195984, 1.264479160308838},
{0.934893488883972, 0.992578625679016, 1.266689896583557},
{0.933981180191040, 0.992627680301666, 1.268892288208008},
{0.933074235916138, 0.992675960063934, 1.271086215972900},
{0.932172596454620, 0.992723524570465, 1.273272037506104},
{0.931276321411133, 0.992770373821259, 1.275449275970459},
{0.930385291576385, 0.992816388607025, 1.277618408203125},
{0.929499924182892, 0.992861688137054, 1.279778957366943},
{0.928619384765625, 0.992906272411346, 1.281931281089783},
{0.927744388580322, 0.992950081825256, 1.284075736999512},
{0.926874101161957, 0.992993295192719, 1.286212086677551},
{0.926009297370911, 0.993035733699799, 1.288340210914612},
{0.925149500370026, 0.993077456951141, 1.290460109710693},
{0.924294412136078, 0.993118643760681, 1.292572259902954},
{0.923444747924805, 0.993158996105194, 1.294676065444946},
{0.922599673271179, 0.993198752403259, 1.296772241592407},
{0.921759903430939, 0.993237733840942, 1.298860549926758},
{0.920924305915833, 0.993276298046112, 1.300940632820129},
{0.920094072818756, 0.993314027786255, 1.303013324737549},
{0.919268488883972, 0.993351161479950, 1.305078029632568},
{0.918447852134705, 0.993387699127197, 1.307134747505188},
{0.917631745338440, 0.993423581123352, 1.309184074401855},
{0.916820228099823, 0.993458867073059, 1.311225533485413},
{0.916013658046722, 0.993493497371674, 1.313259124755859},
{0.915211200714111, 0.993527650833130, 1.315285563468933},
{0.914413869380951, 0.993561029434204, 1.317304134368896},
{0.913620471954346, 0.993594050407410, 1.319315075874329},
{0.912831783294678, 0.993626415729523, 1.321318626403809},
{0.912047684192657, 0.993658125400543, 1.323314785957336},
{0.911267936229706, 0.993689298629761, 1.325303435325623},
{0.910492300987244, 0.993720054626465, 1.327284574508667},
{0.909721553325653, 0.993750095367432, 1.329258322715759},
{0.908954679965973, 0.993779659271240, 1.331225037574768},
{0.908192515373230, 0.993808567523956, 1.333184242248535},
{0.907434225082397, 0.993837118148804, 1.335136175155640},
{0.906680285930634, 0.993865072727203, 1.337080717086792},
{0.905930697917938, 0.993892490863800, 1.339018225669861},
{0.905184745788574, 0.993919491767883, 1.340948581695557},
{0.904443442821503, 0.993945896625519, 1.342871785163879},
{0.903706073760986, 0.993971765041351, 1.344787836074829},
{0.902972936630249, 0.993997156620026, 1.346696734428406},
{0.902243435382843, 0.994022190570831, 1.348598718643188},
{0.901518285274506, 0.994046568870544, 1.350493788719177},
{0.900797009468079, 0.994070529937744, 1.352381706237793},
{0.900079429149628, 0.994094133377075, 1.354262948036194},
{0.899365842342377, 0.994117200374603, 1.356136918067932},
{0.898656547069550, 0.994139671325684, 1.358004331588745},
{0.897950589656830, 0.994161903858185, 1.359864711761475},
{0.897248685359955, 0.994183540344238, 1.361718297004700},
{0.896550476551056, 0.994204819202423, 1.363565087318420},
{0.895856142044067, 0.994225561618805, 1.365405321121216},
{0.895165264606476, 0.994246065616608, 1.367238640785217},
{0.894478499889374, 0.994265913963318, 1.369065284729004},
{0.893795192241669, 0.994285464286804, 1.370885372161865},
{0.893115460872650, 0.994304597377777, 1.372698783874512},
{0.892439246177673, 0.994323372840881, 1.374505519866943},
{0.891766726970673, 0.994341671466827, 1.376305937767029},
{0.891097843647003, 0.994359552860260, 1.378099679946899},
{0.890432536602020, 0.994377076625824, 1.379886627197266},
{0.889770805835724, 0.994394123554230, 1.381667613983154},
{0.889112472534180, 0.994410872459412, 1.383441925048828},
{0.888457715511322, 0.994427204132080, 1.385209560394287},
{0.887806475162506, 0.994443058967590, 1.386971354484558},
{0.887158155441284, 0.994458794593811, 1.388726353645325},
{0.886513769626617, 0.994473874568939, 1.390475630760193},
{0.885872423648834, 0.994488775730133, 1.392217874526978},
{0.885234475135803, 0.994503259658813, 1.393954157829285},
{0.884600043296814, 0.994517326354980, 1.395684242248535},
{0.883968591690063, 0.994531154632568, 1.397408246994019},
{0.883340775966644, 0.994544506072998, 1.399125814437866},
{0.882715880870819, 0.994557619094849, 1.400837421417236},
{0.882094323635101, 0.994570374488831, 1.402542710304260},
{0.881475925445557, 0.994582772254944, 1.404242277145386},
{0.880860924720764, 0.994594812393188, 1.405935287475586},
{0.880248844623566, 0.994606554508209, 1.407622694969177},
{0.879639863967896, 0.994617998600006, 1.409303784370422},
{0.879034101963043, 0.994629085063934, 1.410979270935059},
{0.878431618213654, 0.994639813899994, 1.412648320198059},
{0.877831876277924, 0.994650304317474, 1.414311885833740},
{0.877235114574432, 0.994660496711731, 1.415969252586365},
{0.876641631126404, 0.994670331478119, 1.417620778083801},
{0.876050949096680, 0.994679868221283, 1.419266819953918},
{0.875463366508484, 0.994689106941223, 1.420906782150269},
{0.874878764152527, 0.994698047637939, 1.422540664672852},
{0.874297082424164, 0.994706690311432, 1.424169301986694},
{0.873718082904816, 0.994715154170990, 1.425791859626770},
{0.873142361640930, 0.994723200798035, 1.427408695220947},
{0.872569084167480, 0.994731068611145, 1.429019927978516},
{0.871999025344849, 0.994738578796387, 1.430625677108765},
{0.871431589126587, 0.994745850563049, 1.432225704193115},
{0.870867073535919, 0.994752824306488, 1.433819890022278},
{0.870305538177490, 0.994759500026703, 1.435408711433411},
{0.869746387004852, 0.994765996932983, 1.436992168426514},
{0.869190096855164, 0.994772195816040, 1.438569784164429},
{0.868636608123779, 0.994778156280518, 1.440142035484314},
{0.868086099624634, 0.994783759117126, 1.441708683967590},
{0.867537677288055, 0.994789302349091, 1.443270087242126},
{0.866992354393005, 0.994794487953186, 1.444825768470764},
{0.866450011730194, 0.994799256324768, 1.446376323699951},
{0.865909874439240, 0.994803965091705, 1.447921395301819},
{0.865372538566589, 0.994808435440063, 1.449460983276367},
{0.864837646484375, 0.994812667369843, 1.450995445251465},
{0.864305377006531, 0.994816601276398, 1.452524662017822},
{0.863775730133057, 0.994820356369019, 1.454048395156860},
{0.863248765468597, 0.994823873043060, 1.455566763877869},
{0.862723767757416, 0.994827270507812, 1.457080125808716},
{0.862202107906342, 0.994830191135406, 1.458588123321533},
{0.861682593822479, 0.994832992553711, 1.460091233253479},
{0.861165225505829, 0.994835734367371, 1.461588859558105},