SkColorShader.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * Copyright 2016 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/SkColorSpace.h"
  8. #include "src/core/SkArenaAlloc.h"
  9. #include "src/core/SkColorSpacePriv.h"
  10. #include "src/core/SkColorSpaceXformSteps.h"
  11. #include "src/core/SkRasterPipeline.h"
  12. #include "src/core/SkReadBuffer.h"
  13. #include "src/core/SkUtils.h"
  14. #include "src/shaders/SkColorShader.h"
  15. SkColorShader::SkColorShader(SkColor c) : fColor(c) {}
  16. bool SkColorShader::isOpaque() const {
  17. return SkColorGetA(fColor) == 255;
  18. }
  19. sk_sp<SkFlattenable> SkColorShader::CreateProc(SkReadBuffer& buffer) {
  20. return sk_make_sp<SkColorShader>(buffer.readColor());
  21. }
  22. void SkColorShader::flatten(SkWriteBuffer& buffer) const {
  23. buffer.writeColor(fColor);
  24. }
  25. SkShader::GradientType SkColorShader::asAGradient(GradientInfo* info) const {
  26. if (info) {
  27. if (info->fColors && info->fColorCount >= 1) {
  28. info->fColors[0] = fColor;
  29. }
  30. info->fColorCount = 1;
  31. info->fTileMode = SkTileMode::kRepeat;
  32. }
  33. return kColor_GradientType;
  34. }
  35. SkColor4Shader::SkColor4Shader(const SkColor4f& color, sk_sp<SkColorSpace> space)
  36. : fColorSpace(std::move(space))
  37. , fColor(color)
  38. {}
  39. sk_sp<SkFlattenable> SkColor4Shader::CreateProc(SkReadBuffer& buffer) {
  40. SkColor4f color;
  41. sk_sp<SkColorSpace> colorSpace;
  42. buffer.readColor4f(&color);
  43. if (buffer.readBool()) {
  44. sk_sp<SkData> data = buffer.readByteArrayAsData();
  45. colorSpace = data ? SkColorSpace::Deserialize(data->data(), data->size()) : nullptr;
  46. }
  47. return SkShaders::Color(color, std::move(colorSpace));
  48. }
  49. void SkColor4Shader::flatten(SkWriteBuffer& buffer) const {
  50. buffer.writeColor4f(fColor);
  51. sk_sp<SkData> colorSpaceData = fColorSpace ? fColorSpace->serialize() : nullptr;
  52. if (colorSpaceData) {
  53. buffer.writeBool(true);
  54. buffer.writeDataAsByteArray(colorSpaceData.get());
  55. } else {
  56. buffer.writeBool(false);
  57. }
  58. }
  59. sk_sp<SkShader> SkShaders::Color(const SkColor4f& color, sk_sp<SkColorSpace> space) {
  60. if (!SkScalarsAreFinite(color.vec(), 4)) {
  61. return nullptr;
  62. }
  63. return sk_make_sp<SkColor4Shader>(color, std::move(space));
  64. }
  65. bool SkColorShader::onAppendStages(const SkStageRec& rec) const {
  66. SkColor4f color = SkColor4f::FromColor(fColor);
  67. SkColorSpaceXformSteps(sk_srgb_singleton(), kUnpremul_SkAlphaType,
  68. rec.fDstCS, kUnpremul_SkAlphaType).apply(color.vec());
  69. rec.fPipeline->append_constant_color(rec.fAlloc, color.premul().vec());
  70. return true;
  71. }
  72. bool SkColor4Shader::onAppendStages(const SkStageRec& rec) const {
  73. SkColor4f color = fColor;
  74. SkColorSpaceXformSteps(fColorSpace.get(), kUnpremul_SkAlphaType,
  75. rec.fDstCS, kUnpremul_SkAlphaType).apply(color.vec());
  76. rec.fPipeline->append_constant_color(rec.fAlloc, color.premul().vec());
  77. return true;
  78. }
  79. #if SK_SUPPORT_GPU
  80. #include "src/gpu/GrColorSpaceInfo.h"
  81. #include "src/gpu/GrColorSpaceXform.h"
  82. #include "src/gpu/SkGr.h"
  83. #include "src/gpu/effects/generated/GrConstColorProcessor.h"
  84. std::unique_ptr<GrFragmentProcessor> SkColorShader::asFragmentProcessor(
  85. const GrFPArgs& args) const {
  86. SkPMColor4f color = SkColorToPMColor4f(fColor, *args.fDstColorSpaceInfo);
  87. return GrConstColorProcessor::Make(color, GrConstColorProcessor::InputMode::kModulateA);
  88. }
  89. std::unique_ptr<GrFragmentProcessor> SkColor4Shader::asFragmentProcessor(
  90. const GrFPArgs& args) const {
  91. SkColorSpaceXformSteps steps{ fColorSpace.get(), kUnpremul_SkAlphaType,
  92. args.fDstColorSpaceInfo->colorSpace(), kUnpremul_SkAlphaType };
  93. SkColor4f color = fColor;
  94. steps.apply(color.vec());
  95. return GrConstColorProcessor::Make(color.premul(),
  96. GrConstColorProcessor::InputMode::kModulateA);
  97. }
  98. #endif