Listing 2: The weighted averaging routines
unsigned char LP::Reduce3x3 (const unsigned char *block, unsigned width) { // Reduce a block using a 3 by 3 equivalent weighting function unsigned r; r = *block; // First row r += *++block * 2; r += *++block; block += width - 2; r += *block * 2; // Second row r += *++block * 4; r += *++block * 2; block += width - 2; r += *block; // Third row r += *++block * 2; r += *++block; return r / 16; } unsigned char LP::Reduce2x3 (const unsigned char *block, unsigned width) { // Reduce a block using a 3 by 3 equivalent weighting function // Reflect left column to right column unsigned r; r = *block * 2; // First row r += *++block * 2; block += width - 1; r += *block * 4; // Second row r += *++block * 4; block += width - 1; r += *block * 2; // Third row r += *++block * 2; return r / 16; } unsigned char LP::Reduce3x2 (const unsigned char *block, unsigned width) { // Reduce a block using a 3 by 3 equivalent weighting function // Reflect top row to bottom row unsigned r; r = *block * 2; // First row r += *++block * 4; r += *++block * 2; block += width - 2; r += *block * 2; // Second row r += *++block * 4; r += *++block * 2; return r / 16; } unsigned char LP::Reduce2x2 (const unsigned char *block, unsigned width) { // Reduce a block using a 3 by 3 equivalent weighting function // Reflect left column to right column // Reflect top row to bottom row unsigned r; r = *block * 4; // First row r += *++block * 4; block += width - 1; r += *block * 4; // Second row r += *++block * 4; return r / 16; } //End of File