15bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com
2f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/*
35bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Copyright 2008 The Android Open Source Project
4f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com *
55bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Use of this source code is governed by a BSD-style license that can be
65bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * found in the LICENSE file.
7f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com */
8f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
9f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
10f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
11f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
125bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com
13f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#ifndef SkUnPreMultiply_DEFINED
14f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#define SkUnPreMultiply_DEFINED
15f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
16f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#include "SkColor.h"
17f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
182083387d719b933797044ad07efd3bb67f99a5c5ctguil@chromium.orgclass SK_API SkUnPreMultiply {
19f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.compublic:
20f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    typedef uint32_t Scale;
211fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
22f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    // index this table with alpha [0..255]
23f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    static const Scale* GetScaleTable() {
24f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        return gTable;
25f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    }
26f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
27f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    static Scale GetScale(U8CPU alpha) {
28f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        SkASSERT(alpha <= 255);
29f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        return gTable[alpha];
30f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    }
311fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
32f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    /** Usage:
331fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
34f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        const Scale* table = SkUnPreMultiply::GetScaleTable();
351fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
36f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        for (...) {
37f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com            unsigned a = ...
38f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com            SkUnPreMultiply::Scale scale = table[a];
391fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
40f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com            red = SkUnPreMultiply::ApplyScale(scale, red);
41f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com            ...
42f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com            // now red is unpremultiplied
43f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        }
44f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    */
45f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    static U8CPU ApplyScale(Scale scale, U8CPU component) {
46f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        SkASSERT(component <= 255);
47f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        return (scale * component + (1 << 23)) >> 24;
48f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    }
491fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
50f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    static SkColor PMColorToColor(SkPMColor c);
511fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
52f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprivate:
53f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    static const uint32_t gTable[256];
54f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com};
55f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
56f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#endif
57