blob: d604a12fbbda95413c07192c15880614767f0be7 [file] [log] [blame]
robertphillips@google.comb83b6b42013-01-22 14:32:09 +00001/*
2 * Copyright 2013 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
Mike Reed403d1542016-09-26 18:51:24 -04008#include "SkArithmeticModePriv.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +00009#include "SkReadBuffer.h"
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000010
Brian Salomon89cb8212017-01-09 10:48:23 -050011// This class only exists to unflatten instances that were serialized into old pictures as part of
12// SkXfermodeImageFilter before the advent of SkBlendMode. Those image filters will now be
13// transformed to SkArithmeticImageFilter which does not use this class in its implementation.
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000014class SkArithmeticMode_scalar : public SkXfermode {
15public:
reed87811232016-02-22 06:59:37 -080016 SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4,
17 bool enforcePMColor) {
18 fK[0] = k1;
19 fK[1] = k2;
20 fK[2] = k3;
21 fK[3] = k4;
22 fEnforcePMColor = enforcePMColor;
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000023 }
halcanary9d524f22016-03-29 09:03:52 -070024
Brian Salomon89cb8212017-01-09 10:48:23 -050025 void xfer32(SkPMColor[], const SkPMColor[], int count, const SkAlpha[]) const override {
26 SkFAIL("This should never be called.");
27 }
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000028
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000029 SK_TO_STRING_OVERRIDE()
senorblanco@chromium.org9a6eb0e2013-05-29 20:55:09 +000030 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar)
31
Brian Salomon89cb8212017-01-09 10:48:23 -050032 // This is used to extract the arithmetic params into an SkArithmeticImageFilter. Afterwards,
33 // this object is destroyed and arithemtic blending is implemented directly in the image filter.
reed374772b2016-10-05 17:33:02 -070034 bool isArithmetic(SkArithmeticParams* params) const override {
35 if (params) {
36 memcpy(params->fK, fK, 4 * sizeof(float));
37 params->fEnforcePMColor = fEnforcePMColor;
38 }
39 return true;
40 }
41
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000042private:
Brian Salomon89cb8212017-01-09 10:48:23 -050043 void flatten(SkWriteBuffer& buffer) const override { SkFAIL("This shouild never be called."); }
halcanary27a6e862016-01-21 14:15:10 -080044
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000045 SkScalar fK[4];
commit-bot@chromium.org51a11b72014-04-02 19:32:15 +000046 bool fEnforcePMColor;
robertphillips@google.comb83b6b42013-01-22 14:32:09 +000047
reed9fa60da2014-08-21 07:59:51 -070048 friend class SkArithmeticMode;
49
skia.committer@gmail.com98ded842013-01-23 07:06:17 +000050 typedef SkXfermode INHERITED;
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000051};
52
reed60c9b582016-04-03 09:11:13 -070053sk_sp<SkFlattenable> SkArithmeticMode_scalar::CreateProc(SkReadBuffer& buffer) {
reed9fa60da2014-08-21 07:59:51 -070054 const SkScalar k1 = buffer.readScalar();
55 const SkScalar k2 = buffer.readScalar();
56 const SkScalar k3 = buffer.readScalar();
57 const SkScalar k4 = buffer.readScalar();
58 const bool enforcePMColor = buffer.readBool();
reed60c9b582016-04-03 09:11:13 -070059 return SkArithmeticMode::Make(k1, k2, k3, k4, enforcePMColor);
reed9fa60da2014-08-21 07:59:51 -070060}
61
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000062#ifndef SK_IGNORE_TO_STRING
robertphillips@google.comb83b6b42013-01-22 14:32:09 +000063void SkArithmeticMode_scalar::toString(SkString* str) const {
Brian Salomon89cb8212017-01-09 10:48:23 -050064 SkFAIL("This should never be called.");
robertphillips@google.comb83b6b42013-01-22 14:32:09 +000065}
66#endif
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000067
68///////////////////////////////////////////////////////////////////////////////
69
reedcfb6bdf2016-03-29 11:32:50 -070070sk_sp<SkXfermode> SkArithmeticMode::Make(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4,
71 bool enforcePMColor) {
reed87811232016-02-22 06:59:37 -080072 if (SkScalarNearlyZero(k1) && SkScalarNearlyEqual(k2, SK_Scalar1) &&
73 SkScalarNearlyZero(k3) && SkScalarNearlyZero(k4)) {
reedcfb6bdf2016-03-29 11:32:50 -070074 return SkXfermode::Make(SkXfermode::kSrc_Mode);
reed87811232016-02-22 06:59:37 -080075 } else if (SkScalarNearlyZero(k1) && SkScalarNearlyZero(k2) &&
76 SkScalarNearlyEqual(k3, SK_Scalar1) && SkScalarNearlyZero(k4)) {
reedcfb6bdf2016-03-29 11:32:50 -070077 return SkXfermode::Make(SkXfermode::kDst_Mode);
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000078 }
reedcfb6bdf2016-03-29 11:32:50 -070079 return sk_make_sp<SkArithmeticMode_scalar>(k1, k2, k3, k4, enforcePMColor);
mike@reedtribe.orge51755f2011-12-10 19:36:56 +000080}
senorblanco@chromium.org9a6eb0e2013-05-29 20:55:09 +000081
senorblanco@chromium.org9a6eb0e2013-05-29 20:55:09 +000082SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkArithmeticMode)
83 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArithmeticMode_scalar)
84SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END