blob: 27cf358b2f4206dc1ded06041f191462e1813c0e [file] [log] [blame]
/*
* 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 "src/shaders/SkColorFilterShader.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkShader.h"
#include "include/private/base/SkAssert.h"
#include "src/base/SkArenaAlloc.h"
#include "src/core/SkEffectPriv.h"
#include "src/core/SkRasterPipeline.h"
#include "src/core/SkRasterPipelineOpList.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkWriteBuffer.h"
#include "src/effects/colorfilters/SkColorFilterBase.h"
#include <utility>
SkColorFilterShader::SkColorFilterShader(sk_sp<SkShader> shader,
float alpha,
sk_sp<SkColorFilter> filter)
: fShader(std::move(shader))
, fFilter(as_CFB_sp(std::move(filter)))
, fAlpha (alpha)
{
SkASSERT(fShader);
SkASSERT(fFilter);
}
sk_sp<SkFlattenable> SkColorFilterShader::CreateProc(SkReadBuffer& buffer) {
auto shader = buffer.readShader();
auto filter = buffer.readColorFilter();
if (!shader || !filter) {
return nullptr;
}
return sk_make_sp<SkColorFilterShader>(shader, 1.0f, filter);
}
bool SkColorFilterShader::isOpaque() const {
return fShader->isOpaque() && fAlpha == 1.0f && as_CFB(fFilter)->isAlphaUnchanged();
}
void SkColorFilterShader::flatten(SkWriteBuffer& buffer) const {
buffer.writeFlattenable(fShader.get());
SkASSERT(fAlpha == 1.0f); // Not exposed in public API SkShader::makeWithColorFilter().
buffer.writeFlattenable(fFilter.get());
}
bool SkColorFilterShader::appendStages(const SkStageRec& rec,
const SkShaders::MatrixRec& mRec) const {
if (!as_SB(fShader)->appendStages(rec, mRec)) {
return false;
}
if (fAlpha != 1.0f) {
rec.fPipeline->append(SkRasterPipelineOp::scale_1_float, rec.fAlloc->make<float>(fAlpha));
}
if (!fFilter->appendStages(rec, fAlpha == 1.0f && fShader->isOpaque())) {
return false;
}
return true;
}