1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/*
3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2008 The Android Open Source Project
4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *
5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file.
7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */
8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkUnPreMultiply_DEFINED
14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkUnPreMultiply_DEFINED
15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkColor.h"
17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SK_API SkUnPreMultiply {
19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic:
20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    typedef uint32_t Scale;
21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // index this table with alpha [0..255]
23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const Scale* GetScaleTable() {
24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return gTable;
25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static Scale GetScale(U8CPU alpha) {
28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(alpha <= 255);
29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return gTable[alpha];
30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    /** Usage:
33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        const Scale* table = SkUnPreMultiply::GetScaleTable();
35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        for (...) {
37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            unsigned a = ...
38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            SkUnPreMultiply::Scale scale = table[a];
39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            red = SkUnPreMultiply::ApplyScale(scale, red);
41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            ...
42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            // now red is unpremultiplied
43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        }
44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    */
45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static U8CPU ApplyScale(Scale scale, U8CPU component) {
46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(component <= 255);
47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return (scale * component + (1 << 23)) >> 24;
48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static SkColor PMColorToColor(SkPMColor c);
51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate:
53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    static const uint32_t gTable[256];
54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
57