Example #1
0
QVector<typedFloss> rgbToFloss(const QVector<triC>& colors, flossType type) {

  // We could just add the type to each color and then call the flossColor
  // version of this function, but I expect this code to be stable, so in this
  // case I think it's better to special case in order to avoid the memory/time
  // hit.
  QVector<typedFloss> returnFloss;
  returnFloss.reserve(colors.size());
  if (type == flossDMC || type == flossAnchor) {
    const QVector<floss> sourceFloss =
      type == flossDMC ? ::initializeDMC() : ::initializeAnchor();
    for (int i = 0, size = colors.size(); i < size; ++i) {
      const triC color = colors[i];
      const int index = sourceFloss.indexOf(floss(color));
      if (index != -1) {
        returnFloss.push_back(typedFloss(sourceFloss[index], type));
      }
      else {
        returnFloss.push_back(typedFloss(floss(color), flossVariable));
      }
    }
  }
  else {
    for (int i = 0, size = colors.size(); i < size; ++i) {
      returnFloss.push_back(typedFloss(floss(colors[i]), flossVariable));
    }
  }

  return returnFloss;
}
Example #2
0
QVector<typedFloss> rgbToFloss(const QVector<flossColor>& colors) {

  // Keep this in sync with rgbToFloss(const flossColor& color) - we're keeping
  // this version separate so that we don't need to load the DMC/Anchor color
  // list for each color on this list.
  // Also, WARNING: there was a bug in an old version of cstitch which in
  // certain cases allowed a non-floss color to be labeled as floss, so now
  // forevermore we need to handle that case just for any projects saved with
  // the bug. :(
  QVector<typedFloss> returnFloss;
  returnFloss.reserve(colors.size());
  QVector<floss> dmcColors;
  QVector<floss> anchorColors;
  for (int i = 0, size = colors.size(); i < size; ++i) {
    const flossColor color = colors[i];
    switch (color.type().value()) {
      case flossDMC: {
        if (dmcColors.isEmpty()) {
          dmcColors = ::initializeDMC();
        }
        const int index = dmcColors.indexOf(floss(color.color()));
        if (index != -1) {
          const floss thisDmcFloss = dmcColors[index];
          returnFloss.push_back(typedFloss(thisDmcFloss, flossDMC));
        }
        else {
          returnFloss.push_back(typedFloss(floss(color.color()), flossVariable));
        }
        break;
      }
      case flossAnchor: {
        if (anchorColors.isEmpty()) {
          anchorColors = ::initializeAnchor();
        }
        const int index = anchorColors.indexOf(floss(color.color()));
        if (index != -1) {
          const floss thisAnchorFloss = anchorColors[index];
          returnFloss.push_back(typedFloss(thisAnchorFloss, flossAnchor));
        }
        else {
          returnFloss.push_back(typedFloss(floss(color.color()), flossVariable));
        }
        break;
      }
      case flossVariable:
        returnFloss.push_back(typedFloss(floss(color.color()), flossVariable));
        break;
    }
  }
  return returnFloss;
}
Example #3
0
QVector<typedFloss> rgbToFloss(const QVector<flossColor>& rgbColors) {

  QVector<typedFloss> returnFloss;
  returnFloss.reserve(rgbColors.size());
  const QVector<floss> dmcFloss = ::initializeDMC();
  const QVector<int> flossCodes = ::rgbToCode(rgbColors);
  for (int i = 0, size = rgbColors.size(); i < size; ++i) {
    const flossColor thisColor = rgbColors[i];
    if (thisColor.type() == flossDMC) {
      const int dmcIndex = dmcFloss.indexOf(floss(thisColor.color()));
      if (dmcIndex != -1) { // (paranoia check)
        const floss thisDmcFloss = dmcFloss[dmcIndex];
        returnFloss.push_back(typedFloss(thisDmcFloss, flossDMC));
      }
      else {
        qWarning() << "DMC color not found in rgbToFloss: " <<
          ::ctos(thisColor.color());
        returnFloss.push_back(typedFloss(-1, "ERROR", thisColor.color(),
                                         thisColor.type()));
      }
    }
    else {
      const triC closestDmcColor = ::transformColor(thisColor.color(),
                                                    flossDMC);
      const int dmcIndex = dmcFloss.indexOf(floss(closestDmcColor));
      if (dmcIndex != -1) { // (paranoia check)
        const floss closestDmcFloss = dmcFloss[dmcIndex];
        const QString dmcApproximation =
          "~" + QString::number(closestDmcFloss.code()) + ":" +
          closestDmcFloss.name();
        returnFloss.push_back(typedFloss(flossCodes[i], dmcApproximation,
                                         thisColor.color(), thisColor.type()));
      }
      else {
        qWarning() << "DMC transform failed in rgbToFloss: " <<
          ::ctos(thisColor.color()) << thisColor.type().value() <<
          ::ctos(closestDmcColor);
        returnFloss.push_back(typedFloss(-1, "ERROR", thisColor.color(),
                                         thisColor.type()));
      }
    }
  }
  return returnFloss;
}
Example #4
0
typedFloss rgbToFloss(const flossColor& color) {

  // Keep this in sync with rgbToFloss(const QVector<flossColor>& colors).
  const flossTypeValue type = color.type().value();
  if (type == flossDMC) {
    const QVector<floss> dmcColors = ::initializeDMC();
    const int index = dmcColors.indexOf(floss(color.color()));
    if (index != -1) {
      const floss thisDmcFloss = dmcColors[index];
      return typedFloss(thisDmcFloss, flossDMC);
    }
  }
  else if (type == flossAnchor) {
    const QVector<floss> anchorColors = ::initializeAnchor();
    const int index = anchorColors.indexOf(floss(color.color()));
    if (index != -1) {
      const floss thisAnchorFloss = anchorColors[index];
      return typedFloss(thisAnchorFloss, flossAnchor);
    }
  }

  return typedFloss(floss(color.color()), flossVariable);
}