aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage.cpp
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-01-17 16:10:07 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-01-17 21:53:57 +0000
commit0d4ff6c601f2ce404a97068718caad5a2bb3d594 (patch)
treebe37c1e4b454893b7df99aa19585455b728560fc /src/image/SkImage.cpp
parent98420d0c9b5934d6b08ea994844476ddedd23de0 (diff)
Fix code that relied on readPixels not doing color space conversion
SampleApp doesn't have (can't easily get) an image, so I couldn't use the new helper function there. It's probably still worth having? BUG=skia: Change-Id: I60c208ff958076015a9539359921b9aff68f25c8 Reviewed-on: https://skia-review.googlesource.com/7129 Reviewed-by: Matt Sarett <msarett@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/image/SkImage.cpp')
-rw-r--r--src/image/SkImage.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index d2fc8456f3..86d1e195ce 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -409,3 +409,30 @@ void SkImage_unpinAsTexture(const SkImage* image, GrContext* ctx) {
SkASSERT(ctx);
as_IB(image)->onUnpinAsTexture(ctx);
}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+sk_sp<SkImage> SkImageMakeRasterCopyAndAssignColorSpace(const SkImage* src,
+ SkColorSpace* colorSpace) {
+ // Read the pixels out of the source image, with no conversion
+ SkImageInfo info = as_IB(src)->onImageInfo();
+ if (kUnknown_SkColorType == info.colorType()) {
+ SkDEBUGFAIL("Unexpected color type");
+ return nullptr;
+ }
+
+ size_t rowBytes = info.minRowBytes();
+ size_t size = info.getSafeSize(rowBytes);
+ auto data = SkData::MakeUninitialized(size);
+ if (!data) {
+ return nullptr;
+ }
+
+ SkPixmap pm(info, data->writable_data(), rowBytes);
+ if (!src->readPixels(pm, 0, 0, SkImage::kDisallow_CachingHint)) {
+ return nullptr;
+ }
+
+ // Wrap them in a new image with a different color space
+ return SkImage::MakeRasterData(info.makeColorSpace(sk_ref_sp(colorSpace)), data, rowBytes);
+}