1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7b67eb2f9b9ec097aa963245a85be13daec09d2ccreed
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorMatrixFilter.h"
90daf5dd7fc682c939325e16cac6f8aa2e1295060reed
100daf5dd7fc682c939325e16cac6f8aa2e1295060reedstatic SkScalar byte_to_scale(U8CPU byte) {
110daf5dd7fc682c939325e16cac6f8aa2e1295060reed    if (0xFF == byte) {
120daf5dd7fc682c939325e16cac6f8aa2e1295060reed        // want to get this exact
130daf5dd7fc682c939325e16cac6f8aa2e1295060reed        return 1;
140daf5dd7fc682c939325e16cac6f8aa2e1295060reed    } else {
150daf5dd7fc682c939325e16cac6f8aa2e1295060reed        return byte * 0.00392156862745f;
160daf5dd7fc682c939325e16cac6f8aa2e1295060reed    }
170daf5dd7fc682c939325e16cac6f8aa2e1295060reed}
180daf5dd7fc682c939325e16cac6f8aa2e1295060reed
190daf5dd7fc682c939325e16cac6f8aa2e1295060reedSkColorFilter* SkColorMatrixFilter::CreateLightingFilter(SkColor mul, SkColor add) {
200698300cc567384d6c528b5b1757ed8abe930dc5Chris Craik    if (0 == add) {
210698300cc567384d6c528b5b1757ed8abe930dc5Chris Craik        return SkColorFilter::CreateModeFilter(mul | SK_ColorBLACK,
220698300cc567384d6c528b5b1757ed8abe930dc5Chris Craik                                               SkXfermode::Mode::kModulate_Mode);
230698300cc567384d6c528b5b1757ed8abe930dc5Chris Craik    }
240daf5dd7fc682c939325e16cac6f8aa2e1295060reed    SkColorMatrix matrix;
250daf5dd7fc682c939325e16cac6f8aa2e1295060reed    matrix.setScale(byte_to_scale(SkColorGetR(mul)),
260daf5dd7fc682c939325e16cac6f8aa2e1295060reed                    byte_to_scale(SkColorGetG(mul)),
270daf5dd7fc682c939325e16cac6f8aa2e1295060reed                    byte_to_scale(SkColorGetB(mul)),
280daf5dd7fc682c939325e16cac6f8aa2e1295060reed                    1);
290daf5dd7fc682c939325e16cac6f8aa2e1295060reed    matrix.postTranslate(SkIntToScalar(SkColorGetR(add)),
300daf5dd7fc682c939325e16cac6f8aa2e1295060reed                         SkIntToScalar(SkColorGetG(add)),
310daf5dd7fc682c939325e16cac6f8aa2e1295060reed                         SkIntToScalar(SkColorGetB(add)),
320daf5dd7fc682c939325e16cac6f8aa2e1295060reed                         0);
330daf5dd7fc682c939325e16cac6f8aa2e1295060reed    return SkColorMatrixFilter::Create(matrix);
340daf5dd7fc682c939325e16cac6f8aa2e1295060reed}
35