1db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy/*
2db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * Copyright (C) 2010 The Android Open Source Project
3db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *
4db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * you may not use this file except in compliance with the License.
6db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * You may obtain a copy of the License at
7db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *
8db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy *
10db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * Unless required by applicable law or agreed to in writing, software
11db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * See the License for the specific language governing permissions and
14db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy * limitations under the License.
15db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy */
16db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
17db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy#include "SkiaColorFilter.h"
18db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
19db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guynamespace android {
20db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guynamespace uirenderer {
21db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
22db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
23db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Base color filter
24db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
25db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
26ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet HaaseSkiaColorFilter::SkiaColorFilter(SkColorFilter *skFilter, Type type, bool blend):
27ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mType(type), mBlend(blend), mSkFilter(skFilter) {
28db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
29db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
30db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain GuySkiaColorFilter::~SkiaColorFilter() {
31db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
32db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
33db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
34db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Color matrix filter
35db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
36db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
37e83221c547cf2038752e5378e72e49a62cfd9954Romain GuySkiaColorMatrixFilter::SkiaColorMatrixFilter(SkColorFilter* skFilter, float* matrix, float* vector):
38ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        SkiaColorFilter(skFilter, kColorMatrix, true), mMatrix(matrix), mVector(vector) {
396ed9e43879039ce0cbead08d304edbce79a88cedRomain Guy    // Skia uses the range [0..255] for the addition vector, but we need
406ed9e43879039ce0cbead08d304edbce79a88cedRomain Guy    // the [0..1] range to apply the vector in GLSL
416ed9e43879039ce0cbead08d304edbce79a88cedRomain Guy    for (int i = 0; i < 4; i++) {
426ed9e43879039ce0cbead08d304edbce79a88cedRomain Guy        mVector[i] /= 255.0f;
436ed9e43879039ce0cbead08d304edbce79a88cedRomain Guy    }
446ed9e43879039ce0cbead08d304edbce79a88cedRomain Guy
45e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy    // TODO: We should be smarter about this
46e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy    mBlend = true;
47db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
48db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
49db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain GuySkiaColorMatrixFilter::~SkiaColorMatrixFilter() {
50db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    delete[] mMatrix;
51db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    delete[] mVector;
52db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
53db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
54db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyvoid SkiaColorMatrixFilter::describe(ProgramDescription& description,
55db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        const Extensions& extensions) {
56db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    description.colorOp = ProgramDescription::kColorMatrix;
57db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
58db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
59db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyvoid SkiaColorMatrixFilter::setupProgram(Program* program) {
60db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    glUniformMatrix4fv(program->getUniform("colorMatrix"), 1, GL_FALSE, &mMatrix[0]);
61db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    glUniform4fv(program->getUniform("colorMatrixVector"), 1, mVector);
62db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
63db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
64db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
65db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Lighting color filter
66db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
67db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
68e83221c547cf2038752e5378e72e49a62cfd9954Romain GuySkiaLightingFilter::SkiaLightingFilter(SkColorFilter* skFilter, int multiply, int add):
69ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        SkiaColorFilter(skFilter, kLighting, true) {
70db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mMulR = ((multiply >> 16) & 0xFF) / 255.0f;
71db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mMulG = ((multiply >>  8) & 0xFF) / 255.0f;
72db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mMulB = ((multiply      ) & 0xFF) / 255.0f;
73db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
74db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mAddR = ((add >> 16) & 0xFF) / 255.0f;
75db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mAddG = ((add >>  8) & 0xFF) / 255.0f;
76db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mAddB = ((add      ) & 0xFF) / 255.0f;
77e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy
78e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy    // A lighting filter always ignores alpha
79e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy    mBlend = false;
80db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
81db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
82db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyvoid SkiaLightingFilter::describe(ProgramDescription& description, const Extensions& extensions) {
83db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    description.colorOp = ProgramDescription::kColorLighting;
84db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
85db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
86db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyvoid SkiaLightingFilter::setupProgram(Program* program) {
87db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    glUniform4f(program->getUniform("lightingMul"), mMulR, mMulG, mMulB, 1.0f);
88db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    glUniform4f(program->getUniform("lightingAdd"), mAddR, mAddG, mAddB, 0.0f);
89db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
90db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
91db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
92db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy// Blend color filter
93db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy///////////////////////////////////////////////////////////////////////////////
94db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
95e83221c547cf2038752e5378e72e49a62cfd9954Romain GuySkiaBlendFilter::SkiaBlendFilter(SkColorFilter* skFilter, int color, SkXfermode::Mode mode):
96ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        SkiaColorFilter(skFilter, kBlend, true), mMode(mode) {
97db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    const int alpha = (color >> 24) & 0xFF;
98db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mA = alpha / 255.0f;
99db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mR = mA * ((color >> 16) & 0xFF) / 255.0f;
100db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mG = mA * ((color >>  8) & 0xFF) / 255.0f;
101db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    mB = mA * ((color      ) & 0xFF) / 255.0f;
102e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy
103e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy    // TODO: We should do something smarter here
104e83221c547cf2038752e5378e72e49a62cfd9954Romain Guy    mBlend = true;
105db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
106db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
107db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyvoid SkiaBlendFilter::describe(ProgramDescription& description, const Extensions& extensions) {
108db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    description.colorOp = ProgramDescription::kColorBlend;
109db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    description.colorMode = mMode;
110db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
111db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
112db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyvoid SkiaBlendFilter::setupProgram(Program* program) {
113db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    glUniform4f(program->getUniform("colorBlend"), mR, mG, mB, mA);
114db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}
115db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
116db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // namespace uirenderer
117db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy}; // namespace android
118