Esempio n. 1
0
STColor4ub::STColor4ub(const STColor4f& c)
    : r(clampComponent(c.r))
    , g(clampComponent(c.g))
    , b(clampComponent(c.b))
    , a(clampComponent(c.a))
{
}
Esempio n. 2
0
STColor4ub::STColor4ub(const STColor3f& c, Component _a)
    : r(clampComponent(c.r))
    , g(clampComponent(c.g))
    , b(clampComponent(c.b))
    , a(_a)
{
}
Esempio n. 3
0
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]];
	}
}
Esempio n. 4
0
// 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);
}