QColor ScColorEngine::getDisplayColor(const ScColor& color, const ScribusDoc* doc, double level) { QColor tmp; if (color.getColorModel() == colorModelRGB) { RGBColorF rgb; rgb.r = color.m_values[0]; rgb.g = color.m_values[1]; rgb.b = color.m_values[2]; getShadeColorRGB(color, doc, rgb, level); tmp = getDisplayColor(rgb, doc, color.isSpotColor()); } else if (color.getColorModel() == colorModelCMYK) { CMYKColorF cmyk; cmyk.c = color.m_values[0]; cmyk.m = color.m_values[1]; cmyk.y = color.m_values[2]; cmyk.k = color.m_values[3]; getShadeColorCMYK(color, doc, cmyk, level); tmp = getDisplayColor(cmyk, doc, color.isSpotColor()); } else if (color.getColorModel() == colorModelLab) { ScColorTransform trans = doc ? doc->stdLabToScreenTrans : ScCore->defaultLabToRGBTrans; double inC[3]; inC[0] = 100 - (100 - color.m_L_val) * (level / 100.0); inC[1] = color.m_a_val * (level / 100.0); inC[2] = color.m_b_val * (level / 100.0); quint16 outC[3]; trans.apply(inC, outC, 1); tmp = QColor(outC[0] / 257, outC[1] / 257, outC[2] / 257); } return tmp; }
QColor ScColorEngine::getShadeColorProof(const ScColor& color, const ScribusDoc* doc, double level) { QColor tmp; bool doGC = doc ? doc->Gamut : false; bool cmsUse = doc ? doc->HasCMS : false; bool softProof = doc ? doc->SoftProofing : false; if (color.getColorModel() == colorModelRGB) { RGBColor rgb; rgb.r = color.CR; rgb.g = color.MG; rgb.b = color.YB; getShadeColorRGB(color, doc, rgb, level); // Match 133x behavior for rgb grey until we are able to make rgb profiled output // (RGB greys map to cmyk greys) if ((cmsUse && softProof) && (rgb.r == rgb.g && rgb.g == rgb.b)) { doGC = false; CMYKColor cmyk; cmyk.c = cmyk.m = cmyk.y = 0; cmyk.k = 255 - rgb.g; tmp = getColorProof(cmyk, doc, color.isSpotColor(), doGC); } else tmp = getColorProof(rgb, doc, color.isSpotColor(), doGC); } else { CMYKColor cmyk; cmyk.c = color.CR; cmyk.m = color.MG; cmyk.y = color.YB; cmyk.k = color.K; getShadeColorCMYK(color, doc, cmyk, level); tmp = getColorProof(cmyk, doc, color.isSpotColor(), doGC); } return tmp; }
void ScColorEngine::getShadeColorRGB(const ScColor& color, const ScribusDoc* doc, RGBColorF& rgb, double level) { if (color.getColorModel() == colorModelCMYK) { CMYKColorF cmyk; getShadeColorCMYK(color, doc, cmyk, level); ScColor tmpC; tmpC.setColorF(cmyk.c, cmyk.m, cmyk.y, cmyk.k); getRGBValues(tmpC, doc, rgb); } else if (color.getColorModel() == colorModelRGB) { HSVColorF hsv; color.getRawRGBColor(&rgb); rgb.toHsv(hsv); hsv.s = hsv.s * (level / 100.0); hsv.v = 1.0 - (1.0 - hsv.v) * (level / 100.0); hsv.toRgb(rgb); //We could also compute rgb shade using rgb directly /*rgb.r = 1.0 - ((1.0 - color.m_values[0]) * level / 100); rgb.g = 1.0 - ((1.0 - color.m_values[1]) * level / 100); rgb.b = 1.0 - ((1.0 - color.m_values[2]) * level / 100);*/ } else if (color.getColorModel() == colorModelLab) { ScColorTransform trans = doc ? doc->stdLabToRGBTrans : ScCore->defaultLabToRGBTrans; double inC[3]; inC[0] = 100 - (100 - color.m_L_val) * (level / 100.0); inC[1] = color.m_a_val * (level / 100.0); inC[2] = color.m_b_val * (level / 100.0); quint16 outC[3]; trans.apply(inC, outC, 1); rgb.r = outC[0] / 65535.0; rgb.g = outC[1] / 65535.0; rgb.b = outC[2] / 65535.0; } }
void ScColorEngine::getShadeColorRGB(const ScColor& color, const ScribusDoc* doc, RGBColor& rgb, double level) { if (color.getColorModel() == colorModelCMYK) { CMYKColor cmyk; getShadeColorCMYK(color, doc, cmyk, level); ScColor tmpC(cmyk.c, cmyk.m, cmyk.y, cmyk.k); getRGBValues(tmpC, doc, rgb); } else if (color.getColorModel() == colorModelRGB) { int h, s, v, snew, vnew; QColor tmpR(color.CR, color.MG, color.YB); tmpR.getHsv(&h, &s, &v); snew = qRound(s * level / 100.0); vnew = 255 - qRound(((255 - v) * level / 100.0)); tmpR.setHsv(h, snew, vnew); tmpR.getRgb(&rgb.r, &rgb.g, &rgb.b); //We could also compute rgb shade using rgb directly /*rgb.CR = 255 - ((255 - color.CR) * level / 100); rgb.MG = 255 - ((255 - color.MG) * level / 100); rgb.YB = 255 - ((255 - color.YB) * level / 100);*/ } else if (color.getColorModel() == colorModelLab) { ScColorTransform trans = doc ? doc->stdLabToRGBTrans : ScCore->defaultLabToRGBTrans; double inC[3]; inC[0] = color.L_val * (level / 100.0); inC[1] = color.a_val; inC[2] = color.b_val; quint16 outC[3]; trans.apply(inC, outC, 1); rgb.r = outC[0] / 257; rgb.g = outC[1] / 257; rgb.b = outC[2] / 257; } }
QColor ScColorEngine::getDisplayColor(const ScColor& color, const ScribusDoc* doc, double level) { QColor tmp; if (color.getColorModel() == colorModelRGB) { RGBColor rgb; rgb.r = color.CR; rgb.g = color.MG; rgb.b = color.YB; getShadeColorRGB(color, doc, rgb, level); tmp = getDisplayColor(rgb, doc, color.isSpotColor()); } else { CMYKColor cmyk; cmyk.c = color.CR; cmyk.m = color.MG; cmyk.y = color.YB; cmyk.k = color.K; getShadeColorCMYK(color, doc, cmyk, level); tmp = getDisplayColor(cmyk, doc, color.isSpotColor()); } return tmp; }
void ScColorEngine::getShadeColorRGB(const ScColor& color, const ScribusDoc* doc, RGBColor& rgb, double level) { if (color.getColorModel() == colorModelCMYK) { CMYKColor cmyk; getShadeColorCMYK(color, doc, cmyk, level); ScColor tmpC(cmyk.c, cmyk.m, cmyk.y, cmyk.k); getRGBValues(tmpC, doc, rgb); } else { int h, s, v, snew, vnew; QColor tmpR(color.CR, color.MG, color.YB); tmpR.getHsv(&h, &s, &v); snew = qRound(s * level / 100.0); vnew = 255 - qRound(((255 - v) * level / 100.0)); tmpR.setHsv(h, snew, vnew); tmpR.getRgb(&rgb.r, &rgb.g, &rgb.b); //We could also compute rgb shade using rgb directly /*rgb.CR = 255 - ((255 - color.CR) * level / 100); rgb.MG = 255 - ((255 - color.MG) * level / 100); rgb.YB = 255 - ((255 - color.YB) * level / 100);*/ } }
QColor ScColorEngine::getShadeColorProof(const ScColor& color, const ScribusDoc* doc, double level) { QColor tmp; bool doGC = doc ? doc->Gamut : false; bool cmsUse = doc ? doc->HasCMS : false; bool softProof = doc ? doc->SoftProofing : false; if (color.getColorModel() == colorModelRGB) { RGBColorF rgb; rgb.r = color.m_values[0]; rgb.g = color.m_values[1]; rgb.b = color.m_values[2]; getShadeColorRGB(color, doc, rgb, level); // Match 133x behavior for rgb grey until we are able to make rgb profiled output // (RGB greys map to cmyk greys) if ((cmsUse && softProof) && (rgb.r == rgb.g && rgb.g == rgb.b)) { doGC = false; CMYKColorF cmyk; cmyk.c = cmyk.m = cmyk.y = 0; cmyk.k = 1.0 - rgb.g; tmp = getColorProof(cmyk, doc, color.isSpotColor(), doGC); } else tmp = getColorProof(rgb, doc, color.isSpotColor(), doGC); } else if (color.getColorModel() == colorModelCMYK) { CMYKColorF cmyk; cmyk.c = color.m_values[0]; cmyk.m = color.m_values[1]; cmyk.y = color.m_values[2]; cmyk.k = color.m_values[3]; getShadeColorCMYK(color, doc, cmyk, level); tmp = getColorProof(cmyk, doc, color.isSpotColor(), doGC); } else if (color.getColorModel() == colorModelLab) { double inC[3]; inC[0] = 100 - (100 - color.m_L_val) * (level / 100.0); inC[1] = color.m_a_val * (level / 100.0); inC[2] = color.m_b_val * (level / 100.0); quint16 outC[3]; ScColorTransform trans = doc ? doc->stdLabToScreenTrans : ScCore->defaultLabToRGBTrans; ScColorTransform transProof = doc ? doc->stdProofLab : ScCore->defaultLabToRGBTrans; ScColorTransform transProofGC = doc ? doc->stdProofLabGC : ScCore->defaultLabToRGBTrans; if (cmsUse && doc && doc->SoftProofing) { ScColorTransform xform = doGC ? transProofGC : transProof; xform.apply(inC, outC, 1); tmp = QColor(outC[0] / 257, outC[1] / 257, outC[2] / 257); } else { trans.apply(inC, outC, 1); tmp = QColor(outC[0] / 257, outC[1] / 257, outC[2] / 257); } } return tmp; }