Ejemplo n.º 1
0
SkColorFilterImageFilter* SkColorFilterImageFilter::Create(SkColorFilter* cf,
        SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID) {
    if (NULL == cf) {
        return NULL;
    }

    SkColorFilter* inputColorFilter;
    if (input && input->asColorFilter(&inputColorFilter) && inputColorFilter) {
        SkAutoUnref autoUnref(inputColorFilter);

        // Try to collapse two consecutive matrix filters
        SkScalar colorMatrix[20], inputMatrix[20];
        if (cf->asColorMatrix(colorMatrix) && inputColorFilter->asColorMatrix(inputMatrix)
                                           && !matrix_needs_clamping(inputMatrix)) {
            SkScalar combinedMatrix[20];
            mult_color_matrix(colorMatrix, inputMatrix, combinedMatrix);
            SkAutoTUnref<SkColorFilter> newCF(SkColorMatrixFilter::Create(combinedMatrix));
            return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect, 0));
        }

        // Try to collapse two consecutive table filters
        SkBitmap colorTable, inputTable;
        if (cf->asComponentTable(&colorTable) && inputColorFilter->asComponentTable(&inputTable)) {
            uint8_t combinedTable[4 * 256];
            SkAutoLockPixels colorLock(colorTable);
            SkAutoLockPixels inputLock(inputTable);

            combine_color_tables(colorTable.getAddr8(0, 0), inputTable.getAddr8(0, 0),
                                 combinedTable);
            SkAutoTUnref<SkColorFilter> newCF(SkTableColorFilter::CreateARGB(
                        &combinedTable[256 * 0],
                        &combinedTable[256 * 1],
                        &combinedTable[256 * 2],
                        &combinedTable[256 * 3])
            );

            return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect, 0));
        }
    }

    return SkNEW_ARGS(SkColorFilterImageFilter, (cf, input, cropRect, uniqueID));
}