int dyeColorGetAs(float *v0P, float *v1P, float *v2P, dyeColor *colIn, int space) { dyeColor _col, *col; col = &_col; dyeColorCopy(col, colIn); /* hope for no error */ dyeConvert(col, space); return dyeColorGet(v0P, v1P, v2P, col); }
/* ******** dyeConvert() ** ** master color conversion function. Can convert between any two ** types by recursive calls and calls to the simple converters above. */ int dyeConvert(dyeColor *col, int outSpace) { char me[] = "dyeConvert", err[128]; float i0, i1, i2, o0, o1, o2; dyeConverter simple; int inSpace, E; E = 0; if (!col) { sprintf(err, "%s: got NULL pointer", me); biffAdd(DYE, err); return 1; } inSpace = dyeColorGet(&i0, &i1, &i2, col); if (!DYE_VALID_SPACE(inSpace)) { sprintf(err, "%s: invalid input space #%d\n", me, inSpace); biffAdd(DYE, err); return 1; } if (!DYE_VALID_SPACE(outSpace)) { sprintf(err, "%s: invalid output space #%d\n", me, outSpace); biffAdd(DYE, err); return 1; } if ( (simple = dyeSimpleConvert[inSpace][outSpace]) ) { (*simple)(&o0, &o1, &o2, i0, i1, i2); dyeColorSet(col, outSpace, o0, o1, o2); } else { /* we have some work to do ... */ if (inSpace < dyeSpaceRGB && outSpace < dyeSpaceRGB) { /* its an easy HSV <-- RGB --> HSL conversion */ if (!E) E |= dyeConvert(col, dyeSpaceRGB); if (!E) E |= dyeConvert(col, outSpace); } else if (inSpace > dyeSpaceXYZ && outSpace > dyeSpaceXYZ) { /* its an easy LAB <-- XYZ --> LUV conversion */ if (!E) E |= dyeConvert(col, dyeSpaceXYZ); if (!E) E |= dyeConvert(col, outSpace); } else { /* the start and end spaces are at different stages */ if (inSpace < outSpace) { /* we are going towards higher stages */ if (inSpace < dyeSpaceRGB) { if (!E) E |= dyeConvert(col, dyeSpaceRGB); if (!E) E |= dyeConvert(col, outSpace); } else if (inSpace == dyeSpaceRGB) { if (!E) E |= dyeConvert(col, dyeSpaceXYZ); if (!E) E |= dyeConvert(col, outSpace); } else { sprintf(err, "%s: CONFUSED! can't go %s -> %s\n", me, dyeSpaceToStr[inSpace], dyeSpaceToStr[outSpace]); biffAdd(DYE, err); E = 1; } } else { /* we are going towards lower stages */ if (outSpace < dyeSpaceRGB) { if (!E) E |= dyeConvert(col, dyeSpaceRGB); if (!E) E |= dyeConvert(col, outSpace); } else if (outSpace == dyeSpaceRGB) { if (!E) E |= dyeConvert(col, dyeSpaceXYZ); if (!E) E |= dyeConvert(col, dyeSpaceRGB); } else { sprintf(err, "%s: CONFUSED! can't go %s -> %s\n", me, dyeSpaceToStr[inSpace], dyeSpaceToStr[outSpace]); biffAdd(DYE, err); E = 1; } } } } return E; }