{"id":13759357,"url":"https://github.com/adammaj1/hsluv-color-gradient","last_synced_at":"2025-05-10T09:32:28.744Z","repository":{"id":52293088,"uuid":"363333083","full_name":"adammaj1/hsluv-color-gradient","owner":"adammaj1","description":"perceptually uniform 1D color gradient ( HSLuv)  using C99 implementation of HSLuv (revision 4)  www.hsluv.org","archived":false,"fork":false,"pushed_at":"2021-05-02T19:51:54.000Z","size":8360,"stargazers_count":4,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-11-16T16:37:05.268Z","etag":null,"topics":["1d","bash","c","color-gradient","color-scheme","coloring-algorithm","colormaps","colorscheme","gnuplot","gradient","graphics-programming","hsl","hsluv","hsv2rgb","rgb-color","scientific-visualization","scientific-visualizations"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adammaj1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-01T05:43:40.000Z","updated_at":"2024-02-10T15:51:57.000Z","dependencies_parsed_at":"2022-09-05T22:11:47.574Z","dependency_job_id":null,"html_url":"https://github.com/adammaj1/hsluv-color-gradient","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adammaj1%2Fhsluv-color-gradient","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adammaj1%2Fhsluv-color-gradient/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adammaj1%2Fhsluv-color-gradient/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adammaj1%2Fhsluv-color-gradient/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adammaj1","download_url":"https://codeload.github.com/adammaj1/hsluv-color-gradient/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253397086,"owners_count":21901992,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["1d","bash","c","color-gradient","color-scheme","coloring-algorithm","colormaps","colorscheme","gnuplot","gradient","graphics-programming","hsl","hsluv","hsv2rgb","rgb-color","scientific-visualization","scientific-visualizations"],"created_at":"2024-08-03T13:00:51.505Z","updated_at":"2025-05-10T09:32:27.127Z","avatar_url":"https://github.com/adammaj1.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"1D discrete and continous perceptually uniform ordered color gradients rendered in [HSL](https://www.hsluv.org/)\n\n\n\n# Examples\n\nGradient types:\n* General types\n  * continous  \n  * discrete  \n* Joining types ( see also in [1D RGB gradient](https://github.com/adammaj1/1D-RGB-color-gradient/blob/main/README.md#continous-gradient-manipulations))\n  * no  \n  * steps  \n  * tubes  \n  * diverging  \n\n## HSL = [0, 100, l]\n\n\n### continous\n![](./images/0_100_continous_no.png  \"description\")   \n\n![](./images/0_100_continous_no_2D.png  \"description\")   \n\n\n\n\n![](./images/0_100_continous_steps.png \"description\")   \n\n![](./images/0_100_continous_steps_2D.png \"description\")   \n\n\n![](./images/0_100_continous_tubes.png \"0_100_continous_diverging\")  \n\n![](./images/0_100_continous_tubes_2D.png  \"description\")   \n\n\n\n![](./images/0_100_continous_diverging.png  \"description\")   \n\n![](./images/0_100_continous_diverging_2D.png \"description\")   \n\n\n### discrete\n![](./images/0_100_discrete_no.png  \"description\")   \n\n![](./images/0_100_discrete_no_2D.png  \"description\")   \n\n\n\n\n![](./images/0_100_discrete_steps.png \"description\")   \n\n![](./images/0_100_discrete_steps_2D.png \"description\")   \n\n\n![](./images/0_100_discrete_tubes.png \"0_100_dicrete_diverging\")  \n\n![](./images/0_100_discrete_tubes_2D.png  \"description\")   \n\n\n\n![](./images/0_100_discrete_diverging.png  \"description\")   \n\n![](./images/0_100_discrete_diverging_2D.png \"description\")   \n\n\n\n## HSL = [60, 100, l]\n\n\n### continous\n![](./images/60_100_continous_no.png  \"description\")   \n\n![](./images/60_100_continous_steps.png \"description\")   \n\n![](./images/60_100_continous_tubes.png \"\")  \n\n![](./images/60_100_continous_diverging.png  \"description\")   \n\n\n### discrete\n![](./images/60_100_discrete_no.png  \"description\")   \n\n![](./images/60_100_discrete_steps.png \"description\")   \n\n![](./images/60_100_discrete_tubes.png \"\")  \n\n![](./images/60_100_discrete_diverging.png  \"description\")   \n\n\n\n\n\n\n\n\n# Theory\n\nSequential map with varying lightness, single hue rendered in HSLuv color space. See : [Interactive Creation of Perceptually Uniform Color Maps by  M. Lambers ](https://diglib.eg.org/bitstream/handle/10.2312/evs20201048/055-059.pdf)\n* h is constant\n* s is constant\n* l is changing between 0.0 and 100.0 ( full range). It is variable  = gradient position \n\n\n\n```c\n// for each gradient position ( = lightness) compute hsl\nfor(iX=0; iX\u003ciXmax; ++iX){    \n\tposition = (double) iX / iXmax;\n\t// compute hsl color( position)\n\t// convert hsl to rgb\n\thsluv2rgb(h, s, l, \u0026r, \u0026g, \u0026b);\n\t// SaveColorToArray and Txt file\n}\n\n```\n\n[Complementary color](https://en.wikipedia.org/wiki/Complementary_colors) for diverging gradient :\n```c\nh_complementary = 180.0+ h;\nif (h_complementary \u003e 360.0) { h_complementary -= 360.0;}\n```\n\n\n\n\n\n\n\n# How program works ?\nGeneral steps\n* c program creates ppm and txt files\n* Image Magic converts ppm to png ( color bars)\n* gnuplot converts txt to png files ( 2D RGB color profiles ) \n* remove txt and ppm files\n\nSteps of the C program:\n* for each gradient type and h value create ppm and txt file\n * ppm file is created by saving 1D array of rgb values ( virtual 2D array)\n * txt file is a simple list of rgb values for gnuplot\n  \n\n\n\nResults: \n* there are 2 general gradient types ( continous and discrete ) \n* there are 4 gradient joining types ( no  steps  tubes  diverging)\n* there are 7 values of lightnes :  0 60 120 180 240 300 360\n* for each gradient there are 2 images: gradient bar and 2D RGB profile\n\nso the program creates [112 png images](./images)\n```math\n2*4*7*2 = 112\n```\n\n\n\n```c\n// make gradient images for each gradient type \nvoid MakeGradientImages(const double h, const double s){\n\n\tGradientGeneralType gType;\n  \tGradientJoiningType jType;\n  \t\n\t//\n  \tfor (gType = 0; gType\u003c gMaxType; ++gType)\n  \t\tfor (jType = 0; jType \u003c jMaxType; ++jType)\n  \t\t\t\tMakeGradientTypeImages(gType, jType, h, s);\n}\n\n// from main : for each h make gradient  images \n\tdo {\n   \t\tMakeGradientImages(h,s);\n   \t\th += h_step; // next gradient \n\t} while( h \u003c h_Max );\n```\n\n## Gradient Joining Types\n\n```c\n\n\ndouble ModifyPosition(const double position, const GradientGeneralType gTypeVar, const GradientJoiningType jTypeVar){\n\t\n\t// input position  should be in  [0,1] range \n\tdouble p = position; // p = local copy of position\n\t// if position \u003e 1 then we have repetition of colors = periodic function = wave   \n\t \n\t\n\tswitch(jTypeVar){\n\t\t// simple monotone function \n\t\tcase no : { break;} // return input position without modifications\n\t\t\n\t\t// periodic waves with different joinings\n\t\tcase steps : {\tp = p * segments; // periodic  = change range\n\t\t\t\tp = frac(p); \n\t\t\t\t\n    \t\t\t\tbreak;}\n    \t\t\t\t\n\t\tcase tubes : {\tp = p * segments; // periodic = change range\n\t\t\t\tint ip = (int)p;\n      \t\t\t\tp = p-ip; // fractional part \n      \t\t\t\tif (ip % 2) {p = 1.0-p;} // reverse gradient\n      \t\t\t\t\n\t\t\t\tbreak;}\n\t\t\t\t\n\t\tcase diverging : { \tp *= 2.0;\n\t\t\t\t\tif (p\u003e1.0) {p = 2.0 - p;} // reverse gradient\t \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tbreak;}\n\t\t\n\t\tdefault:{}\n\t}\n\tif ( gTypeVar == discrete ) { p = double2steps(p); }\n\t\n\treturn p; // output in [0,1] range = modified position\n\n}\n\n```\n\n\n## variables\n* hsl color\n  * h Hue. Between 0.0 and 360.0\n  * s Saturation. Between 0.0 and 100.0\n  * l Lightness. Between 0.0 and 100.0\n* rgb color\n * r Red component. Between 0.0 and 1.0\n * g Green component. Between 0.0 and 1.0\n * b Blue component. Between 0.0 and 1.0\n\n\n\n# How to run the code ?\n\n```\nmake\n```\nText output: \n\n```bash\nmake\nprintf \"make ppm and txt files \"\nmake ppm and txt files gcc g.c  hsluv.c -lm -Wall\n./a.out\n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_continous_no.txt saved. \nFile 0_100_continous_no.ppm saved. \n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_continous_steps.txt saved. \nFile 0_100_continous_steps.ppm saved. \n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_continous_tubes.txt saved. \nFile 0_100_continous_tubes.ppm saved. \n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_continous_diverging.txt saved. \nFile 0_100_continous_diverging.ppm saved. \n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_discrete_no.txt saved. \nFile 0_100_discrete_no.ppm saved. \n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_discrete_steps.txt saved. \nFile 0_100_discrete_steps.ppm saved. \n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_discrete_tubes.txt saved. \nFile 0_100_discrete_tubes.ppm saved. \n first color : hsl = [0, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 0_100_discrete_diverging.txt saved. \nFile 0_100_discrete_diverging.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_continous_no.txt saved. \nFile 60_100_continous_no.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_continous_steps.txt saved. \nFile 60_100_continous_steps.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_continous_tubes.txt saved. \nFile 60_100_continous_tubes.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_continous_diverging.txt saved. \nFile 60_100_continous_diverging.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_discrete_no.txt saved. \nFile 60_100_discrete_no.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_discrete_steps.txt saved. \nFile 60_100_discrete_steps.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_discrete_tubes.txt saved. \nFile 60_100_discrete_tubes.ppm saved. \n first color : hsl = [60, 100, l]\n complemntary color : hsl = [240, 100, l]\nFile 60_100_discrete_diverging.txt saved. \nFile 60_100_discrete_diverging.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_continous_no.txt saved. \nFile 120_100_continous_no.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_continous_steps.txt saved. \nFile 120_100_continous_steps.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_continous_tubes.txt saved. \nFile 120_100_continous_tubes.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_continous_diverging.txt saved. \nFile 120_100_continous_diverging.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_discrete_no.txt saved. \nFile 120_100_discrete_no.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_discrete_steps.txt saved. \nFile 120_100_discrete_steps.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_discrete_tubes.txt saved. \nFile 120_100_discrete_tubes.ppm saved. \n first color : hsl = [120, 100, l]\n complemntary color : hsl = [300, 100, l]\nFile 120_100_discrete_diverging.txt saved. \nFile 120_100_discrete_diverging.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_continous_no.txt saved. \nFile 180_100_continous_no.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_continous_steps.txt saved. \nFile 180_100_continous_steps.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_continous_tubes.txt saved. \nFile 180_100_continous_tubes.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_continous_diverging.txt saved. \nFile 180_100_continous_diverging.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_discrete_no.txt saved. \nFile 180_100_discrete_no.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_discrete_steps.txt saved. \nFile 180_100_discrete_steps.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_discrete_tubes.txt saved. \nFile 180_100_discrete_tubes.ppm saved. \n first color : hsl = [180, 100, l]\n complemntary color : hsl = [360, 100, l]\nFile 180_100_discrete_diverging.txt saved. \nFile 180_100_discrete_diverging.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_continous_no.txt saved. \nFile 240_100_continous_no.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_continous_steps.txt saved. \nFile 240_100_continous_steps.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_continous_tubes.txt saved. \nFile 240_100_continous_tubes.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_continous_diverging.txt saved. \nFile 240_100_continous_diverging.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_discrete_no.txt saved. \nFile 240_100_discrete_no.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_discrete_steps.txt saved. \nFile 240_100_discrete_steps.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_discrete_tubes.txt saved. \nFile 240_100_discrete_tubes.ppm saved. \n first color : hsl = [240, 100, l]\n complemntary color : hsl = [60, 100, l]\nFile 240_100_discrete_diverging.txt saved. \nFile 240_100_discrete_diverging.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_continous_no.txt saved. \nFile 300_100_continous_no.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_continous_steps.txt saved. \nFile 300_100_continous_steps.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_continous_tubes.txt saved. \nFile 300_100_continous_tubes.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_continous_diverging.txt saved. \nFile 300_100_continous_diverging.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_discrete_no.txt saved. \nFile 300_100_discrete_no.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_discrete_steps.txt saved. \nFile 300_100_discrete_steps.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_discrete_tubes.txt saved. \nFile 300_100_discrete_tubes.ppm saved. \n first color : hsl = [300, 100, l]\n complemntary color : hsl = [120, 100, l]\nFile 300_100_discrete_diverging.txt saved. \nFile 300_100_discrete_diverging.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_continous_no.txt saved. \nFile 360_100_continous_no.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_continous_steps.txt saved. \nFile 360_100_continous_steps.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_continous_tubes.txt saved. \nFile 360_100_continous_tubes.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_continous_diverging.txt saved. \nFile 360_100_continous_diverging.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_discrete_no.txt saved. \nFile 360_100_discrete_no.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_discrete_steps.txt saved. \nFile 360_100_discrete_steps.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_discrete_tubes.txt saved. \nFile 360_100_discrete_tubes.ppm saved. \n first color : hsl = [360, 100, l]\n complemntary color : hsl = [180, 100, l]\nFile 360_100_discrete_diverging.txt saved. \nFile 360_100_discrete_diverging.ppm saved. \n allways free memory (deallocate )  to avoid memory leaks \n HSLuv-C: Human-friendly HSL. See www.hsluv.org \nh = Hue is in  [0.0, 360.0] range\ns = Saturation is in  [0.0, 100.0] range\nl = Lightness is in  [0.0, 100.0] range. Here it is variable  = gradient position \nprintf \"convert text files to png \"\nconvert text files to png gnuplot plot.gp\nprintf \"convert all ppm files to png using Image Magic convert \"\nconvert all ppm files to png using Image Magic convert chmod +x g.sh\n./g.sh\n0_100_continous_diverging.ppm\n0_100_continous_no.ppm\n0_100_continous_steps.ppm\n0_100_continous_tubes.ppm\n0_100_discrete_diverging.ppm\n0_100_discrete_no.ppm\n0_100_discrete_steps.ppm\n0_100_discrete_tubes.ppm\n120_100_continous_diverging.ppm\n120_100_continous_no.ppm\n120_100_continous_steps.ppm\n120_100_continous_tubes.ppm\n120_100_discrete_diverging.ppm\n120_100_discrete_no.ppm\n120_100_discrete_steps.ppm\n120_100_discrete_tubes.ppm\n180_100_continous_diverging.ppm\n180_100_continous_no.ppm\n180_100_continous_steps.ppm\n180_100_continous_tubes.ppm\n180_100_discrete_diverging.ppm\n180_100_discrete_no.ppm\n180_100_discrete_steps.ppm\n180_100_discrete_tubes.ppm\n240_100_continous_diverging.ppm\n240_100_continous_no.ppm\n240_100_continous_steps.ppm\n240_100_continous_tubes.ppm\n240_100_discrete_diverging.ppm\n240_100_discrete_no.ppm\n240_100_discrete_steps.ppm\n240_100_discrete_tubes.ppm\n300_100_continous_diverging.ppm\n300_100_continous_no.ppm\n300_100_continous_steps.ppm\n300_100_continous_tubes.ppm\n300_100_discrete_diverging.ppm\n300_100_discrete_no.ppm\n300_100_discrete_steps.ppm\n300_100_discrete_tubes.ppm\n360_100_continous_diverging.ppm\n360_100_continous_no.ppm\n360_100_continous_steps.ppm\n360_100_continous_tubes.ppm\n360_100_discrete_diverging.ppm\n360_100_discrete_no.ppm\n360_100_discrete_steps.ppm\n360_100_discrete_tubes.ppm\n60_100_continous_diverging.ppm\n60_100_continous_no.ppm\n60_100_continous_steps.ppm\n60_100_continous_tubes.ppm\n60_100_discrete_diverging.ppm\n60_100_discrete_no.ppm\n60_100_discrete_steps.ppm\n60_100_discrete_tubes.ppm\nOK\nprintf \"delete all ppm and txt files \"\ndelete all ppm and txt files rm *.ppm\nrm *.txt\n```\n\n\n\n\n\n\n\n\n\n# Dependencies\n* gcc\n* hsluv-c: function hsluv2rgb from [HSLuv-C](https://github.com/hsluv/hsluv-c) = C implementation of [HSLuv = Human-friendly HSL](https://www.hsluv.org/)\n* make \n* gnuplot: onverts txt to png files ( 2D RGB color profiles ) \n* Image Magic: converts ppm to png ( color bars)\n* bash\n\nTested on:\n* GNU Make 4.3\n* GNU bash, version 5.0.17(1)\n* GNUPLOT Version 5.2 patchlevel 8 \n* gcc (Ubuntu 10.2.0-13ubuntu1) 10.2.0\n* Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org\n\n\n\n\n\n# Credits\n* function hsluv2rgb from [HSLuv-C](https://github.com/hsluv/hsluv-c) = C implementation of [HSLuv = Human-friendly HSL](https://www.hsluv.org/) by [Alexei Boronine](https://www.boronine.com/)\n* [1D-RGB-color-gradient](https://github.com/adammaj1/1D-RGB-color-gradient)\n* [ https://www.shellcheck.net/](shellcheck) by Vidar Holen\n\n# Files\n\n\n\n# Licence\n\n[Licence](LICENCE)\n\n\n\n# Git \n\n\n\n```git\necho \"# hsluv-color-gradient\" \u003e\u003e README.md\ngit init\ngit add README.md\ngit commit -m \"first commit\"\ngit branch -M main\ngit remote add origin git@github.com:adammaj1/hsluv-color-gradient.git\ngit push -u origin main\n```\n\n\n\n```\n  git clone git@github.com:adammaj1/hsluv-color-gradient.git\n```\n\nSubdirectory\n\n```git\nmkdir images\ngit add *.png\ngit mv  *.png ./images\ngit commit -m \"move\"\ngit push -u origin main\n```\nthen link the images:\n\n```txt\n![](./images/n.png \"description\") \n\n```\nto overwrite \n```git\ngit mv -f \n```\n\n[to remove file from remote repo](https://stackoverflow.com/questions/2047465/how-can-i-delete-a-file-from-a-git-repository)\n```git\ngit rm --cached file1.txt\ngit commit -m \"remove\"\ngit push -u origin main\n```\n\n\nlocal repo: ~/hsluv-c/test/t2\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadammaj1%2Fhsluv-color-gradient","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadammaj1%2Fhsluv-color-gradient","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadammaj1%2Fhsluv-color-gradient/lists"}