blob: c81957c7fcf38710beddc17357c426a80df8bfec [file] [log] [blame]
robertphillips31dc1b22015-07-07 10:05:18 -07001/*
2 * Copyright 2015 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
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +00008#ifndef SkXfermode_proccoeff_DEFINED
9#define SkXfermode_proccoeff_DEFINED
10
11#include "SkXfermode.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000012#include "SkReadBuffer.h"
13#include "SkWriteBuffer.h"
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000014
15struct ProcCoeff {
16 SkXfermodeProc fProc;
17 SkXfermode::Coeff fSC;
18 SkXfermode::Coeff fDC;
19};
20
21#define CANNOT_USE_COEFF SkXfermode::Coeff(-1)
22
commit-bot@chromium.orgcc277b72014-04-17 15:19:32 +000023class SK_API SkProcCoeffXfermode : public SkXfermode {
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000024public:
reed9fa60da2014-08-21 07:59:51 -070025 SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) {
26 fMode = mode;
27 fProc = rec.fProc;
28 // these may be valid, or may be CANNOT_USE_COEFF
29 fSrcCoeff = rec.fSC;
30 fDstCoeff = rec.fDC;
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000031 }
mtklein3f3b3d02014-12-01 11:47:08 -080032
robertphillips31dc1b22015-07-07 10:05:18 -070033 void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
34 const SkAlpha aa[]) const override;
35 void xfer16(uint16_t dst[], const SkPMColor src[], int count,
36 const SkAlpha aa[]) const override;
37 void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
38 const SkAlpha aa[]) const override;
commit-bot@chromium.orgcc277b72014-04-17 15:19:32 +000039
mtklein36352bf2015-03-25 18:17:31 -070040 bool asMode(Mode* mode) const override;
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000041
mtklein36352bf2015-03-25 18:17:31 -070042 bool supportsCoverageAsAlpha() const override;
egdanieldcfb7cf2015-01-22 06:52:29 -080043
mtklein36352bf2015-03-25 18:17:31 -070044 bool isOpaque(SkXfermode::SrcColorOpacity opacityType) const override;
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000045
46#if SK_SUPPORT_GPU
bsalomon4a339522015-10-06 08:40:50 -070047 bool asFragmentProcessor(const GrFragmentProcessor**,
bsalomonae4738f2015-09-15 15:33:27 -070048 const GrFragmentProcessor*) const override;
egdaniel54f0e9d2015-01-16 06:29:47 -080049
egdanielf2342722015-11-20 15:12:59 -080050 bool asXPFactory(GrXPFactory**) const override;
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000051#endif
52
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000053 SK_TO_STRING_OVERRIDE()
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000054 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode)
55
56protected:
mtklein36352bf2015-03-25 18:17:31 -070057 void flatten(SkWriteBuffer& buffer) const override;
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000058
commit-bot@chromium.orgcc277b72014-04-17 15:19:32 +000059 Mode getMode() const { return fMode; }
60
61 SkXfermodeProc getProc() const { return fProc; }
commit-bot@chromium.orgcd7992b2013-10-17 16:29:34 +000062
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000063private:
commit-bot@chromium.orgcc277b72014-04-17 15:19:32 +000064 SkXfermodeProc fProc;
65 Mode fMode;
66 Coeff fSrcCoeff, fDstCoeff;
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000067
reed9fa60da2014-08-21 07:59:51 -070068 friend class SkXfermode;
69
halcanary27a6e862016-01-21 14:15:10 -080070 SkValue asValue() const override;
71
commit-bot@chromium.orgcc277b72014-04-17 15:19:32 +000072 typedef SkXfermode INHERITED;
commit-bot@chromium.orgdf187c72013-10-09 14:39:46 +000073};
74
75#endif // #ifndef SkXfermode_proccoeff_DEFINED