STColor4ub::STColor4ub(const STColor4f& c) : r(clampComponent(c.r)) , g(clampComponent(c.g)) , b(clampComponent(c.b)) , a(clampComponent(c.a)) { }
STColor4ub::STColor4ub(const STColor3f& c, Component _a) : r(clampComponent(c.r)) , g(clampComponent(c.g)) , b(clampComponent(c.b)) , a(_a) { }
void gammaCorrection(Bitmap* bitmap) { unsigned char* red = (*bitmap).red; unsigned char* green = (*bitmap).green; unsigned char* blue = (*bitmap).blue; unsigned int length = (*bitmap).width * (*bitmap).height; unsigned int i; float redAverage = 0; float greenAverage = 0; float blueAverage = 0; unsigned int n = 1; for (i = 0; i < length; i++) { redAverage = ((n-1)*redAverage + red[i])/n; greenAverage = ((n-1)*greenAverage + green[i])/n; blueAverage = ((n-1)*blueAverage + blue[i])/n; n++; } float gammaRed = log(128.0f/255)/log(redAverage/255); float gammaGreen = log(128.0f/255)/log(greenAverage/255); float gammaBlue = log(128.0f/255)/log(blueAverage/255); int redLut[256]; int greenLut[256]; int blueLut[256]; for (i = 0; i < 256; i++) { redLut[i] = -1; greenLut[i] = -1; blueLut[i] = -1; } for (i = 0; i < length; i++) { if (redLut[red[i]] == -1) { redLut[red[i]] = clampComponent(255.0f * powf((red[i]/255.0f), gammaRed)); } red[i] = redLut[red[i]]; if (greenLut[green[i]] == -1) { greenLut[green[i]] = clampComponent(255.0f * powf((green[i]/255.0f), gammaGreen)); } green[i] = greenLut[green[i]]; if (blueLut[blue[i]] == -1) { blueLut[blue[i]] = clampComponent(255.0f * powf((blue[i]/255.0f), gammaBlue)); } blue[i] = blueLut[blue[i]]; } }
// amount is 0.0 to 1.0 // threshold is 0 to 255 int unsharpMask(Bitmap* bitmap, int radius, float amount, int threshold) { unsigned char* red = (*bitmap).red; unsigned char* green = (*bitmap).green; unsigned char* blue = (*bitmap).blue; unsigned int length = (*bitmap).width * (*bitmap).height; // Create blur unsigned char* blurRed; unsigned char* blurGreen; unsigned char* blurBlue; int resultCode = newUnsignedCharArray(length, &blurRed); if (resultCode != MEMORY_OK) { return resultCode; } resultCode = newUnsignedCharArray(length, &blurGreen); if (resultCode != MEMORY_OK) { freeUnsignedCharArray(&blurRed); return resultCode; } resultCode = newUnsignedCharArray(length, &blurBlue); if (resultCode != MEMORY_OK) { freeUnsignedCharArray(&blurRed); freeUnsignedCharArray(&blurGreen); return resultCode; } float blurRadius = radius/3.0f; resultCode = stackBlur(&blurRadius, (*bitmap).red, (*bitmap).green, (*bitmap).blue, &((*bitmap).width), &((*bitmap).height), blurRed, blurGreen, blurBlue); if (resultCode != MEMORY_OK) { freeUnsignedCharArray(&blurRed); freeUnsignedCharArray(&blurGreen); freeUnsignedCharArray(&blurBlue); return resultCode; } int i, j; short int lut[256][256]; float a = (4 * amount) + 1; for (i = 0; i < 256; i++) { for (j = 0; j < 256; j++) { lut[i][j] = -1;//clampComponent((int) (a * (i - j) + j)); } } for (i = length; i--;) { int r1 = red[i]; int g1 = green[i]; int b1 = blue[i]; int r2 = blurRed[i]; int g2 = blurGreen[i]; int b2 = blurBlue[i]; if (fabs(r1 - r2) >= threshold) { if (lut[r1][r2] == -1) { lut[r1][r2] = clampComponent((int) ((a + 1) * (r1 - r2) + r2)); } r1 = lut[r1][r2]; //clampComponent((int) ((a + 1) * (r1 - r2) + r2)); } if (fabs(g1 - g2) >= threshold) { if (lut[g1][g2] == -1) { lut[g1][g2] = clampComponent((int) ((a + 1) * (g1 - g2) + g2)); } g1 = lut[g1][g2]; //clampComponent((int) ((a + 1) * (g1 - g2) + g2)); } if (fabs(b1 - b2) >= threshold) { if (lut[b1][b2] == -1) { lut[b1][b2] = clampComponent((int) ((a + 1) * (b1 - b2) + b2)); } b1 = lut[b1][b2]; //clampComponent((int) ((a + 1) * (b1 - b2) + b2)); } red[i] = r1; green[i] = g1; blue[i] = b1; } freeUnsignedCharArray(&blurRed); freeUnsignedCharArray(&blurGreen); freeUnsignedCharArray(&blurBlue); }