// colour.c // // by John D. de Boer #include "abcdefg.h" #include "base.h" #include "colour.h" colour QPal[MAXCOLOUR]; char *CName[MAXCOLOUR]; // Initialisation static void initrgb(int INDEX, int R, int G, int B, char *N) { setrgb(QPal + INDEX,R / 100.0,G / 100.0,B / 100.0); CName[INDEX]=N; } void initcolour(void) { initrgb(black, 0, 0, 0,"black"); initrgb(midnightblue, 0, 0, 25,"midnight blue"); initrgb(sapphire, 0, 0, 50,"sapphire"); initrgb(aad, 0, 0, 75,"aad"); initrgb(blue, 0, 0,100,"blue"); initrgb(darkgreen, 0, 25, 0,"dark green"); initrgb(pewter, 0, 25, 25,"pewter"); initrgb(abc, 0, 25, 50,"abc"); initrgb(ultramarine, 0, 25, 75,"ultramarine"); initrgb(abe, 0, 25,100,"abe"); initrgb(forestgreen, 0, 50, 0,"forest green"); initrgb(malachite, 0, 50, 25,"malachite"); initrgb(acc, 0, 50, 50,"acc"); initrgb(acd, 0, 50, 75,"acd"); initrgb(medblue, 0, 50,100,"medium blue"); initrgb(ada, 0, 75, 0,"ada"); initrgb(emerald, 0, 75, 25,"emerald"); initrgb(teal, 0, 75, 50,"teal"); initrgb(aqua, 0, 75, 75,"aqua"); initrgb(lightblue, 0, 75,100,"light blue"); initrgb(green, 0,100, 0,"green"); initrgb(aeb, 0,100, 25,"aeb"); initrgb(seagreen, 0,100, 50,"sea green"); initrgb(seafoam, 0,100, 75,"seafoam"); initrgb(cyan, 0,100,100,"cyan"); initrgb(oxblood, 25, 0, 0,"oxblood"); initrgb(darkplum, 25, 0, 25,"dark plum"); initrgb(bac, 25, 0, 50,"bac"); initrgb(indigo, 25, 0, 75,"indigo"); initrgb(bae, 25, 0,100,"bae"); initrgb(darkolive, 25, 25, 0,"dark olive"); initrgb(darkgrey, 25, 25, 25,"dark grey"); initrgb(navy, 25, 25, 50,"navy"); initrgb(bbd, 25, 25, 75,"bbd"); initrgb(royalblue, 25, 25,100,"royal blue"); initrgb(bca, 25, 50, 0,"bca"); initrgb(jade, 25, 50, 25,"jade"); initrgb(bcc, 25, 50, 50,"bcc"); initrgb(greyblue, 25, 50, 75,"grey blue"); initrgb(bce, 25, 50,100,"bce"); initrgb(leafgreen, 25, 75, 0,"leaf green"); initrgb(bdb, 25, 75, 25,"bdb"); initrgb(greygreen, 25, 75, 50,"grey green"); initrgb(bdd, 25, 75, 75,"bdd"); initrgb(skyblue, 25, 75,100,"sky blue"); initrgb(bea, 25,100, 0,"bea"); initrgb(kellygreen, 25,100, 25,"kelly green"); initrgb(bec, 25,100, 50,"bec"); initrgb(turquoise, 25,100, 75,"turquoise"); initrgb(bee, 25,100,100,"bee"); initrgb(rust, 50, 0, 0,"rust"); initrgb(grape, 50, 0, 25,"grape"); initrgb(plum, 50, 0, 50,"plum"); initrgb(cad, 50, 0, 75,"cad"); initrgb(purple, 50, 0,100,"purple"); initrgb(sienna, 50, 25, 0,"sienna"); initrgb(mahogany, 50, 25, 25,"mahogany"); initrgb(cbc, 50, 25, 50,"cbc"); initrgb(orchid, 50, 25, 75,"orchid"); initrgb(cbe, 50, 25,100,"cbe"); initrgb(olive, 50, 50, 0,"olive"); initrgb(ccb, 50, 50, 25,"ccb"); initrgb(grey, 50, 50, 50,"grey"); initrgb(ccd, 50, 50, 75,"ccd"); initrgb(periwinkle, 50, 50,100,"periwinkle"); initrgb(cda, 50, 75, 0,"cda"); initrgb(sagegreen, 50, 75, 25,"sage green"); initrgb(cdc, 50, 75, 50,"cdc"); initrgb(cdd, 50, 75, 75,"cdd"); initrgb(cde, 50, 75,100,"cde"); initrgb(limegreen, 50,100, 0,"lime green"); initrgb(ceb, 50,100, 25,"ceb"); initrgb(lightgreen, 50,100, 50,"light green"); initrgb(ced, 50,100, 75,"ced"); initrgb(robinsegg, 50,100,100,"robin's egg"); initrgb(brickred, 75, 0, 0,"brick red"); initrgb(crimson, 75, 0, 25,"crimson"); initrgb(dac, 75, 0, 50,"dac"); initrgb(violet, 75, 0, 75,"violet"); initrgb(brightpurple, 75, 0,100,"bright purple"); initrgb(burntorange, 75, 25, 0,"burnt orange"); initrgb(dbb, 75, 25, 25,"dbb"); initrgb(dbc, 75, 25, 50,"dbc"); initrgb(dbd, 75, 25, 75,"dbd"); initrgb(dbe, 75, 25,100,"dbe"); initrgb(dca, 75, 50, 0,"dca"); initrgb(lightbrown, 75, 50, 25,"light brown"); initrgb(taupe, 75, 50, 50,"taupe"); initrgb(mauve, 75, 50, 75,"mauve"); initrgb(lavender, 75, 50,100,"lavender"); initrgb(lightolive, 75, 75, 0,"light olive"); initrgb(ddb, 75, 75, 25,"ddb"); initrgb(khaki, 75, 75, 50,"khaki"); initrgb(lightgrey, 75, 75, 75,"light grey"); initrgb(babyblue, 75, 75,100,"baby blue"); initrgb(dea, 75,100, 0,"dea"); initrgb(chartreuse, 75,100, 25,"chartreuse"); initrgb(honeydew, 75,100, 50,"honeydew"); initrgb(palegreen, 75,100, 75,"pale green"); initrgb(dee, 75,100,100,"dee"); initrgb(red, 100, 0, 0,"red"); initrgb(vermilion, 100, 0, 25,"vermilion"); initrgb(fuchsia, 100, 0, 50,"fuchsia"); initrgb(ead, 100, 0, 75,"ead"); initrgb(magenta, 100, 0,100,"magenta"); initrgb(sarasota, 100, 25, 0,"sarasota orange"); initrgb(ebb, 100, 25, 25,"ebb"); initrgb(watermelon, 100, 25, 50,"watermelon"); initrgb(pink, 100, 25, 75,"pink"); initrgb(ebe, 100, 25,100,"ebe"); initrgb(orange, 100, 50, 0,"orange"); initrgb(peach, 100, 50, 25,"peach"); initrgb(dustyrose, 100, 50, 50,"dusty rose"); initrgb(rose, 100, 50, 75,"rose"); initrgb(lilac, 100, 50,100,"lilac"); initrgb(goldenrod, 100, 75, 0,"goldenrod"); initrgb(apricot, 100, 75, 25,"apricot"); initrgb(coral, 100, 75, 50,"coral"); initrgb(palerose, 100, 75, 75,"pale rose"); initrgb(lightmauve, 100, 75,100,"light mauve"); initrgb(yellow, 100,100, 0,"yellow"); initrgb(lightyellow, 100,100, 25,"light yellow"); initrgb(paleyellow, 100,100, 50,"pale yellow"); initrgb(eed, 100,100, 75,"eed"); initrgb(white, 100,100,100,"white"); //initrgb(beige, 80, 65, 40,"beige"); //initrgb(beige, 86, 63, 38,"beige"); //initrgb(beige, 84, 64, 39,"beige"); initrgb(beige, 89, 74, 57,"beige"); //initrgb(lightbrown, 75, 45, 15,"light brown"); initrgb(medbrown, 66, 40, 13,"medium brown"); initrgb(brown, 50, 30, 10,"brown"); initrgb(chestnut, 37, 22, 7,"chestnut"); initrgb(terracotta, 90, 45, 35,"terra cotta"); } //initrgb(forestgreen, 31, 63, 31,""); //cherry 80,0,15? // Quartz colour routines void rgb2colour(const RGBColor *RGB, colour *C) { if (!RGB || !C) return; C->c[0]= RGB->red / 65536.0; C->c[1]= RGB->green / 65536.0; C->c[2]= RGB->blue / 65536.0; C->c[3]=1.0; } void setrgb(colour *C, float R, float G, float B) { if (!C) return; C->c[0]=R; C->c[1]=G; C->c[2]=B; C->c[3]=1.0; } void setcolour(colour *C, int COLOUR) { if (!C || !range(COLOUR,MAXCOLOUR)) return; *C=QPal[COLOUR]; } void greyshade(colour *C, float G) { if (!C) return; if (G<0.0) G=0.0; if (G>1.0) G=1.0; C->c[0]=G; C->c[1]=G; C->c[2]=G; C->c[3]=1.0; } void setalpha(colour *C, float F) { int i; if (!C) return; for (i=0;i<4;i++) C->c[i]*=F; } void mix(float F, const colour *A, const colour *B, colour *C) { int i; if (!A || !B || !C) return; if (F<0.0) F=0.0; if (F>1.0) F=1.0; for (i=0;i<4;i++) C->c[i]= B->c[i] + (F * (A->c[i] - B->c[i])); } void mixindex(float F, int A, int B, colour *C) { colour RGB1,RGB2; setcolour(&RGB1,A); setcolour(&RGB2,B); mix(F,&RGB1,&RGB2,C); } void shadecolour(colour *A, float Shade) { if (!A) return; A->c[0]*=Shade; A->c[1]*=Shade; A->c[2]*=Shade; } bool darkcolour(const colour *C) { float U; if (!C) return 0; U= C->c[0] + C->c[1] + C->c[2]; return U<=1.5; } bool verydarkcolour(const colour *C) { float U; if (!C) return 0; U= C->c[0] + C->c[1] + C->c[2]; return U<=0.75; } bool parsecolourname(const char *S, colour *C) { int i; if (!S || !C) return 0; for (i=0;i