encode_srgb.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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/codec/SkCodec.h"
  9. #include "include/core/SkBitmap.h"
  10. #include "include/core/SkCanvas.h"
  11. #include "include/core/SkColorSpace.h"
  12. #include "include/core/SkData.h"
  13. #include "include/core/SkEncodedImageFormat.h"
  14. #include "include/core/SkImage.h"
  15. #include "include/core/SkImageInfo.h"
  16. #include "include/core/SkPixmap.h"
  17. #include "include/core/SkRefCnt.h"
  18. #include "include/core/SkSize.h"
  19. #include "include/core/SkStream.h"
  20. #include "include/core/SkString.h"
  21. #include "include/core/SkTypes.h"
  22. #include "include/encode/SkJpegEncoder.h"
  23. #include "include/encode/SkPngEncoder.h"
  24. #include "include/encode/SkWebpEncoder.h"
  25. #include "tools/Resources.h"
  26. #include <memory>
  27. namespace skiagm {
  28. static const int imageWidth = 128;
  29. static const int imageHeight = 128;
  30. static void make(SkBitmap* bitmap, SkColorType colorType, SkAlphaType alphaType,
  31. sk_sp<SkColorSpace> colorSpace) {
  32. const char* resource;
  33. switch (colorType) {
  34. case kGray_8_SkColorType:
  35. resource = "images/grayscale.jpg";
  36. alphaType = kOpaque_SkAlphaType;
  37. break;
  38. case kRGB_565_SkColorType:
  39. resource = "images/color_wheel.jpg";
  40. alphaType = kOpaque_SkAlphaType;
  41. break;
  42. default:
  43. resource = (kOpaque_SkAlphaType == alphaType) ? "images/color_wheel.jpg"
  44. : "images/color_wheel.png";
  45. break;
  46. }
  47. sk_sp<SkData> data = GetResourceAsData(resource);
  48. if (!data) {
  49. return;
  50. }
  51. std::unique_ptr<SkCodec> codec = SkCodec::MakeFromData(data);
  52. SkImageInfo dstInfo = codec->getInfo().makeColorType(colorType)
  53. .makeAlphaType(alphaType)
  54. .makeColorSpace(colorSpace);
  55. bitmap->allocPixels(dstInfo);
  56. codec->getPixels(dstInfo, bitmap->getPixels(), bitmap->rowBytes());
  57. }
  58. static sk_sp<SkData> encode_data(const SkBitmap& bitmap, SkEncodedImageFormat format) {
  59. SkPixmap src;
  60. if (!bitmap.peekPixels(&src)) {
  61. return nullptr;
  62. }
  63. SkDynamicMemoryWStream buf;
  64. switch (format) {
  65. case SkEncodedImageFormat::kPNG:
  66. SkAssertResult(SkPngEncoder::Encode(&buf, src, SkPngEncoder::Options()));
  67. break;
  68. case SkEncodedImageFormat::kWEBP:
  69. SkAssertResult(SkWebpEncoder::Encode(&buf, src, SkWebpEncoder::Options()));
  70. break;
  71. case SkEncodedImageFormat::kJPEG:
  72. SkAssertResult(SkJpegEncoder::Encode(&buf, src, SkJpegEncoder::Options()));
  73. break;
  74. default:
  75. break;
  76. }
  77. return buf.detachAsData();
  78. }
  79. class EncodeSRGBGM : public GM {
  80. public:
  81. EncodeSRGBGM(SkEncodedImageFormat format)
  82. : fEncodedFormat(format)
  83. {}
  84. protected:
  85. SkString onShortName() override {
  86. const char* format = nullptr;
  87. switch (fEncodedFormat) {
  88. case SkEncodedImageFormat::kPNG:
  89. format = "png";
  90. break;
  91. case SkEncodedImageFormat::kWEBP:
  92. format = "webp";
  93. break;
  94. case SkEncodedImageFormat::kJPEG:
  95. format = "jpg";
  96. break;
  97. default:
  98. break;
  99. }
  100. return SkStringPrintf("encode-srgb-%s", format);
  101. }
  102. SkISize onISize() override {
  103. return SkISize::Make(imageWidth * 2, imageHeight * 15);
  104. }
  105. void onDraw(SkCanvas* canvas) override {
  106. const SkColorType colorTypes[] = {
  107. kN32_SkColorType, kRGBA_F16_SkColorType, kGray_8_SkColorType, kRGB_565_SkColorType,
  108. };
  109. const SkAlphaType alphaTypes[] = {
  110. kUnpremul_SkAlphaType, kPremul_SkAlphaType, kOpaque_SkAlphaType,
  111. };
  112. const sk_sp<SkColorSpace> colorSpaces[] = {
  113. nullptr, SkColorSpace::MakeSRGB(),
  114. };
  115. SkBitmap bitmap;
  116. for (SkColorType colorType : colorTypes) {
  117. for (SkAlphaType alphaType : alphaTypes) {
  118. canvas->save();
  119. for (sk_sp<SkColorSpace> colorSpace : colorSpaces) {
  120. make(&bitmap, colorType, alphaType, colorSpace);
  121. auto image = SkImage::MakeFromEncoded(encode_data(bitmap, fEncodedFormat));
  122. canvas->drawImage(image.get(), 0.0f, 0.0f);
  123. canvas->translate((float) imageWidth, 0.0f);
  124. }
  125. canvas->restore();
  126. canvas->translate(0.0f, (float) imageHeight);
  127. }
  128. }
  129. }
  130. private:
  131. SkEncodedImageFormat fEncodedFormat;
  132. typedef GM INHERITED;
  133. };
  134. DEF_GM( return new EncodeSRGBGM(SkEncodedImageFormat::kPNG); )
  135. DEF_GM( return new EncodeSRGBGM(SkEncodedImageFormat::kWEBP); )
  136. DEF_GM( return new EncodeSRGBGM(SkEncodedImageFormat::kJPEG); )
  137. }