SkColorFilterShader.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  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. #include "include/core/SkShader.h"
  8. #include "include/core/SkString.h"
  9. #include "src/core/SkArenaAlloc.h"
  10. #include "src/core/SkReadBuffer.h"
  11. #include "src/core/SkWriteBuffer.h"
  12. #include "src/shaders/SkColorFilterShader.h"
  13. #if SK_SUPPORT_GPU
  14. #include "src/gpu/GrFragmentProcessor.h"
  15. #endif
  16. SkColorFilterShader::SkColorFilterShader(sk_sp<SkShader> shader, sk_sp<SkColorFilter> filter)
  17. : fShader(std::move(shader))
  18. , fFilter(std::move(filter))
  19. {
  20. SkASSERT(fShader);
  21. SkASSERT(fFilter);
  22. }
  23. sk_sp<SkFlattenable> SkColorFilterShader::CreateProc(SkReadBuffer& buffer) {
  24. auto shader = buffer.readShader();
  25. auto filter = buffer.readColorFilter();
  26. if (!shader || !filter) {
  27. return nullptr;
  28. }
  29. return sk_make_sp<SkColorFilterShader>(shader, filter);
  30. }
  31. void SkColorFilterShader::flatten(SkWriteBuffer& buffer) const {
  32. buffer.writeFlattenable(fShader.get());
  33. buffer.writeFlattenable(fFilter.get());
  34. }
  35. bool SkColorFilterShader::onAppendStages(const SkStageRec& rec) const {
  36. if (!as_SB(fShader)->appendStages(rec)) {
  37. return false;
  38. }
  39. fFilter->appendStages(rec, fShader->isOpaque());
  40. return true;
  41. }
  42. #if SK_SUPPORT_GPU
  43. /////////////////////////////////////////////////////////////////////
  44. #include "include/gpu/GrContext.h"
  45. std::unique_ptr<GrFragmentProcessor> SkColorFilterShader::asFragmentProcessor(
  46. const GrFPArgs& args) const {
  47. auto fp1 = as_SB(fShader)->asFragmentProcessor(args);
  48. if (!fp1) {
  49. return nullptr;
  50. }
  51. auto fp2 = fFilter->asFragmentProcessor(args.fContext, *args.fDstColorSpaceInfo);
  52. if (!fp2) {
  53. return fp1;
  54. }
  55. std::unique_ptr<GrFragmentProcessor> fpSeries[] = { std::move(fp1), std::move(fp2) };
  56. return GrFragmentProcessor::RunInSeries(fpSeries, 2);
  57. }
  58. #endif
  59. ///////////////////////////////////////////////////////////////////////////////////////////////////
  60. sk_sp<SkShader> SkShader::makeWithColorFilter(sk_sp<SkColorFilter> filter) const {
  61. SkShader* base = const_cast<SkShader*>(this);
  62. if (!filter) {
  63. return sk_ref_sp(base);
  64. }
  65. return sk_make_sp<SkColorFilterShader>(sk_ref_sp(base), filter);
  66. }