static inline float _qtcGradientGetValue(float *gradient, size_t size, float distance) { if (distance < 0 || distance > size - 1) { return 0; } int index = floorf(distance); if (qtcEqual(index, distance)) { return gradient[index]; } return (gradient[index] * (index + 1 - distance) + gradient[index + 1] * (distance - index)); }
void qtcShade(const Options *opts, const color *ca, color *cb, double k) #endif { if(qtcEqual(k, 1.0)) { #ifdef __cplusplus *cb=ca; #else cb->red = ca->red; cb->green = ca->green; cb->blue = ca->blue; #endif } else switch(opts->shading) { case SHADING_SIMPLE: { #ifdef __cplusplus int v=(int)(255.0*(k-1.0)); cb->setRgb(qtcLimit(ca.red()+v), qtcLimit(ca.green()+v), qtcLimit(ca.blue()+v)); #else double v=65535.0*(k-1.0); cb->red = qtcLimit(ca->red+v); cb->green = qtcLimit(ca->green+v); cb->blue = qtcLimit(ca->blue+v); #endif break; } case SHADING_HSL: { #ifdef __cplusplus double r(ca.red()/255.0), g(ca.green()/255.0), b(ca.blue()/255.0); #else double r=ca->red/65535.0, g=ca->green/65535.0, b=ca->blue/65535.0; #endif double h, s, l; rgbToHsl(r, g, b, &h, &s, &l); l=normalize(l*k); s=normalize(s*k); hslToRgb(h, s, l, &r, &g, &b); #ifdef __cplusplus cb->setRgb(qtcLimit(r*255.0), qtcLimit(g*255.0), qtcLimit(b*255.0)); #else cb->red=qtcLimit(r*65535.0); cb->green=qtcLimit(g*65535.0); cb->blue=qtcLimit(b*65535.0); #endif break; } case SHADING_HSV: { #ifdef __cplusplus double r(ca.red()/255.0), g(ca.green()/255.0), b(ca.blue()/255.0); #else double r=ca->red/65535.0, g=ca->green/65535.0, b=ca->blue/65535.0; #endif double h, s, v; qtcRgbToHsv(r, g, b, &h, &s, &v); v*=k; if (v > 1.0) { s -= v - 1.0; if (s < 0) s = 0; v = 1.0; } qtcHsvToRgb(&r, &g, &b, h, s, v); #ifdef __cplusplus cb->setRgb(qtcLimit(r*255.0), qtcLimit(g*255.0), qtcLimit(b*255.0)); #else cb->red=qtcLimit(r*65535.0); cb->green=qtcLimit(g*65535.0); cb->blue=qtcLimit(b*65535.0); #endif break; } case SHADING_HCY: { #define HCY_FACTOR 0.15 #if defined QT_VERSION && (QT_VERSION >= 0x040000) && defined QTC_QT4_ENABLE_KDE if(k>1.0) *cb=KColorUtils::lighten(ca, (k*(1+HCY_FACTOR))-1.0, 1.0); else *cb=KColorUtils::darken(ca, 1.0-(k*(1-HCY_FACTOR)), 1.0); #elif defined __cplusplus if(k>1.0) *cb=ColorUtils_lighten(&ca, (k*(1+HCY_FACTOR))-1.0, 1.0); else *cb=ColorUtils_darken(&ca, 1.0-(k*(1-HCY_FACTOR)), 1.0); #else if(k>1.0) *cb=ColorUtils_lighten(ca, (k*(1+HCY_FACTOR))-1.0, 1.0); else *cb=ColorUtils_darken(ca, 1.0-(k*(1-HCY_FACTOR)), 1.0); #endif } } #if defined __cplusplus && defined QT_VERSION && (QT_VERSION >= 0x040000) cb->setAlpha(ca.alpha()); #endif #ifndef __cplusplus cb->pixel = ca->pixel; #endif }