/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkColorSpaceXformSteps.h" #include "SkPM4fPriv.h" #include "SkRasterPipeline.h" #include "SkReadBuffer.h" #include "SkString.h" #include "SkToSRGBColorFilter.h" #include "SkWriteBuffer.h" #if SK_SUPPORT_GPU #include "GrColorSpaceXform.h" #endif void SkToSRGBColorFilter::onAppendStages(SkRasterPipeline* p, SkColorSpace* /*dst color space*/, SkArenaAlloc* alloc, bool shaderIsOpaque) const { alloc->make(fSrcColorSpace.get(), kPremul_SkAlphaType, SkColorSpace::MakeSRGB().get()) ->apply(p); } sk_sp SkToSRGBColorFilter::Make(sk_sp srcColorSpace) { if (!srcColorSpace || srcColorSpace->isSRGB()) { return nullptr; } else { return sk_sp(new SkToSRGBColorFilter(std::move(srcColorSpace))); } } SkToSRGBColorFilter::SkToSRGBColorFilter(sk_sp srcColorSpace) : fSrcColorSpace(std::move(srcColorSpace)) { SkASSERT(fSrcColorSpace); } sk_sp SkToSRGBColorFilter::CreateProc(SkReadBuffer& buffer) { auto data = buffer.readByteArrayAsData(); return data ? Make(SkColorSpace::Deserialize(data->data(), data->size())) : nullptr; } void SkToSRGBColorFilter::flatten(SkWriteBuffer& buffer) const { buffer.writeDataAsByteArray(fSrcColorSpace->serialize().get()); } #if SK_SUPPORT_GPU std::unique_ptr SkToSRGBColorFilter::asFragmentProcessor( GrContext*, const GrColorSpaceInfo&) const { return GrColorSpaceXformEffect::Make(fSrcColorSpace.get(), SkColorSpace::MakeSRGB().get()); } #endif