add commandline

parent 3fcc7dd9
coloritto: *.c
coloritto: *.c argvs-commands.inc *.h Makefile
gcc *.c -o coloritto -lm `pkg-config mrg babl --cflags --libs` -Wall -Wno-unused-but-set-variable -g
clean:
rm coloritto
rm -f coloritto argvs-commands.inc
argvs-commands.inc: *.c Makefile
@echo " GEN" $@
@./argvs_extract.sh *.c > argvs-commands.inc
color/pigment management named after J.C. le Blon an early
inventor/experimentor with 4 color process, of what fundamentally Cyan Magenta
Yellow Key / Blue Yellow Red Key among other books in his coloritto
from 1426, an alternate name from leblon can be coloritto.
spectral color imaging workbench
it is a color inventory the records and spatiallly visualises known colors in
3d, it is designed to foremost work with spectral colors and also provides
tools for separating to arbitrary substrate + color combination.
Coloritto is a spectral color / pigment cataloging and experiment toolbox and
workbench, named after J.C. le Blon's 1725 book Coloritto an early painters
color mixing guide based on good interpretations of newton's discovery of the
spectral nature of light - this color centric work separated as a 4 color print
process in Blue, Yellow, Red, and Black.
It consumes colors from cxf files and other file formats, re-using python code
from swatchbooker and integrating with zn from python.
It permits separating color images to custom spot-color print plates, as well
as soft-proofing such seperations. It reads and writes a significant
unstructured subset of ISO import and a more limited export so currently
without round-trip data completeness.
it permits exporting sets as searched for by tags and then to export
CxF-4 sets as cxf files.
a 3d rendered color swatch explorer with varying size for quality of
measurement from just coordinates through spectral single samples through
spectral opacity measurements with export to CxF-4.
It permits reading and writing ISO .... files with spectral data. Each file
should appear as a collection, and be selectable. In addition to being a
user-interface directly coupled with the C data-structures a small library for
integration with other software is provided.
persist-selection
With set of items selected it should be possible to store as a new
collection, good path to be determined, need a name when persisting selection;
thus the "button" for adding a selection should be the selection - with a help
- message that gets less verbose with contents of selection, guiding
interaction.
permit picking arbitrary colors in arbitrary color spaces and falling back to
own internal colors which should have a core interpolation set that kind of
works replaced with freie-farbe interpolation with same api for wide coverage -
also directly included with sources. And selectable as an internal collection.
make-collection-selection
With a collection selected - it should be possible to select edit-collection and
end up with all individual items of collection becoming current item-selection, and meta-data about what is currently edited stored in context.
Edit meta-data per item in palette, like strength, input - gegl-op-chain, output gegl-op-chain,
check results with wolfram alpha
chain functionality depending on linking with gegl, which can be optional.
Integrate knowledge of freie-farbe, so that spectra can be provided for
in-gamut and perhaps even out of gamut extrapolated spectra based on the
freie-farbe dataset.
With a current palette of even just one, and a picture selected - do
separtation of picture on to a white substrate as filter - thus having the
lowest possible threshold for enabling creation of custom separations - stop
doing this with > 8 coats.
sets of CxF files including CxF-4 from ISO and
cataloging/viewing colors in 2d planes, 3d - and with grid views.
Do hash over struct, with versioning - use hashes as unique ids across files,
investigate if some of the attributes used as seen in some files already
practically are that in cxf specs.
......@@ -34,12 +34,21 @@
rgb + chromaticities
srgb
draw spectrum of selected sample
load icc profile for display
load an image
a color alchymist studio
make a palette
similar to make a print setup
spatial positions of palettes are as a tile dock or stack
the contents of a white + black ramp should be explorable as a collection
an indexed of spectral samples or materials to impact a surface with,
on CIE Lab / Lch providing access to spectral defintions of an ink or
paints impact as well as per wavelength opacity.
......@@ -54,7 +63,10 @@
also permit to build additive models
*/
/* For coloritto structs that are multiple coloritto entries, the first
* entry of the collectino is concsidered representative, thus the white
* ramp is sorted from 100% and down.
*/
struct
_Coloritto {
......@@ -87,9 +99,10 @@ _Coloritto {
#define COLORITTO_MAX_COATS 8
/* this should be shared with coloritto used as list/palette */
Coloritto *coats[COLORITTO_MAX_COATS];
float coat_strength[COLORITTO_MAX_COATS];
int n_coats;
float coat_strength[COLORITTO_MAX_COATS];
int n_coats;
// beware that copy by value works as long as the original
// color is not freed - this caveat only applies to the key/value pairs
......@@ -130,7 +143,6 @@ void coloritto_set_n_coats (Coloritto *color, int coats)
color->n_coats = coats;
}
Luz *luz = NULL;
void
......@@ -197,6 +209,14 @@ coloritto_set (Luz *luz, Coloritto *color, ColorittoDef color_type,
}
}
int coloritto_is_set (Coloritto *color,
ColorittoDef color_type)
{
if (color->set & color_type)
return 1;
return 0;
}
void coloritto_ensure (Luz *luz, Coloritto *color, ColorittoDef color_type)
{
int got_xyz = 0;
......@@ -222,7 +242,7 @@ void coloritto_ensure (Luz *luz, Coloritto *color, ColorittoDef color_type)
}
if (!got_xyz && (color->set & COLORITTO_LCH))
{
babl_process (babl_fish (babl_format ("CIE Lch float"),
babl_process (babl_fish (babl_format ("CIE LCH(ab) float"),
babl_format ("CIE XYZ float")),
color->lch, color->xyz, 1);
color->computed |= COLORITTO_XYZ;
......@@ -271,7 +291,15 @@ void coloritto_ensure (Luz *luz, Coloritto *color, ColorittoDef color_type)
{
case COLORITTO_COATS: // TODO
break;
case COLORITTO_xyY: /* wont happen */
case COLORITTO_xyY:
{
float sum = color->xyz[0] + color->xyz[1] + color->xyz[2];
color->xyY[0]= color->xyz[0] / sum;
color->xyY[1]= color->xyz[1] / sum;
color->xyY[2]= color->xyz[2] / sum;
}
break;
babl_process (babl_fish (babl_format ("CIE XYZ float"),
babl_format ("CIE xyY float")),
color->xyz, color->xyY, 1);
......@@ -284,25 +312,25 @@ void coloritto_ensure (Luz *luz, Coloritto *color, ColorittoDef color_type)
color->computed |= color_type;
break;
case COLORITTO_LAB: /* wont happen */
case COLORITTO_LAB:
babl_process (babl_fish (babl_format ("CIE XYZ float"),
babl_format ("CIE Lab float")),
color->xyz, color->lab, 1);
color->computed |= color_type;
break;
case COLORITTO_LCH: /* wont happen */
case COLORITTO_LCH:
babl_process (babl_fish (babl_format ("CIE XYZ float"),
babl_format ("CIE Lch float")),
babl_format ("CIE LCH(ab) float")),
color->xyz, color->lch, 1);
color->computed |= color_type;
break;
case COLORITTO_RGB: /* wont happen */
case COLORITTO_RGB:
babl_process (babl_fish (babl_format ("CIE XYZ float"),
babl_format ("RGB float")),
color->xyz, color->rgb, 1);
color->computed |= color_type;
break;
case COLORITTO_SRGB: /* wont happen */
case COLORITTO_SRGB:
babl_process (babl_fish (babl_format ("CIE XYZ float"),
babl_format ("R'G'B' float")),
color->xyz, color->srgb, 1);
......@@ -312,6 +340,10 @@ void coloritto_ensure (Luz *luz, Coloritto *color, ColorittoDef color_type)
break;
case COLORITTO_SPECTRUM_ON_WHITE:
/* should interpolate among known spectrums, the freie farbe set
is probably a good one, that way we generate plausible spectrums
for all values */
break;
case COLORITTO_SPECTRUM_ON_WHITE_RAMP:
case COLORITTO_SPECTRUM_ON_WHITE_AND_BLACK:
case COLORITTO_SPECTRUM_ON_WHITE_AND_BLACK_RAMP:
......@@ -364,6 +396,7 @@ coloritto_get (Luz *luz, Coloritto *color, ColorittoDef color_type,
break;
case COLORITTO_SPECTRUM_ON_WHITE:
/* just read it out */
case COLORITTO_SPECTRUM_ON_WHITE_RAMP:
case COLORITTO_SPECTRUM_ON_WHITE_AND_BLACK:
case COLORITTO_SPECTRUM_ON_WHITE_AND_BLACK_RAMP:
......@@ -384,9 +417,10 @@ ColorLemma {
} ColorLemma;
MrgList *items = NULL;
char *commandline = NULL;
#define SCALEX 300.0
#define SCALEY 300.0
#define SCALEX 600.0
#define SCALEY 600.0
Coloritto *coloritto_new (void)
{
......@@ -431,6 +465,10 @@ const char *coloritto_get_name (Coloritto *color)
return coloritto_get_key (color, "name");
}
#include "argvs.h"
static Mrg *mrg;
static Coloritto * add_item (
Luz *luz,
ColorittoDef color_type,
......@@ -444,6 +482,25 @@ static Coloritto * add_item (
return &item->color;
}
int cmd_locus (COMMAND_ARGS) /* "locus", 0, "[command]", "exit" */
{
float xyz[3];
const Spectrum *xs = luz_get_spectrum (luz, "observer_x");
const Spectrum *ys = luz_get_spectrum (luz, "observer_y");
const Spectrum *zs = luz_get_spectrum (luz, "observer_z");
int i;
for (i = 0; i < LUZ_SPECTRUM_BANDS; i ++)
{
xyz[0] = xs->bands[i];
xyz[1] = ys->bands[i];
xyz[2] = zs->bands[i];
add_item (luz, COLORITTO_XYZ, &xyz[0], 0.01);
}
mrg_queue_draw (mrg, NULL);
return 0;
}
static void add_items ()
{
//float lab[3];
......@@ -454,18 +511,7 @@ static void add_items ()
for (rgb[1] = 0.0; rgb[1] <= 1.0; rgb[1] += 0.1)
for (rgb[2] = 0.0; rgb[2] <= 1.0; rgb[2] += 0.1)
{
add_item (COLORITTO_RGB, &rgb[0], 0.01);
}
#endif
#if 0
float xyz[3];
for (xyz[0] = 0.0; xyz[0] <= 1.0; xyz[0] += 0.1)
for (xyz[1] = 0.0; xyz[1] <= 1.0; xyz[1] += 0.1)
for (xyz[2] = 0.0; xyz[2] <= 1.0; xyz[2] += 0.1)
{
add_item (COLORITTO_XYZ, &xyz[0], 0.01);
add_item (luz, COLORITTO_RGB, &rgb[0], 0.01);
}
#endif
......@@ -498,6 +544,41 @@ static void add_items ()
#endif
}
Coloritto *current = NULL;
static MrgList *palette = NULL;
static int projection_model = COLORITTO_xyY;
int cmd_lab (COMMAND_ARGS) /* "lab", 0, "[command]", "exit" */
{
projection_model = COLORITTO_LAB;
mrg_queue_draw (mrg, NULL);
return 0;
}
int cmd_xyY (COMMAND_ARGS) /* "xyY", 0, "[command]", "exit" */
{
projection_model = COLORITTO_xyY;
mrg_queue_draw (mrg, NULL);
return 0;
}
int cmd_xyz (COMMAND_ARGS) /* "xyz", 0, "[command]", "exit" */
{
projection_model = COLORITTO_XYZ;
mrg_queue_draw (mrg, NULL);
return 0;
}
int cmd_rgb (COMMAND_ARGS) /* "rgb", 0, "[command]", "exit" */
{
projection_model = COLORITTO_SRGB;
mrg_queue_draw (mrg, NULL);
return 0;
}
static void update_projection ()
{
/* here 3d projection and rotation can be incorporated */
......@@ -505,16 +586,114 @@ static void update_projection ()
for (MrgList *l = items; l; l = l->next)
{
ColorLemma *item = l->data;
coloritto_ensure (luz, &item->color, COLORITTO_LAB);
coloritto_ensure (luz, &item->color, COLORITTO_RGB);
coloritto_ensure (luz, &item->color, COLORITTO_SRGB);
//item->sx = item->color.lab[1]/SCALEX+0.5 + item->color.lab[0] / SCALEX;
//item->sy = item->color.lab[2]/SCALEY+0.5 - item->color.lab[0] / SCALEY;
item->sx = item->color.lab[1]/SCALEX+0.5;
item->sy = item->color.lab[2]/SCALEY+0.5;
switch (projection_model)
{
case COLORITTO_xyY:
coloritto_ensure (luz, &item->color, COLORITTO_xyY);
item->sx = item->color.xyY[0];
item->sy = 1.0-item->color.xyY[1];
break;
case COLORITTO_LAB:
coloritto_ensure (luz, &item->color, COLORITTO_LAB);
item->sx = item->color.lab[1]/SCALEX+0.5;
item->sy = item->color.lab[2]/SCALEY+0.5;
break;
case COLORITTO_SRGB:
coloritto_ensure (luz, &item->color, COLORITTO_SRGB);
#define SRGB_SCALE 4.0
item->sx = (item->color.srgb[0] - 0.5) / SRGB_SCALE + 0.5;
item->sy = (item->color.srgb[1] - 0.5) / SRGB_SCALE + 0.5;
break;
case COLORITTO_XYZ:
coloritto_ensure (luz, &item->color, COLORITTO_XYZ);
#define SRGB_SCALE 4.0
item->sx = (item->color.xyz[0] - 0.5) / SRGB_SCALE + 0.5;
item->sy = (item->color.xyz[1] - 0.5) / SRGB_SCALE + 0.5;
break;
}
}
}
static void select_item_cb (MrgEvent *event, void *data1, void *data2) {
if (current == data1)
{
mrg_list_append (&palette, current);
}
current = data1;
mrg_event_stop_propagate (event);
}
static void block_return (MrgEvent *event, void *data1, void *data2) {
argvs_eval (commandline);
free (commandline);
commandline = strdup ("");
mrg_event_stop_propagate (event);
mrg_queue_draw (event->mrg, NULL);
}
static void up (MrgEvent *event, void *data1, void *data2) {
for (MrgList *a = items; a && a->next; a = a->next)
{
ColorLemma *iteml = a->data;
ColorLemma *niteml = a->next->data;
Coloritto *item = &iteml->color;
Coloritto *nitem = &niteml->color;
if (nitem == current)
{
current = item;
mrg_event_stop_propagate (event);
mrg_queue_draw (event->mrg, NULL);
return;
}
}
mrg_event_stop_propagate (event);
mrg_queue_draw (event->mrg, NULL);
}
static void down (MrgEvent *event, void *data1, void *data2) {
for (MrgList *a = items; a && a->next; a = a->next)
{
ColorLemma *iteml = a->data;
ColorLemma *niteml = a->next->data;
Coloritto *item = &iteml->color;
Coloritto *nitem = &niteml->color;
if (item == current)
{
current = nitem;
mrg_event_stop_propagate (event);
mrg_queue_draw (event->mrg, NULL);
return;
}
}
mrg_event_stop_propagate (event);
mrg_queue_draw (event->mrg, NULL);
}
void select_none (void)
{
}
void make_collection_selection (void)
{
}
void save_selection (void)
{
}
static void draw_items (Mrg *mrg, float w, float h)
{
cairo_t *cr = mrg_cr (mrg);
......@@ -522,13 +701,39 @@ static void draw_items (Mrg *mrg, float w, float h)
for (MrgList *l = items; l; l = l->next)
{
ColorLemma *lemma = l->data;
Coloritto *color = &lemma->color;
cairo_arc (cr, lemma->sx * h + (w - h) / 2, lemma->sy * h,
lemma->radius * h, 0.0, M_PI * 2);
cairo_set_source_rgb (cr, lemma->color.rgb[0], lemma->color.rgb[1], lemma->color.rgb[2]);
cairo_set_source_rgb (cr, color->srgb[0], color->srgb[1], color->srgb[2]);
mrg_listen (mrg, MRG_PRESS, select_item_cb, color, NULL);
cairo_fill (cr);
}
}
int draw_palette (Mrg *mrg, float w, float h)
{
if (palette)
{
return 1;
}
return 0;
}
int draw_selected_palette (Mrg *mrg, float w, float h)
{
return 0;
}
static void update_string (const char *new_string, void *user_data)
{
char **string_loc = user_data;
free (*string_loc);
*string_loc = strdup (new_string);
}
static void ui (Mrg *mrg, void *data)
{
float w = mrg_width (mrg);
......@@ -538,12 +743,16 @@ static void ui (Mrg *mrg, void *data)
cairo_paint (cr); /* todo: use a form of structured noise here */
for (MrgList *l = items; l; l = l->next)
if (0) for (MrgList *l = items; l; l = l->next)
{
ColorLemma *lemma = l->data;
if (lemma->radius > 0.003)
{
if (&lemma->color == current)
mrg_printf (mrg, "[");
mrg_printf (mrg, "%s", coloritto_get_name (&lemma->color));
if (&lemma->color == current)
mrg_printf (mrg, "]");
mrg_printf (mrg, " ");
}
}
......@@ -551,6 +760,72 @@ static void ui (Mrg *mrg, void *data)
update_projection ();
draw_items (mrg, w, h);
if (!draw_palette (mrg, w, h))
{
draw_selected_palette (mrg, w, h);
}
mrg_printf (mrg, "> ");
mrg_edit_start (mrg, update_string, &commandline);
mrg_printf (mrg, "%s", commandline);
mrg_edit_end (mrg);
if (current)
{
mrg_printf (mrg, "\n\n%s\n\n", coloritto_get_name (current));
{
float triplet[3];
coloritto_get (luz, current, COLORITTO_LAB, triplet);
mrg_printf (mrg, "CIE Lab %.2f %.2f %.2f %s\n",
triplet[0], triplet[1], triplet[2], coloritto_is_set (current, COLORITTO_LAB)?"(SET)":"");
}
{
float triplet[3];
coloritto_get (luz, current, COLORITTO_LCH, triplet);
mrg_printf (mrg, "CIE LCH %.2f %.2f %.2f %s\n",
triplet[0], triplet[1], triplet[2], coloritto_is_set (current, COLORITTO_LCH)?"(SET)":"");
}
{
float triplet[3];
coloritto_get (luz, current, COLORITTO_XYZ, triplet);
mrg_printf (mrg, "CIE XYZ %.2f %.2f %.2f %s\n",
triplet[0], triplet[1], triplet[2], coloritto_is_set (current, COLORITTO_XYZ)?"(SET)":"");
}
{
float triplet[3];
coloritto_get (luz, current, COLORITTO_xyY, triplet);
mrg_printf (mrg, "CIE xyY %.2f %.2f %.2f %s\n",
triplet[0], triplet[1], triplet[2], coloritto_is_set (current, COLORITTO_xyY)?"(SET)":"");
}
{
float triplet[3];
coloritto_get (luz, current, COLORITTO_SRGB, triplet);
mrg_printf (mrg, "SRGB %.2f %.2f %.2f %s\n",
triplet[0] * 255, triplet[1] * 255, triplet[2] * 255, coloritto_is_set (current, COLORITTO_SRGB)?"(SET)":"");
}
{
float triplet[3];
coloritto_get (luz, current, COLORITTO_RGB, triplet);
mrg_printf (mrg, "RGB %.2f %.2f %.2f %s\n",
triplet[0], triplet[1], triplet[2], coloritto_is_set (current, COLORITTO_RGB)?"(SET)":"");
}
}
mrg_add_binding (mrg, "return", NULL, NULL, block_return, NULL);
mrg_add_binding (mrg, "up", NULL, NULL, up, NULL);
mrg_add_binding (mrg, "down", NULL, NULL, down, NULL);
mrg_add_binding (mrg, "control-q", NULL, NULL, mrg_quit_cb, NULL);
}
......@@ -765,8 +1040,9 @@ int load_cxf (Luz *luz, char *path)
luz_string_append_printf (str, "%f %f 1 %s", start_wl, increment, reflectance_spectrum->str);
spec = luz_parse_spectrum (luz, str->str);
luz_string_free (str, 1);
coloritto_set_name (add_item (luz, COLORITTO_SPECTRUM_ON_WHITE, (void*)&spec, 0.008),
colorname->str);
Coloritto *color = add_item (luz, COLORITTO_SPECTRUM_ON_WHITE, (void*)&spec, 0.008);
coloritto_set_name (color, colorname->str);
}
if (has_suffix (data, ":ReflectanceSpectrum"))
......@@ -776,29 +1052,37 @@ int load_cxf (Luz *luz, char *path)
luz_string_append_printf (str, "%f %f 1 %s", start_wl, increment, reflectance_spectrum->str);
spec = luz_parse_spectrum (luz, str->str);
luz_string_free (str, 1);
coloritto_set_name (add_item (luz, COLORITTO_SPECTRUM_ON_WHITE, (void*)&spec, 0.008),
colorname->str);
Coloritto *color = add_item (luz, COLORITTO_SPECTRUM_ON_WHITE, (void*)&spec, 0.008);
coloritto_set_name (color, colorname->str);
}
if (has_suffix (data, ":Color") ||
has_suffix (data, ":ColorCIEXYZ"))
if (has_suffix (data, ":Color"))
// || has_suffix (data, ":ColorSpaceSRGB") || has_suffix (data, ":ColorCIEXYZ"))
{
if (got_lab)
coloritto_set_name (
add_item (luz, COLORITTO_LAB, &lab[0], 0.005),
colorname->str);
else if (got_rgb)
coloritto_set_name (
add_item (luz, COLORITTO_SRGB, &srgb[0], 0.005),
colorname->str);
else if (got_xyz)
coloritto_set_name (
add_item (luz, COLORITTO_XYZ, &xyz[0], 0.005),
colorname->str);
{
Coloritto *color = add_item (luz, COLORITTO_LAB, &lab[0], 0.005);
coloritto_set_name (color, colorname->str);
}
if (got_rgb)
{
Coloritto *color = add_item (luz, COLORITTO_SRGB, &srgb[0], 0.005);
coloritto_set_name (color, colorname->str);
}
if (got_xyz)
{
Coloritto *color = add_item (luz, COLORITTO_XYZ, &xyz[0], 0.005);
coloritto_set_name (color, colorname->str);
}
#if 0
else
{
fprintf (stderr, "unhandled foo\n");
}
#endif
}
state = IN_NONE;
break;
......@@ -885,8 +1169,7 @@ static void parse_config_line (Luz *luz, const char *line)
p--;
}
val = rest;
/***** key and val are setup ******/
/***** key and val are setup ******/
{
int spaces = 0;
......@@ -908,16 +1191,14 @@ static void parse_config_line (Luz *luz, const char *line)
; //fprintf (stderr, "too ignore... [%s] = scalar[%s]\n", key, rest);
else if (spaces < 4)
{
coloritto_set_name (
add_item (luz, COLORITTO_SRGB, &vals[1], 0.004),
key);
Coloritto *color = add_item (luz, COLORITTO_SRGB, &vals[1], 0.004);
coloritto_set_name (color, key);
}
else if (spaces > 6)
{
Spectrum spectrum = luz_parse_spectrum (luz, rest);
coloritto_set_name (
add_item(luz, COLORITTO_SPECTRUM_ON_WHITE, (void*)&spectrum, 0.008),
key);
Coloritto *color = add_item(luz, COLORITTO_SPECTRUM_ON_WHITE, (void*)&spectrum, 0.008);
coloritto_set_name (color, key);
}
}
......@@ -963,11 +1244,13 @@ load_txt (Luz *luz, const char *path)
}
#include "luz-config.inc"
int main (int argc, char **argv)
{
Mrg *mrg = mrg_new (800, 800, NULL);
mrg = mrg_new (800, 800, NULL);
luz = luz_new (config_internal);
commandline = strdup ("");
babl_init ();
add_items ();
......@@ -984,3 +1267,17 @@ int main (int argc, char **argv)
mrg_main (mrg);
return 0;
}
int cmd_quit (COMMAND_ARGS) /* "quit", 0, "[command]", "exit" */
{
mrg_quit (mrg);
return 0;
}
int cmd_exit (COMMAND_ARGS) /* "q", 0, "[command]", "exit" */
{
mrg_quit (mrg);
return 0;
}
static const char *config_internal =
#if 1 // ciexyz31.csv
"observer_x=360 5 1 0.000129900000 0.000232100000 0.000414900000 0.000741600000 0.001368000000 0.002236000000 0.004243000000 0.007650000000 0.014310000000 0.023190000000 0.043510000000 0.077630000000 0.134380000000 0.214770000000 0.283900000000 0.328500000000 0.348280000000 0.348060000000 0.336200000000 0.318700000000 0.290800000000 0.251100000000 0.195360000000 0.142100000000 0.095640000000 0.057950010000 0.032010000000 0.014700000000 0.004900000000 0.002400000000 0.009300000000 0.029100000000 0.063270000000 0.109600000000 0.165500000000 0.225749900000 0.290400000000 0.359700000000 0.433449900000 0.512050100000 0.594500000000 0.678400000000 0.762100000000 0.842500000000 0.916300000000 0.978600000000 1.026300000000 1.056700000000 1.062200000000 1.045600000000 1.002600000000 0.938400000000 0.854449900000 0.751400000000 0.642400000000 0.541900000000 0.447900000000 0.360800000000 0.283500000000 0.218700000000 0.164900000000 0.121200000000 0.087400000000 0.063600000000 0.046770000000 0.032900000000 0.022700000000 0.015840000000 0.011359160000 0.008110916000 0.005790346000 0.004109457000 0.002899327000 0.002049190000 0.001439971000 0.000999949300 0.000690078600 0.000476021300 0.000332301100 0.000234826100 0.000166150500 0.000117413000 0.000083075270 0.000058706520 0.000041509940 0.000029353260 0.000020673830 0.000014559770 0.000010253980 0.000007221456 0.000005085868 0.000003581652 0.000002522525 0.000001776509 0.000001251141\n"
"observer_y=360 5 1 0.000003917000 0.000006965000 0.000012390000 0.000022020000 0.000039000000 0.000064000000 0.000120000000 0.000217000000 0.000396000000 0.000640000000 0.001210000000 0.002180000000 0.004000000000 0.007300000000 0.011600000000 0.016840000000 0.023000000000 0.029800000000 0.038000000000 0.048000000000 0.060000000000 0.073900000000 0.090980000000 0.112600000000 0.139020000000 0.169300000000 0.208020000000 0.258600000000 0.323000000000 0.407300000000 0.503000000000 0.608200000000 0.710000000000 0.793200000000 0.862000000000 0.914850100000 0.954000000000 0.980300000000 0.994950100000 1.000000000000 0.995000000000 0.978600000000 0.952000000000 0.915400000000 0.870000000000 0.816300000000 0.757000000000 0.694900000000 0.631000000000 0.566800000000 0.503000000000 0.441200000000 0.381000000000 0.321000000000 0.265000000000 0.217000000000 0.175000000000 0.138200000000 0.107000000000 0.081600000000 0.061000000000 0.044580000000 0.032000000000 0.023200000000 0.017000000000 0.011920000000 0.008210000000 0.005723000000 0.004102000000 0.002929000000 0.002091000000 0.001484000000 0.001047000000 0.000740000000 0.000520000000 0.000361100000 0.000249200000 0.000171900000 0.000120000000 0.000084800000 0.000060000000 0.000042400000 0.000030000000 0.000021200000 0.000014990000 0.000010600000 0.000007465700 0.000005257800 0.000003702900 0.000002607800 0.000001836600 0.000001293400 0.000000910930 0.000000641530 0.000000451810\n"
"observer_z=360 5 1 0.000606100000 0.001086000000 0.001946000000 0.003486000000 0.006450001000 0.010549990000 0.020050010000 0.036210000000 0.067850010000 0.110200000000 0.207400000000 0.371300000000 0.645600000000 1.039050100000 1.385600000000 1.622960000000 1.747060000000 1.782600000000 1.772110000000 1.744100000000 1.669200000000 1.528100000000 1.287640000000 1.041900000000 0.812950100000 0.616200000000 0.465180000000 0.353300000000 0.272000000000 0.212300000000 0.158200000000 0.111700000000 0.078249990000 0.057250010000 0.042160000000 0.029840000000 0.020300000000 0.013400000000 0.008749999000 0.005749999000 0.003900000000 0.002749999000 0.002100000000 0.001800000000 0.001650001000 0.001400000000 0.001100000000 0.001000000000 0.000800000000 0.000600000000 0.000340000000 0.000240000000 0.000190000000 0.000100000000 0.000049999990 0.000030000000 0.000020000000 0.000010000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000\n"
#endif
#if 1 // ciexyz64.csv
"observer_x=360 5 1 0.000000122200 0.000000919270 0.000005958600 0.000033266000 0.000159952000 0.000662440000 0.002361600000 0.007242300000 0.019109700000 0.043400000000 0.084736000000 0.140638000000 0.204492000000 0.264737000000 0.314679000000 0.357719000000 0.383734000000 0.386726000000 0.370702000000 0.342957000000 0.302273000000 0.254085000000 0.195618000000 0.132349000000 0.080507000000 0.041072000000 0.016172000000 0.005132000000 0.003816000000 0.015444000000 0.037465000000 0.071358000000 0.117749000000 0.172953000000 0.236491000000 0.304213000000 0.376772000000 0.451584000000 0.529826000000 0.616053000000 0.705224000000 0.793832000000 0.878655000000 0.951162000000 1.014160000000 1.074300000000 1.118520000000 1.134300000000 1.123990000000 1.089100000000 1.030480000000 0.950740000000 0.856297000000 0.754930000000 0.647467000000 0.535110000000 0.431567000000 0.343690000000 0.268329000000 0.204300000000 0.152568000000 0.112210000000 0.081260600000 0.057930000000 0.040850800000 0.028623000000 0.019941300000 0.013842000000 0.009576880000 0.006605200000 0.004552630000 0.003144700000 0.002174960000 0.001505700000 0.001044760000 0.000727450000 0.000508258000 0.000356380000 0.000250969000 0.000177730000 0.000126390000 0.000090151000 0.000064525800 0.000046339000 0.000033411700 0.000024209000 0.000017611500 0.000012855000 0.000009413630 0.000006913000 0.000005093470 0.000003767100 0.000002795310 0.000002082000 0.000001553140\n"
"observer_y=360 5 1 0.000000013398 0.000000100650 0.000000651100 0.000003625000 0.000017364000 0.000071560000 0.000253400000 0.000768500000 0.002004400000 0.004509000000 0.008756000000 0.014456000000 0.021391000000 0.029497000000 0.038676000000 0.049602000000 0.062077000000 0.074704000000 0.089456000000 0.106256000000 0.128201000000 0.152761000000 0.185190000000 0.219940000000 0.253589000000 0.297665000000 0.339133000000 0.395379000000 0.460777000000 0.531360000000 0.606741000000 0.685660000000 0.761757000000 0.823330000000 0.875211000000 0.923810000000 0.961988000000 0.982200000000 0.991761000000 0.999110000000 0.997340000000 0.982380000000 0.955552000000 0.915175000000 0.868934000000 0.825623000000 0.777405000000 0.720353000000 0.658341000000 0.593878000000 0.527963000000 0.461834000000 0.398057000000 0.339554000000 0.283493000000 0.228254000000 0.179828000000 0.140211000000 0.107633000000 0.081187000000 0.060281000000 0.044096000000 0.031800400000 0.022601700000 0.015905100000 0.011130300000 0.007748800000 0.005375100000 0.003717740000 0.002564560000 0.001768470000 0.001222390000 0.000846190000 0.000586440000 0.000407410000 0.000284041000 0.000198730000 0.000139550000 0.000098428000 0.000069819000 0.000049737000 0.000035540500 0.000025486000 0.000018338400 0.000013249000 0.000009619600 0.000007012800 0.000005129800 0.000003764730 0.000002770810 0.000002046130 0.000001516770 0.000001128090 0.000000842160 0.000000629700\n"
"observer_z=360 5 1 0.000000535027 0.000004028300 0.000026143700 0.000146220000 0.000704776000 0.002927800000 0.010482200000 0.032344000000 0.086010900000 0.197120000000 0.389366000000 0.656760000000 0.972542000000 1.282500000000 1.553480000000 1.798500000000 1.967280000000 2.027300000000 1.994800000000 1.900700000000 1.745370000000 1.554900000000 1.317560000000 1.030200000000 0.772125000000 0.570060000000 0.415254000000 0.302356000000 0.218502000000 0.159249000000 0.112044000000 0.082248000000 0.060709000000 0.043050000000 0.030451000000 0.020584000000 0.013676000000 0.007918000000 0.003988000000 0.001091000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000 0.000000000000\n"
#endif
#if 0 // ciexyzjv.csv
"observer_x=380 5 1 2.689900e-003 5.310500e-003 1.078100e-002 2.079200e-002 3.798100e-002 6.315700e-002 9.994100e-002 1.582400e-001 2.294800e-001 2.810800e-001 3.109500e-001 3.307200e-001 3.333600e-001 3.167200e-001 2.888200e-001 2.596900e-001 2.327600e-001 2.099900e-001 1.747600e-001 1.328700e-001 9.194400e-002 5.698500e-002 3.173100e-002 1.461300e-002 4.849100e-003 2.321500e-003 9.289900e-003 2.927800e-002 6.379100e-002 1.108100e-001 1.669200e-001 2.276800e-001 2.926900e-001 3.622500e-001 4.363500e-001 5.151300e-001 5.974800e-001 6.812100e-001 7.642500e-001 8.439400e-001 9.163500e-001 9.770300e-001 1.023000e+000 1.051300e+000 1.055000e+000 1.036200e+000 9.923900e-001 9.286100e-001 8.434600e-001 7.398300e-001 6.328900e-001 5.335100e-001 4.406200e-001 3.545300e-001 2.786200e-001 2.148500e-001 1.616100e-001 1.182000e-001 8.575300e-002 6.307700e-002 4.583400e-002 3.205700e-002 2.218700e-002 1.561200e-002 1.109800e-002 7.923300e-003 5.653100e-003 4.003900e-003 2.825300e-003 1.994700e-003 1.399400e-003 9.698000e-004 6.684700e-004 4.614100e-004 3.207300e-004 2.257300e-004 1.597300e-004 1.127500e-004 7.951300e-005 5.608700e-005 3.954100e-005 2.785200e-005 1.959700e-005 1.377000e-005 9.670000e-006 6.791800e-006 4.770600e-006 3.355000e-006 2.353400e-006 1.637700e-006\n"
"observer_y=380 5 1 2.000000e-004 3.955600e-004 8.000000e-004 1.545700e-003 2.800000e-003 4.656200e-003 7.400000e-003 1.177900e-002 1.750000e-002 2.267800e-002 2.730000e-002 3.258400e-002 3.790000e-002 4.239100e-002 4.680000e-002 5.212200e-002 6.000000e-002 7.294200e-002 9.098000e-002 1.128400e-001 1.390200e-001 1.698700e-001 2.080200e-001 2.580800e-001 3.230000e-001 4.054000e-001 5.030000e-001 6.081100e-001 7.100000e-001 7.951000e-001 8.620000e-001 9.150500e-001 9.540000e-001 9.800400e-001 9.949500e-001 1.000100e+000 9.950000e-001 9.787500e-001 9.520000e-001 9.155800e-001 8.700000e-001 8.162300e-001 7.570000e-001 6.948300e-001 6.310000e-001 5.665400e-001 5.030000e-001 4.417200e-001 3.810000e-001 3.205200e-001 2.650000e-001 2.170200e-001 1.750000e-001 1.381200e-001 1.070000e-001 8.165200e-002 6.100000e-002 4.432700e-002 3.200000e-002 2.345400e-002 1.700000e-002 1.187200e-002 8.210000e-003 5.772300e-003 4.102000e-003 2.929100e-003 2.091000e-003 1.482200e-003 1.047000e-003 7.401500e-004 5.200000e-004 3.609300e-004 2.492000e-004 1.723100e-004 1.200000e-004 8.462000e-005 6.000000e-005 4.244600e-005 3.000000e-005 2.121000e-005 1.498900e-005 1.058400e-005 7.465600e-006 5.259200e-006 3.702800e-006 2.607600e-006 1.836500e-006 1.295000e-006 9.109200e-007 6.356400e-007\n"
"observer_z=380 5 1 1.226000e-002 2.422200e-002 4.925000e-002 9.513500e-002 1.740900e-001 2.901300e-001 4.605300e-001 7.316600e-001 1.065800e+000 1.314600e+000 1.467200e+000 1.579600e+000 1.616600e+000 1.568200e+000 1.471700e+000 1.374000e+000 1.291700e+000 1.235600e+000 1.113800e+000 9.422000e-001 7.559600e-001 5.864000e-001 4.466900e-001 3.411600e-001 2.643700e-001 2.059400e-001 1.544500e-001 1.091800e-001 7.658500e-002 5.622700e-002 4.136600e-002 2.935300e-002 2.004200e-002 1.331200e-002 8.782300e-003 5.857300e-003 4.049300e-003 2.921700e-003 2.277100e-003 1.970600e-003 1.806600e-003 1.544900e-003 1.234800e-003 1.117700e-003 9.056400e-004 6.946700e-004 4.288500e-004 3.181700e-004 2.559800e-004 1.567900e-004 9.769400e-005 6.894400e-005 5.116500e-005 3.601600e-005 2.423800e-005 1.691500e-005 1.190600e-005 8.148900e-006 5.600600e-006 3.954400e-006 2.791200e-006 1.917600e-006 1.313500e-006 9.151900e-007 6.476700e-007 4.635200e-007 3.330400e-007 2.382300e-007 1.702600e-007 1.220700e-007 8.710700e-008 6.145500e-008 4.316200e-008 3.037900e-008 2.155400e-008 1.549300e-008 1.120400e-008 8.087300e-009 5.834000e-009 4.211000e-009 3.038300e-009 2.190700e-009 1.577800e-009 1.134800e-009 8.156500e-010 5.862600e-010 4.213800e-010 3.031900e-010 2.175300e-010 1.547600e-010\n"
#endif
#if 0
"observer_x=380 5 1 0.0014 0.0022 0.0042 0.0076 0.0143 0.0232 0.0435 0.0776 0.1344 0.2148 0.2839 0.3285 0.3483 0.3481 0.3362 0.3187 0.2908 0.2511 0.1954 0.1421 0.0956 0.0580 0.0320 0.0147 0.0049 0.0024 0.0093 0.0291 0.0633 0.1096 0.1655 0.2257 0.2904 0.3597 0.4334 0.5121 0.5945 0.6784 0.7621 0.8425 0.9163 0.9786 1.0263 1.0567 1.0622 1.0456 1.0026 0.9384 0.8544 0.7514 0.6424 0.5419 0.4479 0.3608 0.2835 0.2187 0.1649 0.1212 0.0874 0.0636 0.0468 0.0329 0.0227 0.0158 0.0114 0.0081 0.0058 0.0041 0.0029 0.0020 0.0014 0.0010 0.0007 0.0005 0.0003 0.0002 0.0002 0.0001 0.0001 0.0001 0.0000\n"
"observer_y=380 5 1 0.0000 0.0001 0.0001 0.0002 0.0004 0.0006 0.0012 0.0022 0.0040 0.0073 0.0116 0.0168 0.0230 0.0298 0.0380 0.0480 0.0600 0.0739 0.0910 0.1126 0.1390 0.1693 0.2080 0.2586 0.3230 0.4073 0.5030 0.6082 0.7100 0.7932 0.8620 0.9149 0.9540 0.9803 0.9950 1.0000 0.9950 0.9786 0.9520 0.9154 0.8700 0.8163 0.7570 0.6949 0.6310 0.5668 0.5030 0.4412 0.3810 0.3210 0.2650 0.2170 0.1750 0.1382 0.1070 0.0816 0.0610 0.0446 0.0320 0.0232 0.0170 0.0119 0.0082 0.0057 0.0041 0.0029 0.0021 0.0015 0.0010 0.0007 0.0005 0.0004 0.0002 0.0002 0.0001 0.0001 0.0001 0.0000 0.0000 0.0000 0.0000\n"