123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- /*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "gm/gm.h"
- #include "include/codec/SkCodec.h"
- #include "include/core/SkBitmap.h"
- #include "include/core/SkCanvas.h"
- #include "include/core/SkColorSpace.h"
- #include "include/core/SkData.h"
- #include "include/core/SkEncodedImageFormat.h"
- #include "include/core/SkImage.h"
- #include "include/core/SkImageInfo.h"
- #include "include/core/SkPixmap.h"
- #include "include/core/SkRefCnt.h"
- #include "include/core/SkSize.h"
- #include "include/core/SkStream.h"
- #include "include/core/SkString.h"
- #include "include/core/SkTypes.h"
- #include "include/encode/SkJpegEncoder.h"
- #include "include/encode/SkPngEncoder.h"
- #include "include/encode/SkWebpEncoder.h"
- #include "tools/Resources.h"
- #include <memory>
- namespace skiagm {
- static const int imageWidth = 128;
- static const int imageHeight = 128;
- static void make(SkBitmap* bitmap, SkColorType colorType, SkAlphaType alphaType,
- sk_sp<SkColorSpace> colorSpace) {
- const char* resource;
- switch (colorType) {
- case kGray_8_SkColorType:
- resource = "images/grayscale.jpg";
- alphaType = kOpaque_SkAlphaType;
- break;
- case kRGB_565_SkColorType:
- resource = "images/color_wheel.jpg";
- alphaType = kOpaque_SkAlphaType;
- break;
- default:
- resource = (kOpaque_SkAlphaType == alphaType) ? "images/color_wheel.jpg"
- : "images/color_wheel.png";
- break;
- }
- sk_sp<SkData> data = GetResourceAsData(resource);
- if (!data) {
- return;
- }
- std::unique_ptr<SkCodec> codec = SkCodec::MakeFromData(data);
- SkImageInfo dstInfo = codec->getInfo().makeColorType(colorType)
- .makeAlphaType(alphaType)
- .makeColorSpace(colorSpace);
- bitmap->allocPixels(dstInfo);
- codec->getPixels(dstInfo, bitmap->getPixels(), bitmap->rowBytes());
- }
- static sk_sp<SkData> encode_data(const SkBitmap& bitmap, SkEncodedImageFormat format) {
- SkPixmap src;
- if (!bitmap.peekPixels(&src)) {
- return nullptr;
- }
- SkDynamicMemoryWStream buf;
- switch (format) {
- case SkEncodedImageFormat::kPNG:
- SkAssertResult(SkPngEncoder::Encode(&buf, src, SkPngEncoder::Options()));
- break;
- case SkEncodedImageFormat::kWEBP:
- SkAssertResult(SkWebpEncoder::Encode(&buf, src, SkWebpEncoder::Options()));
- break;
- case SkEncodedImageFormat::kJPEG:
- SkAssertResult(SkJpegEncoder::Encode(&buf, src, SkJpegEncoder::Options()));
- break;
- default:
- break;
- }
- return buf.detachAsData();
- }
- class EncodeSRGBGM : public GM {
- public:
- EncodeSRGBGM(SkEncodedImageFormat format)
- : fEncodedFormat(format)
- {}
- protected:
- SkString onShortName() override {
- const char* format = nullptr;
- switch (fEncodedFormat) {
- case SkEncodedImageFormat::kPNG:
- format = "png";
- break;
- case SkEncodedImageFormat::kWEBP:
- format = "webp";
- break;
- case SkEncodedImageFormat::kJPEG:
- format = "jpg";
- break;
- default:
- break;
- }
- return SkStringPrintf("encode-srgb-%s", format);
- }
- SkISize onISize() override {
- return SkISize::Make(imageWidth * 2, imageHeight * 15);
- }
- void onDraw(SkCanvas* canvas) override {
- const SkColorType colorTypes[] = {
- kN32_SkColorType, kRGBA_F16_SkColorType, kGray_8_SkColorType, kRGB_565_SkColorType,
- };
- const SkAlphaType alphaTypes[] = {
- kUnpremul_SkAlphaType, kPremul_SkAlphaType, kOpaque_SkAlphaType,
- };
- const sk_sp<SkColorSpace> colorSpaces[] = {
- nullptr, SkColorSpace::MakeSRGB(),
- };
- SkBitmap bitmap;
- for (SkColorType colorType : colorTypes) {
- for (SkAlphaType alphaType : alphaTypes) {
- canvas->save();
- for (sk_sp<SkColorSpace> colorSpace : colorSpaces) {
- make(&bitmap, colorType, alphaType, colorSpace);
- auto image = SkImage::MakeFromEncoded(encode_data(bitmap, fEncodedFormat));
- canvas->drawImage(image.get(), 0.0f, 0.0f);
- canvas->translate((float) imageWidth, 0.0f);
- }
- canvas->restore();
- canvas->translate(0.0f, (float) imageHeight);
- }
- }
- }
- private:
- SkEncodedImageFormat fEncodedFormat;
- typedef GM INHERITED;
- };
- DEF_GM( return new EncodeSRGBGM(SkEncodedImageFormat::kPNG); )
- DEF_GM( return new EncodeSRGBGM(SkEncodedImageFormat::kWEBP); )
- DEF_GM( return new EncodeSRGBGM(SkEncodedImageFormat::kJPEG); )
- }
|