Exemplo n.º 1
0
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;
}