diff options
author | 2016-06-13 12:26:45 -0700 | |
---|---|---|
committer | 2016-06-13 12:26:45 -0700 | |
commit | 6f163d29438cefaaa10c5cd68e3b77c3cb9a6b79 (patch) | |
tree | 73894218e9d648670a04b10a19de6913bee2380f /tools/viewer/ImageSlide.cpp | |
parent | d490708198e7129a85a070d15869aca469deb797 (diff) |
Display JPGs in Viewer with Split Screen and ColorSpaceXform
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2058753002
Review-Url: https://codereview.chromium.org/2058753002
Diffstat (limited to 'tools/viewer/ImageSlide.cpp')
-rw-r--r-- | tools/viewer/ImageSlide.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tools/viewer/ImageSlide.cpp b/tools/viewer/ImageSlide.cpp new file mode 100644 index 0000000000..4a03185733 --- /dev/null +++ b/tools/viewer/ImageSlide.cpp @@ -0,0 +1,58 @@ +/* +* 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 "ImageSlide.h" + +#include "SkBitmap.h" +#include "SkCodec.h" +#include "SkColorSpaceXform.h" +#include "SkColorSpace.h" +#include "SkCanvas.h" +#include "SkData.h" +#include "SkImage.h" +#include "SkMetaData.h" + +ImageSlide::ImageSlide(const SkString& name, const SkString& path) : fPath(path) { + fName = name; +} + +SkISize ImageSlide::getDimensions() const { + return fImage ? fImage->dimensions() : SkISize::Make(0, 0); +} + +void ImageSlide::draw(SkCanvas* canvas) { + if (canvas->getMetaData().hasBool(kImageColorXformMetaData, true)) { + canvas->drawBitmap(fXformedBitmap, 0, 0); + } else { + // skbug.com/5428 + // drawImage() and drawBitmap() behave differently in sRGB mode. + // canvas->drawImage(fImage.get(), 0, 0); + canvas->drawBitmap(fOriginalBitmap, 0, 0); + } +} + +void ImageSlide::load() { + sk_sp<SkData> encoded = SkData::MakeFromFileName(fPath.c_str()); + fImage = SkImage::MakeFromEncoded(encoded); + fImage->asLegacyBitmap(&fOriginalBitmap, SkImage::kRO_LegacyBitmapMode); + + SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded.get())); + sk_sp<SkColorSpace> srcSpace = sk_ref_sp(codec->getColorSpace()); + sk_sp<SkColorSpace> dstSpace = SkColorSpace::NewNamed(SkColorSpace::kAdobeRGB_Named); + std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(srcSpace, dstSpace); + fOriginalBitmap.deepCopyTo(&fXformedBitmap); + uint32_t* row = (uint32_t*) fXformedBitmap.getPixels(); + for (int y = 0; y < fXformedBitmap.height(); y++) { + xform->xform_RGBA_8888(row, row, fXformedBitmap.width()); + row = SkTAddOffset<uint32_t>(row, fXformedBitmap.rowBytes()); + } + fXformedBitmap.notifyPixelsChanged(); // This is needed for the deepCopy +} + +void ImageSlide::unload() { + fImage.reset(nullptr); +} |