📄 tinyjpeg.cxx
字号:
******************************************************************************/
static unsigned char clamp(int i)
{
if (i<0)
return 0;
else if (i>255)
return 255;
else
return i;
}
/**
* YCrCb -> YUV420P (1x1)
* .---.
* | 1 |
* `---'
*/
static void YCrCB_to_YUV420P_1x1(struct jdec_private *priv)
{
const unsigned char *s, *y;
unsigned char *p;
int i,j;
p = priv->plane[0];
y = priv->Y;
for (i=0; i<8; i++)
{
memcpy(p, y, 8);
p+=priv->width;
y+=8;
}
p = priv->plane[1];
s = priv->Cb;
for (i=0; i<8; i+=2)
{
for (j=0; j<8; j+=2, s+=2)
*p++ = *s;
s += 8; /* Skip one line */
p += priv->width/2 - 4;
}
p = priv->plane[2];
s = priv->Cr;
for (i=0; i<8; i+=2)
{
for (j=0; j<8; j+=2, s+=2)
*p++ = *s;
s += 8; /* Skip one line */
p += priv->width/2 - 4;
}
}
/**
* YCrCb -> YUV420P (2x1)
* .-------.
* | 1 | 2 |
* `-------'
*/
static void YCrCB_to_YUV420P_2x1(struct jdec_private *priv)
{
unsigned char *p;
const unsigned char *s, *y1;
int i,j;
p = priv->plane[0];
y1 = priv->Y;
for (i=0; i<8; i++)
{
memcpy(p, y1, 16);
p += priv->width;
y1 += 16;
}
p = priv->plane[1];
s = priv->Cb;
for (i=0; i<8; i+=2)
{
for (j=0; j<8; j+=1, s+=1)
*p++ = *s;
s += 8; /* Skip one line */
p += priv->width/2 - 8;
}
p = priv->plane[2];
s = priv->Cr;
for (i=0; i<8; i+=2)
{
for (j=0; j<8; j+=1, s+=1)
*p++ = *s;
s += 8; /* Skip one line */
p += priv->width/2 - 8;
}
}
/**
* YCrCb -> YUV420P (1x2)
* .---.
* | 1 |
* |---|
* | 2 |
* `---'
*/
static void YCrCB_to_YUV420P_1x2(struct jdec_private *priv)
{
const unsigned char *s, *y;
unsigned char *p;
int i,j;
p = priv->plane[0];
y = priv->Y;
for (i=0; i<16; i++)
{
memcpy(p, y, 8);
p+=priv->width;
y+=8;
}
p = priv->plane[1];
s = priv->Cb;
for (i=0; i<8; i++)
{
for (j=0; j<8; j+=2, s+=2)
*p++ = *s;
p += priv->width/2 - 4;
}
p = priv->plane[2];
s = priv->Cr;
for (i=0; i<8; i++)
{
for (j=0; j<8; j+=2, s+=2)
*p++ = *s;
p += priv->width/2 - 4;
}
}
/**
* YCrCb -> YUV420P (2x2)
* .-------.
* | 1 | 2 |
* |---+---|
* | 3 | 4 |
* `-------'
*/
static void YCrCB_to_YUV420P_2x2(struct jdec_private *priv)
{
unsigned char *p;
const unsigned char *s, *y1;
unsigned int i;
p = priv->plane[0];
y1 = priv->Y;
for (i=0; i<16; i++)
{
memcpy(p, y1, 16);
p += priv->width;
y1 += 16;
}
p = priv->plane[1];
s = priv->Cb;
for (i=0; i<8; i++)
{
memcpy(p, s, 8);
s += 8;
p += priv->width/2;
}
p = priv->plane[2];
s = priv->Cr;
for (i=0; i<8; i++)
{
memcpy(p, s, 8);
s += 8;
p += priv->width/2;
}
}
/**
* YCrCb -> RGB24 (1x1)
* .---.
* | 1 |
* `---'
*/
static void YCrCB_to_RGB24_1x1(struct jdec_private *priv)
{
const unsigned char *Y, *Cb, *Cr;
unsigned char *p;
int i,j;
int offset_to_next_row;
#define SCALEBITS 10
#define ONE_HALF (1UL << (SCALEBITS-1))
#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5))
p = priv->plane[0];
Y = priv->Y;
Cb = priv->Cb;
Cr = priv->Cr;
offset_to_next_row = priv->width*3 - 8*3;
for (i=0; i<8; i++) {
for (j=0;j<8;j++) {
int y, cb, cr;
int add_r, add_g, add_b;
int r, g , b;
y = (*Y++) << SCALEBITS;
cb = *Cb++ - 128;
cr = *Cr++ - 128;
add_r = FIX(1.40200) * cr + ONE_HALF;
add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;
add_b = FIX(1.77200) * cb + ONE_HALF;
r = (y + add_r) >> SCALEBITS;
*p++ = clamp(r);
g = (y + add_g) >> SCALEBITS;
*p++ = clamp(g);
b = (y + add_b) >> SCALEBITS;
*p++ = clamp(b);
}
p += offset_to_next_row;
}
#undef SCALEBITS
#undef ONE_HALF
#undef FIX
}
/**
* YCrCb -> BGR24 (1x1)
* .---.
* | 1 |
* `---'
*/
static void YCrCB_to_BGR24_1x1(struct jdec_private *priv)
{
const unsigned char *Y, *Cb, *Cr;
unsigned char *p;
int i,j;
int offset_to_next_row;
#define SCALEBITS 10
#define ONE_HALF (1UL << (SCALEBITS-1))
#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5))
p = priv->plane[0];
Y = priv->Y;
Cb = priv->Cb;
Cr = priv->Cr;
offset_to_next_row = priv->width*3 - 8*3;
for (i=0; i<8; i++) {
for (j=0;j<8;j++) {
int y, cb, cr;
int add_r, add_g, add_b;
int r, g , b;
y = (*Y++) << SCALEBITS;
cb = *Cb++ - 128;
cr = *Cr++ - 128;
add_r = FIX(1.40200) * cr + ONE_HALF;
add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;
add_b = FIX(1.77200) * cb + ONE_HALF;
b = (y + add_b) >> SCALEBITS;
*p++ = clamp(b);
g = (y + add_g) >> SCALEBITS;
*p++ = clamp(g);
r = (y + add_r) >> SCALEBITS;
*p++ = clamp(r);
}
p += offset_to_next_row;
}
#undef SCALEBITS
#undef ONE_HALF
#undef FIX
}
/**
* YCrCb -> RGB24 (2x1)
* .-------.
* | 1 | 2 |
* `-------'
*/
static void YCrCB_to_RGB24_2x1(struct jdec_private *priv)
{
const unsigned char *Y, *Cb, *Cr;
unsigned char *p;
int i,j;
int offset_to_next_row;
#define SCALEBITS 10
#define ONE_HALF (1UL << (SCALEBITS-1))
#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5))
p = priv->plane[0];
Y = priv->Y;
Cb = priv->Cb;
Cr = priv->Cr;
offset_to_next_row = priv->width*3 - 16*3;
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
int y, cb, cr;
int add_r, add_g, add_b;
int r, g , b;
y = (*Y++) << SCALEBITS;
cb = *Cb++ - 128;
cr = *Cr++ - 128;
add_r = FIX(1.40200) * cr + ONE_HALF;
add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;
add_b = FIX(1.77200) * cb + ONE_HALF;
r = (y + add_r) >> SCALEBITS;
*p++ = clamp(r);
g = (y + add_g) >> SCALEBITS;
*p++ = clamp(g);
b = (y + add_b) >> SCALEBITS;
*p++ = clamp(b);
y = (*Y++) << SCALEBITS;
r = (y + add_r) >> SCALEBITS;
*p++ = clamp(r);
g = (y + add_g) >> SCALEBITS;
*p++ = clamp(g);
b = (y + add_b) >> SCALEBITS;
*p++ = clamp(b);
}
p += offset_to_next_row;
}
#undef SCALEBITS
#undef ONE_HALF
#undef FIX
}
/*
* YCrCb -> BGR24 (2x1)
* .-------.
* | 1 | 2 |
* `-------'
*/
static void YCrCB_to_BGR24_2x1(struct jdec_private *priv)
{
const unsigned char *Y, *Cb, *Cr;
unsigned char *p;
int i,j;
int offset_to_next_row;
#define SCALEBITS 10
#define ONE_HALF (1UL << (SCALEBITS-1))
#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5))
p = priv->plane[0];
Y = priv->Y;
Cb = priv->Cb;
Cr = priv->Cr;
offset_to_next_row = priv->width*3 - 16*3;
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
int y, cb, cr;
int add_r, add_g, add_b;
int r, g , b;
cb = *Cb++ - 128;
cr = *Cr++ - 128;
add_r = FIX(1.40200) * cr + ONE_HALF;
add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;
add_b = FIX(1.77200) * cb + ONE_HALF;
y = (*Y++) << SCALEBITS;
b = (y + add_b) >> SCALEBITS;
*p++ = clamp(b);
g = (y + add_g) >> SCALEBITS;
*p++ = clamp(g);
r = (y + add_r) >> SCALEBITS;
*p++ = clamp(r);
y = (*Y++) << SCALEBITS;
b = (y + add_b) >> SCALEBITS;
*p++ = clamp(b);
g = (y + add_g) >> SCALEBITS;
*p++ = clamp(g);
r = (y + add_r) >> SCALEBITS;
*p++ = clamp(r);
}
p += offset_to_next_row;
}
#undef SCALEBITS
#undef ONE_HALF
#undef FIX
}
/**
* YCrCb -> RGB24 (1x2)
* .---.
* | 1 |
* |---|
* | 2 |
* `---'
*/
static void YCrCB_to_RGB24_1x2(struct jdec_private *priv)
{
const unsigned char *Y, *Cb, *Cr;
unsigned char *p, *p2;
int i,j;
int offset_to_next_row;
#define SCALEBITS 10
#define ONE_HALF (1UL << (SCALEBITS-1))
#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5))
p = priv->plane[0];
p2 = priv->plane[0] + priv->width*3;
Y = priv->Y;
Cb = priv->Cb;
Cr = priv->Cr;
offset_to_next_row = 2*priv->width*3 - 8*3;
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
int y, cb, cr;
int add_r, add_g, add_b;
int r, g , b;
cb = *Cb++ - 128;
cr = *Cr++ - 128;
add_r = FIX(1.40200) * cr + ONE_HALF;
add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;
add_b = FIX(1.77200) * cb + ONE_HALF;
y = (*Y++) << SCALEBITS;
r = (y + add_r) >> SCALEBITS;
*p++ = clamp(r);
g = (y + add_g) >> SCALEBITS;
*p++ = clamp(g);
b = (y + add_b) >> SCALEBITS;
*p++ = clamp(b);
y = (Y[8-1]) << SCALEBITS;
r = (y + add_r) >> SCALEBITS;
*p2++ = clamp(r);
g = (y + add_g) >> SCALEBITS;
*p2++ = clamp(g);
b = (y + add_b) >> SCALEBITS;
*p2++ = clamp(b);
}
Y += 8;
p += offset_to_next_row;
p2 += offset_to_next_row;
}
#undef SCALEBITS
#undef ONE_HALF
#undef FIX
}
/*
* YCrCb -> BGR24 (1x2)
* .---.
* | 1 |
* |---|
* | 2 |
* `---'
*/
static void YCrCB_to_BGR24_1x2(struct jdec_private *priv)
{
const unsigned char *Y, *Cb, *Cr;
unsigned char *p, *p2;
int i,j;
int offset_to_next_row;
#define SCALEBITS 10
#define ONE_HALF (1UL << (SCALEBITS-1))
#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5))
p = priv->plane[0];
p2 = priv->plane[0] + priv->width*3;
Y = priv->Y;
Cb = priv->Cb;
Cr = priv->Cr;
offset_to_next_row = 2*priv->width*3 - 8*3;
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
int y, cb, cr;
int add_r, add_g, add_b;
int r, g , b;
cb = *Cb++ - 128;
cr = *Cr++ - 128;
add_r = FIX(1.40200) * cr + ONE_HALF;
add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -