encode_alpha_jpeg.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright 2017 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 "gm/gm.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/core/SkColorSpace.h"
  10. #include "include/core/SkData.h"
  11. #include "include/core/SkImage.h"
  12. #include "include/core/SkImageInfo.h"
  13. #include "include/core/SkPixmap.h"
  14. #include "include/core/SkRefCnt.h"
  15. #include "include/core/SkSize.h"
  16. #include "include/core/SkStream.h"
  17. #include "include/core/SkString.h"
  18. #include "include/core/SkTypes.h"
  19. #include "include/encode/SkJpegEncoder.h"
  20. #include "include/private/SkTemplates.h"
  21. #include "tools/Resources.h"
  22. namespace skiagm {
  23. static inline void read_into_pixmap(SkPixmap* dst, SkImageInfo dstInfo, void* dstPixels,
  24. sk_sp<SkImage> src) {
  25. dst->reset(dstInfo, dstPixels, dstInfo.minRowBytes());
  26. src->readPixels(*dst, 0, 0, SkImage::CachingHint::kDisallow_CachingHint);
  27. }
  28. static inline sk_sp<SkImage> encode_pixmap_and_make_image(const SkPixmap& src,
  29. SkJpegEncoder::AlphaOption alphaOption) {
  30. SkDynamicMemoryWStream dst;
  31. SkJpegEncoder::Options options;
  32. options.fAlphaOption = alphaOption;
  33. SkJpegEncoder::Encode(&dst, src, options);
  34. return SkImage::MakeFromEncoded(dst.detachAsData());
  35. }
  36. class EncodeJpegAlphaOptsGM : public GM {
  37. public:
  38. EncodeJpegAlphaOptsGM() {}
  39. protected:
  40. SkString onShortName() override {
  41. return SkString("encode-alpha-jpeg");
  42. }
  43. SkISize onISize() override {
  44. return SkISize::Make(400, 200);
  45. }
  46. DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
  47. sk_sp<SkImage> srcImg = GetResourceAsImage("images/rainbow-gradient.png");
  48. if (!srcImg) {
  49. *errorMsg = "Could not load images/rainbow-gradient.png. "
  50. "Did you forget to set the resourcePath?";
  51. return DrawResult::kFail;
  52. }
  53. fStorage.reset(srcImg->width() * srcImg->height() *
  54. SkColorTypeBytesPerPixel(kRGBA_F16_SkColorType));
  55. SkPixmap src;
  56. SkImageInfo info = SkImageInfo::MakeN32Premul(srcImg->width(), srcImg->height(),
  57. canvas->imageInfo().colorSpace() ? SkColorSpace::MakeSRGB() : nullptr);
  58. read_into_pixmap(&src, info, fStorage.get(), srcImg);
  59. // Encode 8888 premul.
  60. auto img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore);
  61. auto img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack);
  62. canvas->drawImage(img0, 0.0f, 0.0f);
  63. canvas->drawImage(img1, 0.0f, 100.0f);
  64. // Encode 8888 unpremul
  65. info = info.makeAlphaType(kUnpremul_SkAlphaType);
  66. read_into_pixmap(&src, info, fStorage.get(), srcImg);
  67. img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore);
  68. img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack);
  69. canvas->drawImage(img0, 100.0f, 0.0f);
  70. canvas->drawImage(img1, 100.0f, 100.0f);
  71. // Encode F16 premul
  72. info = SkImageInfo::Make(srcImg->width(), srcImg->height(), kRGBA_F16_SkColorType,
  73. kPremul_SkAlphaType, SkColorSpace::MakeSRGB());
  74. read_into_pixmap(&src, info, fStorage.get(), srcImg);
  75. img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore);
  76. img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack);
  77. canvas->drawImage(img0, 200.0f, 0.0f);
  78. canvas->drawImage(img1, 200.0f, 100.0f);
  79. // Encode F16 unpremul
  80. info = info.makeAlphaType(kUnpremul_SkAlphaType);
  81. read_into_pixmap(&src, info, fStorage.get(), srcImg);
  82. img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore);
  83. img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack);
  84. canvas->drawImage(img0, 300.0f, 0.0f);
  85. canvas->drawImage(img1, 300.0f, 100.0f);
  86. return DrawResult::kOk;
  87. }
  88. private:
  89. SkAutoTMalloc<uint8_t> fStorage;
  90. typedef GM INHERITED;
  91. };
  92. DEF_GM( return new EncodeJpegAlphaOptsGM; )
  93. };