encode_platform.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 "gm/gm.h"
  8. #include "include/core/SkBitmap.h"
  9. #include "include/core/SkCanvas.h"
  10. #include "include/core/SkData.h"
  11. #include "include/core/SkEncodedImageFormat.h"
  12. #include "include/core/SkImage.h"
  13. #include "include/core/SkImageInfo.h"
  14. #include "include/core/SkPixmap.h"
  15. #include "include/core/SkRect.h"
  16. #include "include/core/SkRefCnt.h"
  17. #include "include/core/SkSize.h"
  18. #include "include/core/SkStream.h"
  19. #include "include/core/SkString.h"
  20. #include "include/core/SkTypes.h"
  21. #include "include/encode/SkJpegEncoder.h"
  22. #include "include/encode/SkPngEncoder.h"
  23. #include "include/encode/SkWebpEncoder.h"
  24. #include "tools/Resources.h"
  25. #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) || defined(SK_BUILD_FOR_WIN)
  26. #include "src/images/SkImageEncoderPriv.h"
  27. #endif
  28. namespace skiagm {
  29. #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
  30. static SkEncodedImageFormat kTypes[] {
  31. SkEncodedImageFormat::kPNG, SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kGIF,
  32. SkEncodedImageFormat::kBMP, SkEncodedImageFormat::kICO,
  33. };
  34. #elif defined(SK_BUILD_FOR_WIN)
  35. // Use PNG multiple times because our WIC encoder does not support GIF, BMP, or ICO.
  36. static SkEncodedImageFormat kTypes[] {
  37. SkEncodedImageFormat::kPNG, SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kPNG,
  38. SkEncodedImageFormat::kPNG, SkEncodedImageFormat::kPNG,
  39. };
  40. #else
  41. // Use WEBP in place of GIF. Use PNG two extra times. We don't support GIF, BMP, or ICO.
  42. static SkEncodedImageFormat kTypes[] {
  43. SkEncodedImageFormat::kPNG, SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kWEBP,
  44. SkEncodedImageFormat::kPNG, SkEncodedImageFormat::kPNG,
  45. };
  46. #endif
  47. static sk_sp<SkData> encode_data(SkEncodedImageFormat type, const SkBitmap& bitmap) {
  48. SkPixmap src;
  49. if (!bitmap.peekPixels(&src)) {
  50. return nullptr;
  51. }
  52. SkDynamicMemoryWStream buf;
  53. #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
  54. return SkEncodeImageWithCG(&buf, src, type) ? buf.detachAsData() : nullptr;
  55. #elif defined(SK_BUILD_FOR_WIN)
  56. return SkEncodeImageWithWIC(&buf, src, type, 100) ? buf.detachAsData() : nullptr;
  57. #else
  58. switch (type) {
  59. case SkEncodedImageFormat::kPNG: {
  60. bool success = SkPngEncoder::Encode(&buf, src, SkPngEncoder::Options());
  61. return success ? buf.detachAsData() : nullptr;
  62. }
  63. case SkEncodedImageFormat::kJPEG: {
  64. bool success = SkJpegEncoder::Encode(&buf, src, SkJpegEncoder::Options());
  65. return success ? buf.detachAsData() : nullptr;
  66. }
  67. case SkEncodedImageFormat::kWEBP: {
  68. bool success = SkWebpEncoder::Encode(&buf, src, SkWebpEncoder::Options());
  69. return success ? buf.detachAsData() : nullptr;
  70. }
  71. default:
  72. SkASSERT(false);
  73. return nullptr;
  74. }
  75. #endif
  76. }
  77. class EncodePlatformGM : public GM {
  78. public:
  79. EncodePlatformGM() {}
  80. protected:
  81. SkString onShortName() override {
  82. return SkString("encode-platform");
  83. }
  84. SkISize onISize() override {
  85. return SkISize::Make(256 * SK_ARRAY_COUNT(kTypes), 256 * 3);
  86. }
  87. DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
  88. SkBitmap opaqueBm, premulBm, unpremulBm;
  89. if (!GetResourceAsBitmap("images/mandrill_256.png", &opaqueBm)) {
  90. *errorMsg = "Could not load images/mandrill_256.png.png. "
  91. "Did you forget to set the resourcePath?";
  92. return DrawResult::kFail;
  93. }
  94. SkBitmap tmp;
  95. if (!GetResourceAsBitmap("images/yellow_rose.png", &tmp)) {
  96. *errorMsg = "Could not load images/yellow_rose.png. "
  97. "Did you forget to set the resourcePath?";
  98. return DrawResult::kFail;
  99. }
  100. tmp.extractSubset(&premulBm, SkIRect::MakeWH(256, 256));
  101. tmp.reset();
  102. unpremulBm.allocPixels(premulBm.info().makeAlphaType(kUnpremul_SkAlphaType));
  103. SkAssertResult(premulBm.readPixels(unpremulBm.pixmap()));
  104. for (SkEncodedImageFormat type : kTypes) {
  105. auto opaqueImage = SkImage::MakeFromEncoded(encode_data(type, opaqueBm));
  106. auto premulImage = SkImage::MakeFromEncoded(encode_data(type, premulBm));
  107. auto unpremulImage = SkImage::MakeFromEncoded(encode_data(type, unpremulBm));
  108. canvas->drawImage(opaqueImage.get(), 0.0f, 0.0f);
  109. canvas->drawImage(premulImage.get(), 0.0f, 256.0f);
  110. canvas->drawImage(unpremulImage.get(), 0.0f, 512.0f);
  111. canvas->translate(256.0f, 0.0f);
  112. }
  113. return DrawResult::kOk;
  114. }
  115. private:
  116. typedef GM INHERITED;
  117. };
  118. DEF_GM( return new EncodePlatformGM; )
  119. }