71 lines
1.7 KiB
C
71 lines
1.7 KiB
C
/* this file contains a template for the RGB color filter algorithm
|
|
* it is included several times by "ftrgb.c"
|
|
*/
|
|
#ifndef OFF_R
|
|
#error "OFF_R must be defined as the offset of the red channel"
|
|
#endif
|
|
|
|
#ifndef OFF_G
|
|
#error "OFF_G must be defiend as the offset of the green channel"
|
|
#endif
|
|
|
|
#ifndef OFF_B
|
|
#error "OFF_B must be defined as the offset of the blue channel"
|
|
#endif
|
|
|
|
#ifndef HMUL
|
|
#error "HMUL must be defined as the horizontal multiplier, either 1 or 3"
|
|
#endif
|
|
|
|
#ifndef VMUL
|
|
#error "VMUL must be defined as the vertical multipler, either 1 or 3"
|
|
#endif
|
|
|
|
|
|
int hh = oper->height;
|
|
FT_Byte* in_line = oper->in_line;
|
|
FT_Long in_pitch = oper->in_pitch;
|
|
FT_Byte* out_line = oper->out_line;
|
|
FT_Long out_pitch = oper->out_pitch;
|
|
FT_Fixed* mults = oper->factors;
|
|
|
|
for ( ; hh > 0; hh--, in_line += in_pitch*VMUL, out_line += out_pitch )
|
|
{
|
|
int ww = oper->width;
|
|
FT_Byte* read = in_line;
|
|
FT_UInt32* write = (FT_UInt32*)out_line;
|
|
|
|
for ( ; ww > 0; ww--, read += HMUL, write += 1 )
|
|
{
|
|
FT_UInt rr, gg, bb;
|
|
FT_UInt val;
|
|
|
|
val = read[OFF_R];
|
|
rr = mults[0]*val;
|
|
gg = mults[3]*val;
|
|
bb = mults[6]*val;
|
|
|
|
val = read[OFF_G];
|
|
rr += mults[1]*val;
|
|
gg += mults[4]*val;
|
|
bb += mults[7]*val;
|
|
|
|
val = read[OFF_B];
|
|
rr += mults[2]*val;
|
|
gg += mults[5]*val;
|
|
bb += mults[8]*val;
|
|
|
|
rr = (rr >> 16) & 255;
|
|
gg = (gg >> 16) & 255;
|
|
bb = (bb >> 16) & 255;
|
|
|
|
write[0] = (FT_UInt)( (gg << 24) | (rr << 16) | (gg << 8) | bb );
|
|
}
|
|
}
|
|
|
|
#undef OFF_R
|
|
#undef OFF_G
|
|
#undef OFF_B
|
|
#undef HMUL
|
|
#undef VMUL
|