aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports
diff options
context:
space:
mode:
authorGravatar Leon Scroggins III <scroggo@google.com>2017-10-30 09:07:53 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-11-03 15:29:34 +0000
commit0cbc10f94e2b350761e64b225c97390269f41479 (patch)
treea3dd274a32583b289af7fb930ce44a6eec001599 /src/ports
parent60aaeb2b551d5e3e90baacac315e899e26f758f1 (diff)
Make SkImageGeneratorCG apply encoded origin
SkImageGeneratorCG: - Detect the origin and apply it to the output - Deprecate NewFromEncodedCG and add MakeFromEncodedCG SkCodecImageGenerator: - Move code elsewhere for sharing - Apply origin for incomplete decodes SkPixmap.cpp/SkPixmapPriv.h: - Now has the shared code for generators to apply origin DMSrcSink.cpp: - Call MakeFromEncodedCG SkCGUtils.h: - Add a version of SkCopyPixelsFromCGImage that takes an SkPixmap Bug: skia:7138 Bug: skia:3834 Change-Id: Ic6dbc76360c6a84913b67373582f328d3946d637 Reviewed-on: https://skia-review.googlesource.com/63740 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'src/ports')
-rw-r--r--src/ports/SkImageGeneratorCG.cpp61
-rw-r--r--src/ports/SkImageGeneratorCG.h10
2 files changed, 49 insertions, 22 deletions
diff --git a/src/ports/SkImageGeneratorCG.cpp b/src/ports/SkImageGeneratorCG.cpp
index a2fe6a40ef..2d2c3d3bd5 100644
--- a/src/ports/SkImageGeneratorCG.cpp
+++ b/src/ports/SkImageGeneratorCG.cpp
@@ -6,6 +6,7 @@
*/
#include "SkImageGeneratorCG.h"
+#include "SkPixmapPriv.h"
#ifdef SK_BUILD_FOR_MAC
#include <ApplicationServices/ApplicationServices.h>
@@ -28,8 +29,14 @@ static CGImageSourceRef data_to_CGImageSrc(SkData* data) {
return imageSrc;
}
+#ifdef SK_LEGACY_NEW_FROM_ENCODED_CG
SkImageGenerator* SkImageGeneratorCG::NewFromEncodedCG(SkData* data) {
- CGImageSourceRef imageSrc = data_to_CGImageSrc(data);
+ return MakeFromEncodedCG(sk_ref_sp(data)).release();
+}
+#endif
+
+std::unique_ptr<SkImageGenerator> SkImageGeneratorCG::MakeFromEncodedCG(sk_sp<SkData> data) {
+ CGImageSourceRef imageSrc = data_to_CGImageSrc(data.get());
if (!imageSrc) {
return nullptr;
}
@@ -50,8 +57,6 @@ SkImageGenerator* SkImageGeneratorCG::NewFromEncodedCG(SkData* data) {
if (nullptr == widthRef || nullptr == heightRef) {
return nullptr;
}
- bool hasAlpha = (bool) (CFDictionaryGetValue(properties,
- kCGImagePropertyHasAlpha));
int width, height;
if (!CFNumberGetValue(widthRef, kCFNumberIntType, &width) ||
@@ -59,20 +64,37 @@ SkImageGenerator* SkImageGeneratorCG::NewFromEncodedCG(SkData* data) {
return nullptr;
}
+ bool hasAlpha = (bool) (CFDictionaryGetValue(properties,
+ kCGImagePropertyHasAlpha));
SkAlphaType alphaType = hasAlpha ? kPremul_SkAlphaType : kOpaque_SkAlphaType;
SkImageInfo info = SkImageInfo::MakeS32(width, height, alphaType);
+ auto origin = kDefault_SkEncodedOrigin;
+ auto orientationRef = (CFNumberRef) (CFDictionaryGetValue(properties,
+ kCGImagePropertyOrientation));
+ int originInt;
+ if (orientationRef && CFNumberGetValue(orientationRef, kCFNumberIntType, &originInt)) {
+ origin = (SkEncodedOrigin) originInt;
+ }
+
+ if (SkPixmapPriv::ShouldSwapWidthHeight(origin)) {
+ info = SkPixmapPriv::SwapWidthHeight(info);
+ }
+
// FIXME: We have the opportunity to extract color space information here,
// though I think it makes sense to wait until we understand how
// we want to communicate it to the generator.
- return new SkImageGeneratorCG(info, autoImageSrc.release(), data);
+ return std::unique_ptr<SkImageGenerator>(new SkImageGeneratorCG(info, autoImageSrc.release(),
+ std::move(data), origin));
}
-SkImageGeneratorCG::SkImageGeneratorCG(const SkImageInfo& info, const void* imageSrc, SkData* data)
+SkImageGeneratorCG::SkImageGeneratorCG(const SkImageInfo& info, const void* imageSrc,
+ sk_sp<SkData> data, SkEncodedOrigin origin)
: INHERITED(info)
, fImageSrc(imageSrc)
- , fData(SkRef(data))
+ , fData(std::move(data))
+ , fOrigin(origin)
{}
SkData* SkImageGeneratorCG::onRefEncodedData() {
@@ -105,18 +127,17 @@ bool SkImageGeneratorCG::onGetPixels(const SkImageInfo& info, void* pixels, size
}
SkAutoTCallVProc<CGImage, CGImageRelease> autoImage(image);
- // FIXME: Using this function (as opposed to swizzling ourselves) greatly
- // restricts the color and alpha types that we support. If we
- // swizzle ourselves, we can add support for:
- // kUnpremul_SkAlphaType
- // 16-bit per component RGBA
- // kGray_8_SkColorType
- // kIndex_8_SkColorType
- // Additionally, it would be interesting to compare the performance
- // of SkSwizzler with CG's built in swizzler.
- if (!SkCopyPixelsFromCGImage(info, rowBytes, pixels, image)) {
- return false;
- }
-
- return true;
+ SkPixmap dst(info, pixels, rowBytes);
+ auto decode = [&image](const SkPixmap& pm) {
+ // FIXME: Using SkCopyPixelsFromCGImage (as opposed to swizzling
+ // ourselves) greatly restricts the color and alpha types that we
+ // support. If we swizzle ourselves, we can add support for:
+ // kUnpremul_SkAlphaType
+ // 16-bit per component RGBA
+ // kGray_8_SkColorType
+ // Additionally, it would be interesting to compare the performance
+ // of SkSwizzler with CG's built in swizzler.
+ return SkCopyPixelsFromCGImage(pm, image);
+ };
+ return SkPixmapPriv::Orient(dst, fOrigin, decode);
}
diff --git a/src/ports/SkImageGeneratorCG.h b/src/ports/SkImageGeneratorCG.h
index 65300a6de2..58aac4f01a 100644
--- a/src/ports/SkImageGeneratorCG.h
+++ b/src/ports/SkImageGeneratorCG.h
@@ -10,16 +10,21 @@
#include "SkCGUtils.h"
#include "SkData.h"
+#include "SkEncodedOrigin.h"
#include "SkImageGenerator.h"
#include "SkTemplates.h"
class SkImageGeneratorCG : public SkImageGenerator {
public:
+#ifdef SK_LEGACY_NEW_FROM_ENCODED_CG
/*
* Refs the data if an image generator can be returned. Otherwise does
* not affect the data.
*/
static SkImageGenerator* NewFromEncodedCG(SkData* data);
+#endif
+
+ static std::unique_ptr<SkImageGenerator> MakeFromEncodedCG(sk_sp<SkData>);
protected:
SkData* onRefEncodedData() override;
@@ -30,12 +35,13 @@ protected:
private:
/*
* Takes ownership of the imageSrc
- * Refs the data
*/
- SkImageGeneratorCG(const SkImageInfo& info, const void* imageSrc, SkData* data);
+ SkImageGeneratorCG(const SkImageInfo& info, const void* imageSrc, sk_sp<SkData> data,
+ SkEncodedOrigin origin);
SkAutoTCallVProc<const void, CFRelease> fImageSrc;
sk_sp<SkData> fData;
+ const SkEncodedOrigin fOrigin;
typedef SkImageGenerator INHERITED;
};