/*----------------------------------------------------------------------------- Name : teColorAdjust Description : Adjust a color according to a HLS colorizing table. Inputs : baseColor - origional color colorize - HLS parameters to adjust by. Outputs : Return : newly adjusted color ----------------------------------------------------------------------------*/ color teColorAdjust(color baseColor, trhlscolorize *colorize) { real32 red, green, blue, hue, lum, sat; colRGBToHLS(&hue, &lum, &sat, colUbyteToReal(colRed(baseColor)), colUbyteToReal(colGreen(baseColor)), colUbyteToReal(colBlue(baseColor))); hue += colorize->hue; if (hue < 0) { hue += 1.0f; } if (hue > 1.0f) { hue -= 1.0f; } lum *= colorize->lum; sat *= colorize->sat; if (lum > 1.0f) { lum = 1.0f; } if (sat > 1.0f) { sat = 1.0f; } colHLSToRGB(&red, &green, &blue, hue, lum, sat); return(colRGB(colRealToUbyte(red), colRealToUbyte(green), colRealToUbyte(blue))); }
//This one not a perfect copy, but pretty close void liBlendColor(color *buffer, color *layer, real32 opacity, sdword nPixels) { real32 redSource, greenSource, blueSource, alpha; real32 redDest, greenDest, blueDest;//, alphaDest; real32 oneMinusAlpha; real32 hueS, satS, hueD, satD, lumS, lumD; real32 clumD, clumS; real32 redTemp, greenTemp, blueTemp; #if LI_VERBOSE_LEVEL >= 2 dbgMessagef("\nColor: Blending mode not implemented perfectly."); #endif while (nPixels > 0) { alpha = colUbyteToReal(colAlpha(*layer)) * opacity; oneMinusAlpha = 1.0f - alpha; redSource = colUbyteToReal(colRed(*layer)); //read pixel to floating point greenSource = colUbyteToReal(colGreen(*layer)); blueSource = colUbyteToReal(colBlue(*layer)); redDest = colUbyteToReal(colRed(*buffer)); greenDest = colUbyteToReal(colGreen(*buffer)); blueDest = colUbyteToReal(colBlue(*buffer)); clumS = (redSource * LI_RedGamma + greenSource * LI_GreenGamma + blueSource * LI_BlueGamma) / LI_TotalGamma; clumD = (redDest * LI_RedGamma + greenDest * LI_GreenGamma + blueDest * LI_BlueGamma) / LI_TotalGamma; colRGBToHLS(&hueS, &lumS, &satS, redSource, greenSource, blueSource); colRGBToHLS(&hueD, &lumD, &satD, redDest, greenDest, blueDest); colHLSToRGB(&redTemp, &greenTemp, &blueTemp, hueS, clumD, satS); redDest = redTemp * alpha + redDest * oneMinusAlpha; greenDest = greenTemp * alpha + greenDest * oneMinusAlpha; blueDest = blueTemp * alpha + blueDest * oneMinusAlpha; redDest = min(redDest, 1.0f); greenDest = min(greenDest, 1.0f); blueDest = min(blueDest, 1.0f); *buffer = colRGB(colRealToUbyte(redDest), colRealToUbyte(greenDest), colRealToUbyte(blueDest)); buffer++; layer++; nPixels--; } }