1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "src/gpu/glsl/GrGLSLBlend.h"
9cb93a386Sopenharmony_ci#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
10cb93a386Sopenharmony_ci#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_cinamespace GrGLSLBlend {
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_ciconst char* BlendFuncName(SkBlendMode mode) {
15cb93a386Sopenharmony_ci    switch (mode) {
16cb93a386Sopenharmony_ci        case SkBlendMode::kClear:      return "blend_clear";
17cb93a386Sopenharmony_ci        case SkBlendMode::kSrc:        return "blend_src";
18cb93a386Sopenharmony_ci        case SkBlendMode::kDst:        return "blend_dst";
19cb93a386Sopenharmony_ci        case SkBlendMode::kSrcOver:    return "blend_src_over";
20cb93a386Sopenharmony_ci        case SkBlendMode::kDstOver:    return "blend_dst_over";
21cb93a386Sopenharmony_ci        case SkBlendMode::kSrcIn:      return "blend_src_in";
22cb93a386Sopenharmony_ci        case SkBlendMode::kDstIn:      return "blend_dst_in";
23cb93a386Sopenharmony_ci        case SkBlendMode::kSrcOut:     return "blend_src_out";
24cb93a386Sopenharmony_ci        case SkBlendMode::kDstOut:     return "blend_dst_out";
25cb93a386Sopenharmony_ci        case SkBlendMode::kSrcATop:    return "blend_src_atop";
26cb93a386Sopenharmony_ci        case SkBlendMode::kDstATop:    return "blend_dst_atop";
27cb93a386Sopenharmony_ci        case SkBlendMode::kXor:        return "blend_xor";
28cb93a386Sopenharmony_ci        case SkBlendMode::kPlus:       return "blend_plus";
29cb93a386Sopenharmony_ci        case SkBlendMode::kModulate:   return "blend_modulate";
30cb93a386Sopenharmony_ci        case SkBlendMode::kScreen:     return "blend_screen";
31cb93a386Sopenharmony_ci        case SkBlendMode::kOverlay:    return "blend_overlay";
32cb93a386Sopenharmony_ci        case SkBlendMode::kDarken:     return "blend_darken";
33cb93a386Sopenharmony_ci        case SkBlendMode::kLighten:    return "blend_lighten";
34cb93a386Sopenharmony_ci        case SkBlendMode::kColorDodge: return "blend_color_dodge";
35cb93a386Sopenharmony_ci        case SkBlendMode::kColorBurn:  return "blend_color_burn";
36cb93a386Sopenharmony_ci        case SkBlendMode::kHardLight:  return "blend_hard_light";
37cb93a386Sopenharmony_ci        case SkBlendMode::kSoftLight:  return "blend_soft_light";
38cb93a386Sopenharmony_ci        case SkBlendMode::kDifference: return "blend_difference";
39cb93a386Sopenharmony_ci        case SkBlendMode::kExclusion:  return "blend_exclusion";
40cb93a386Sopenharmony_ci        case SkBlendMode::kMultiply:   return "blend_multiply";
41cb93a386Sopenharmony_ci        case SkBlendMode::kHue:        return "blend_hue";
42cb93a386Sopenharmony_ci        case SkBlendMode::kSaturation: return "blend_saturation";
43cb93a386Sopenharmony_ci        case SkBlendMode::kColor:      return "blend_color";
44cb93a386Sopenharmony_ci        case SkBlendMode::kLuminosity: return "blend_luminosity";
45cb93a386Sopenharmony_ci    }
46cb93a386Sopenharmony_ci    SkUNREACHABLE;
47cb93a386Sopenharmony_ci}
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_civoid AppendMode(GrGLSLShaderBuilder* fsBuilder,
50cb93a386Sopenharmony_ci                const char* srcColor,
51cb93a386Sopenharmony_ci                const char* dstColor,
52cb93a386Sopenharmony_ci                const char* outColor,
53cb93a386Sopenharmony_ci                SkBlendMode mode) {
54cb93a386Sopenharmony_ci    fsBuilder->codeAppendf("%s = %s(%s, %s);", outColor, BlendFuncName(mode), srcColor, dstColor);
55cb93a386Sopenharmony_ci}
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ci}  // namespace GrGLSLBlend
58