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