1/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkBlendModePriv_DEFINED
9#define SkBlendModePriv_DEFINED
10
11#include "SkBlendMode.h"
12#include "SkPM4f.h"
13
14class SkRasterPipeline;
15
16bool SkBlendMode_SupportsCoverageAsAlpha(SkBlendMode);
17
18static inline bool SkBlendMode_CaresAboutRBOrder(SkBlendMode mode) {
19    return (mode > SkBlendMode::kLastSeparableMode);
20}
21
22void SkBlendMode_AppendStagesNoClamp(SkBlendMode, SkRasterPipeline*);
23void SkBlendMode_AppendClampIfNeeded(SkBlendMode, SkRasterPipeline*);
24
25static inline void SkBlendMode_AppendStages(SkBlendMode mode, SkRasterPipeline* p) {
26    // Only plus clamps, so maybe append a clamping plus here instead of a second stage?
27    SkBlendMode_AppendStagesNoClamp(mode, p);
28    SkBlendMode_AppendClampIfNeeded(mode, p);
29}
30
31enum class SkBlendModeCoeff {
32    kZero, /** 0 */
33    kOne,  /** 1 */
34    kSC,   /** src color */
35    kISC,  /** inverse src color (i.e. 1 - sc) */
36    kDC,   /** dst color */
37    kIDC,  /** inverse dst color (i.e. 1 - dc) */
38    kSA,   /** src alpha */
39    kISA,  /** inverse src alpha (i.e. 1 - sa) */
40    kDA,   /** dst alpha */
41    kIDA,  /** inverse dst alpha (i.e. 1 - da) */
42
43    kCoeffCount
44};
45
46bool SkBlendMode_AsCoeff(SkBlendMode mode, SkBlendModeCoeff* src, SkBlendModeCoeff* dst);
47
48SkPM4f SkBlendMode_Apply(SkBlendMode, const SkPM4f& src, const SkPM4f& dst);
49
50#if SK_SUPPORT_GPU
51#include "GrXferProcessor.h"
52const GrXPFactory* SkBlendMode_AsXPFactory(SkBlendMode);
53#endif
54
55#endif
56