Beispiel #1
0
dyeColor *
dyeColorSet(dyeColor *col, int space, float v0, float v1, float v2) {

  if (col && DYE_VALID_SPACE(space)) {
    col->ii = AIR_CLAMP(0, col->ii, 1);

    /* We switch to the other one if the current one seems to be used,
       but we don't switch if new and current colorspaces are the same.
       If the other one is being used too, oh well.  */
    if (dyeSpaceUnknown != col->spc[col->ii] &&
        AIR_EXISTS(col->val[col->ii][0]) &&
        col->spc[col->ii] != space) {
      col->ii = 1 - col->ii;
    }

    ELL_3V_SET(col->val[col->ii], v0, v1, v2);
    col->spc[col->ii] = space;
  }
  return 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;
}