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