/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkArenaAlloc.h" #include "SkColorFilterShader.h" #include "SkColorSpaceXformer.h" #include "SkReadBuffer.h" #include "SkWriteBuffer.h" #include "SkShader.h" #include "SkString.h" #if SK_SUPPORT_GPU #include "GrFragmentProcessor.h" #endif SkColorFilterShader::SkColorFilterShader(sk_sp shader, sk_sp filter) : fShader(std::move(shader)) , fFilter(std::move(filter)) { SkASSERT(fShader); SkASSERT(fFilter); } sk_sp SkColorFilterShader::CreateProc(SkReadBuffer& buffer) { auto shader = buffer.readShader(); auto filter = buffer.readColorFilter(); if (!shader || !filter) { return nullptr; } return sk_make_sp(shader, filter); } void SkColorFilterShader::flatten(SkWriteBuffer& buffer) const { buffer.writeFlattenable(fShader.get()); buffer.writeFlattenable(fFilter.get()); } bool SkColorFilterShader::onAppendStages(const StageRec& rec) const { if (!as_SB(fShader)->appendStages(rec)) { return false; } fFilter->appendStages(rec.fPipeline, rec.fDstCS, rec.fAlloc, fShader->isOpaque()); return true; } sk_sp SkColorFilterShader::onMakeColorSpace(SkColorSpaceXformer* xformer) const { return xformer->apply(fShader.get())->makeWithColorFilter(xformer->apply(fFilter.get())); } #if SK_SUPPORT_GPU ///////////////////////////////////////////////////////////////////// std::unique_ptr SkColorFilterShader::asFragmentProcessor( const GrFPArgs& args) const { auto fp1 = as_SB(fShader)->asFragmentProcessor(args); if (!fp1) { return nullptr; } auto fp2 = fFilter->asFragmentProcessor(args.fContext, *args.fDstColorSpaceInfo); if (!fp2) { return fp1; } std::unique_ptr fpSeries[] = { std::move(fp1), std::move(fp2) }; return GrFragmentProcessor::RunInSeries(fpSeries, 2); } #endif /////////////////////////////////////////////////////////////////////////////////////////////////// sk_sp SkShader::makeWithColorFilter(sk_sp filter) const { SkShader* base = const_cast(this); if (!filter) { return sk_ref_sp(base); } return sk_make_sp(sk_ref_sp(base), filter); }