blob: 16bf56522ca396722ec99d03ae0f2b6fa628132b [file] [log] [blame]
reed3061af42016-01-07 15:47:29 -08001/*
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
Herb Derby83e939b2017-02-07 14:25:11 -05008#include "SkArenaAlloc.h"
reed3061af42016-01-07 15:47:29 -08009#include "SkColorFilterShader.h"
Matt Sarett72266ee2017-04-20 10:09:23 -040010#include "SkColorSpaceXformer.h"
reed3061af42016-01-07 15:47:29 -080011#include "SkReadBuffer.h"
12#include "SkWriteBuffer.h"
13#include "SkShader.h"
14#include "SkString.h"
15
16#if SK_SUPPORT_GPU
17#include "GrFragmentProcessor.h"
18#endif
19
reedd053ce92016-03-22 10:17:23 -070020SkColorFilterShader::SkColorFilterShader(sk_sp<SkShader> shader, sk_sp<SkColorFilter> filter)
21 : fShader(std::move(shader))
22 , fFilter(std::move(filter))
reed3061af42016-01-07 15:47:29 -080023{
reedd053ce92016-03-22 10:17:23 -070024 SkASSERT(fShader);
25 SkASSERT(fFilter);
reed3061af42016-01-07 15:47:29 -080026}
27
reed60c9b582016-04-03 09:11:13 -070028sk_sp<SkFlattenable> SkColorFilterShader::CreateProc(SkReadBuffer& buffer) {
reed8a21c9f2016-03-08 18:50:00 -080029 auto shader = buffer.readShader();
reedd053ce92016-03-22 10:17:23 -070030 auto filter = buffer.readColorFilter();
31 if (!shader || !filter) {
reed3061af42016-01-07 15:47:29 -080032 return nullptr;
33 }
reed60c9b582016-04-03 09:11:13 -070034 return sk_make_sp<SkColorFilterShader>(shader, filter);
reed3061af42016-01-07 15:47:29 -080035}
36
37void SkColorFilterShader::flatten(SkWriteBuffer& buffer) const {
reedd053ce92016-03-22 10:17:23 -070038 buffer.writeFlattenable(fShader.get());
39 buffer.writeFlattenable(fFilter.get());
reed3061af42016-01-07 15:47:29 -080040}
41
Mike Reed1d8c42e2017-08-29 14:58:19 -040042bool SkColorFilterShader::onAppendStages(const StageRec& rec) const {
43 if (!as_SB(fShader)->appendStages(rec)) {
Mike Reed2aab8022017-05-31 12:14:56 -040044 return false;
45 }
Mike Reed1d8c42e2017-08-29 14:58:19 -040046 fFilter->appendStages(rec.fPipeline, rec.fDstCS, rec.fAlloc, fShader->isOpaque());
Mike Reed2aab8022017-05-31 12:14:56 -040047 return true;
48}
49
Matt Sarett72266ee2017-04-20 10:09:23 -040050sk_sp<SkShader> SkColorFilterShader::onMakeColorSpace(SkColorSpaceXformer* xformer) const {
Mike Klein2814d912017-05-10 12:35:51 -040051 return xformer->apply(fShader.get())->makeWithColorFilter(xformer->apply(fFilter.get()));
Matt Sarett72266ee2017-04-20 10:09:23 -040052}
reed3061af42016-01-07 15:47:29 -080053
reed3061af42016-01-07 15:47:29 -080054#if SK_SUPPORT_GPU
55/////////////////////////////////////////////////////////////////////
56
Brian Salomonaff329b2017-08-11 09:40:37 -040057std::unique_ptr<GrFragmentProcessor> SkColorFilterShader::asFragmentProcessor(
Mike Reede3429e62018-01-19 11:43:34 -050058 const GrFPArgs& args) const {
Brian Salomonaff329b2017-08-11 09:40:37 -040059 auto fp1 = as_SB(fShader)->asFragmentProcessor(args);
bungeman06ca8ec2016-06-09 08:01:03 -070060 if (!fp1) {
reed3061af42016-01-07 15:47:29 -080061 return nullptr;
62 }
63
Brian Salomon4cbb6e62017-10-25 15:12:19 -040064 auto fp2 = fFilter->asFragmentProcessor(args.fContext, *args.fDstColorSpaceInfo);
bungeman06ca8ec2016-06-09 08:01:03 -070065 if (!fp2) {
66 return fp1;
reed3061af42016-01-07 15:47:29 -080067 }
68
Brian Salomonaff329b2017-08-11 09:40:37 -040069 std::unique_ptr<GrFragmentProcessor> fpSeries[] = { std::move(fp1), std::move(fp2) };
reed3061af42016-01-07 15:47:29 -080070 return GrFragmentProcessor::RunInSeries(fpSeries, 2);
71}
72#endif
73
reed3061af42016-01-07 15:47:29 -080074///////////////////////////////////////////////////////////////////////////////////////////////////
75
reedd053ce92016-03-22 10:17:23 -070076sk_sp<SkShader> SkShader::makeWithColorFilter(sk_sp<SkColorFilter> filter) const {
reed3061af42016-01-07 15:47:29 -080077 SkShader* base = const_cast<SkShader*>(this);
78 if (!filter) {
reed150835e2016-03-10 06:36:49 -080079 return sk_ref_sp(base);
reed3061af42016-01-07 15:47:29 -080080 }
reedd053ce92016-03-22 10:17:23 -070081 return sk_make_sp<SkColorFilterShader>(sk_ref_sp(base), filter);
reed3061af42016-01-07 15:47:29 -080082}