SkCodecImageGenerator.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright 2015 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/SkYUVAIndex.h"
  8. #include "src/codec/SkCodecImageGenerator.h"
  9. #include "src/core/SkMakeUnique.h"
  10. #include "src/core/SkPixmapPriv.h"
  11. std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
  12. auto codec = SkCodec::MakeFromData(data);
  13. if (nullptr == codec) {
  14. return nullptr;
  15. }
  16. return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data));
  17. }
  18. std::unique_ptr<SkImageGenerator>
  19. SkCodecImageGenerator::MakeFromCodec(std::unique_ptr<SkCodec> codec) {
  20. return codec
  21. ? std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), nullptr))
  22. : nullptr;
  23. }
  24. static SkImageInfo adjust_info(SkCodec* codec) {
  25. SkImageInfo info = codec->getInfo();
  26. if (kUnpremul_SkAlphaType == info.alphaType()) {
  27. info = info.makeAlphaType(kPremul_SkAlphaType);
  28. }
  29. if (SkPixmapPriv::ShouldSwapWidthHeight(codec->getOrigin())) {
  30. info = SkPixmapPriv::SwapWidthHeight(info);
  31. }
  32. return info;
  33. }
  34. SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
  35. : INHERITED(adjust_info(codec.get()))
  36. , fCodec(std::move(codec))
  37. , fData(std::move(data))
  38. {}
  39. sk_sp<SkData> SkCodecImageGenerator::onRefEncodedData() {
  40. return fData;
  41. }
  42. bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels,
  43. size_t requestRowBytes, const Options&) {
  44. SkPixmap dst(requestInfo, requestPixels, requestRowBytes);
  45. auto decode = [this](const SkPixmap& pm) {
  46. SkCodec::Result result = fCodec->getPixels(pm);
  47. switch (result) {
  48. case SkCodec::kSuccess:
  49. case SkCodec::kIncompleteInput:
  50. case SkCodec::kErrorInInput:
  51. return true;
  52. default:
  53. return false;
  54. }
  55. };
  56. return SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode);
  57. }
  58. bool SkCodecImageGenerator::onQueryYUVA8(SkYUVASizeInfo* sizeInfo,
  59. SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
  60. SkYUVColorSpace* colorSpace) const {
  61. // This image generator always returns 3 separate non-interleaved planes
  62. yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
  63. yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
  64. yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
  65. yuvaIndices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR;
  66. yuvaIndices[SkYUVAIndex::kV_Index].fIndex = 2;
  67. yuvaIndices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kR;
  68. yuvaIndices[SkYUVAIndex::kA_Index].fIndex = -1;
  69. yuvaIndices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR;
  70. return fCodec->queryYUV8(sizeInfo, colorSpace);
  71. }
  72. bool SkCodecImageGenerator::onGetYUVA8Planes(const SkYUVASizeInfo& sizeInfo,
  73. const SkYUVAIndex indices[SkYUVAIndex::kIndexCount],
  74. void* planes[]) {
  75. SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
  76. // TODO: check indices
  77. switch (result) {
  78. case SkCodec::kSuccess:
  79. case SkCodec::kIncompleteInput:
  80. case SkCodec::kErrorInInput:
  81. return true;
  82. default:
  83. return false;
  84. }
  85. }