blob: ea2f47c4a5c96fabc61a53e224067d1b8e3aa736 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkBlendMode.h"
#include "include/core/SkColor.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkScalar.h"
#include "include/core/SkTypes.h"
#include "include/effects/SkColorMatrix.h"
#include "include/private/base/SkCPUTypes.h"
static SkScalar byte_to_unit_float(U8CPU byte) {
if (0xFF == byte) {
// want to get this exact
return 1;
} else {
return byte * 0.00392156862745f;
}
}
sk_sp<SkColorFilter> SkColorFilters::Lighting(SkColor mul, SkColor add) {
const SkColor opaqueAlphaMask = SK_ColorBLACK;
// omit the alpha and compare only the RGB values
if (0 == (add & ~opaqueAlphaMask)) {
return SkColorFilters::Blend(mul | opaqueAlphaMask, SkBlendMode::kModulate);
}
SkColorMatrix matrix;
matrix.setScale(byte_to_unit_float(SkColorGetR(mul)),
byte_to_unit_float(SkColorGetG(mul)),
byte_to_unit_float(SkColorGetB(mul)),
1);
matrix.postTranslate(byte_to_unit_float(SkColorGetR(add)),
byte_to_unit_float(SkColorGetG(add)),
byte_to_unit_float(SkColorGetB(add)),
0);
return SkColorFilters::Matrix(matrix);
}