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