SkImageGenerator.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Copyright 2014 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/SkImage.h"
  8. #include "include/core/SkImageGenerator.h"
  9. #include "include/core/SkYUVAIndex.h"
  10. #include "src/core/SkNextID.h"
  11. SkImageGenerator::SkImageGenerator(const SkImageInfo& info, uint32_t uniqueID)
  12. : fInfo(info)
  13. , fUniqueID(kNeedNewImageUniqueID == uniqueID ? SkNextID::ImageID() : uniqueID)
  14. {}
  15. bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) {
  16. if (kUnknown_SkColorType == info.colorType()) {
  17. return false;
  18. }
  19. if (nullptr == pixels) {
  20. return false;
  21. }
  22. if (rowBytes < info.minRowBytes()) {
  23. return false;
  24. }
  25. Options defaultOpts;
  26. return this->onGetPixels(info, pixels, rowBytes, defaultOpts);
  27. }
  28. bool SkImageGenerator::queryYUVA8(SkYUVASizeInfo* sizeInfo,
  29. SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
  30. SkYUVColorSpace* colorSpace) const {
  31. SkASSERT(sizeInfo);
  32. return this->onQueryYUVA8(sizeInfo, yuvaIndices, colorSpace);
  33. }
  34. bool SkImageGenerator::getYUVA8Planes(const SkYUVASizeInfo& sizeInfo,
  35. const SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
  36. void* planes[SkYUVASizeInfo::kMaxCount]) {
  37. for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
  38. SkASSERT(sizeInfo.fSizes[i].fWidth >= 0);
  39. SkASSERT(sizeInfo.fSizes[i].fHeight >= 0);
  40. SkASSERT(sizeInfo.fWidthBytes[i] >= (size_t) sizeInfo.fSizes[i].fWidth);
  41. }
  42. int numPlanes = 0;
  43. SkASSERT(SkYUVAIndex::AreValidIndices(yuvaIndices, &numPlanes));
  44. SkASSERT(planes);
  45. for (int i = 0; i < numPlanes; ++i) {
  46. SkASSERT(planes[i]);
  47. }
  48. return this->onGetYUVA8Planes(sizeInfo, yuvaIndices, planes);
  49. }
  50. #if SK_SUPPORT_GPU
  51. #include "src/gpu/GrTextureProxy.h"
  52. sk_sp<GrTextureProxy> SkImageGenerator::generateTexture(GrRecordingContext* ctx,
  53. const SkImageInfo& info,
  54. const SkIPoint& origin,
  55. bool willNeedMipMaps) {
  56. SkIRect srcRect = SkIRect::MakeXYWH(origin.x(), origin.y(), info.width(), info.height());
  57. if (!SkIRect::MakeWH(fInfo.width(), fInfo.height()).contains(srcRect)) {
  58. return nullptr;
  59. }
  60. return this->onGenerateTexture(ctx, info, origin, willNeedMipMaps);
  61. }
  62. sk_sp<GrTextureProxy> SkImageGenerator::onGenerateTexture(GrRecordingContext*,
  63. const SkImageInfo&,
  64. const SkIPoint&,
  65. bool willNeedMipMaps) {
  66. return nullptr;
  67. }
  68. #endif
  69. ///////////////////////////////////////////////////////////////////////////////////////////////////
  70. #include "include/core/SkBitmap.h"
  71. #include "src/codec/SkColorTable.h"
  72. #include "include/core/SkGraphics.h"
  73. static SkGraphics::ImageGeneratorFromEncodedDataFactory gFactory;
  74. SkGraphics::ImageGeneratorFromEncodedDataFactory
  75. SkGraphics::SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory)
  76. {
  77. ImageGeneratorFromEncodedDataFactory prev = gFactory;
  78. gFactory = factory;
  79. return prev;
  80. }
  81. std::unique_ptr<SkImageGenerator> SkImageGenerator::MakeFromEncoded(sk_sp<SkData> data) {
  82. if (!data) {
  83. return nullptr;
  84. }
  85. if (gFactory) {
  86. if (std::unique_ptr<SkImageGenerator> generator = gFactory(data)) {
  87. return generator;
  88. }
  89. }
  90. return SkImageGenerator::MakeFromEncodedImpl(std::move(data));
  91. }