diff options
author | Mike Reed <reed@google.com> | 2017-10-17 14:29:36 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-17 14:29:43 +0000 |
commit | dd340146f1fe7414702d6fea251da989d425691e (patch) | |
tree | ef78f1bae61b2108d9c053f396cf5e767d0e127d | |
parent | 5be3a8e061c951dabd94ce7100ca551a16dbe012 (diff) |
Revert "Revert "Revert "apply codec origin in generator"""
This reverts commit 82269abfec798621c8dbbc6bd48996c0b2686f41.
Reason for revert: ios build needs include path for SkCodec.h
Original change's description:
> Revert "Revert "apply codec origin in generator""
>
> This reverts commit 363dd988a55c2ed3fa92e2368c1c889101425734.
>
> Reason for revert: pdfium fix landed
>
> Original change's description:
> > Revert "apply codec origin in generator"
> >
> > This reverts commit fa15877f487333bec876e7315cf584c0d598d098.
> >
> > Reason for revert: Appears to break PDFium.
> >
> > Original change's description:
> > > apply codec origin in generator
> > >
> > > Bug: skia:
> > > Change-Id: I383dacb49b1e3c88467ccdbf3288764bb1bbf01a
> > > Reviewed-on: https://skia-review.googlesource.com/58600
> > > Reviewed-by: Leon Scroggins <scroggo@google.com>
> > > Commit-Queue: Mike Reed <reed@google.com>
> >
> > TBR=scroggo@google.com,reed@google.com
> >
> > Change-Id: Id97137d6ec39ca638c941928bae6510814b1c499
> > No-Presubmit: true
> > No-Tree-Checks: true
> > No-Try: true
> > Bug: skia:
> > Reviewed-on: https://skia-review.googlesource.com/60041
> > Reviewed-by: Ben Wagner <benjaminwagner@google.com>
> > Commit-Queue: Ben Wagner <benjaminwagner@google.com>
>
> TBR=benjaminwagner@google.com,scroggo@google.com,reed@google.com
>
> Change-Id: I1b54a6e6e6cbda07f346ffbbc4977f9db705abcd
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: skia:
> Reviewed-on: https://skia-review.googlesource.com/60320
> Reviewed-by: Mike Reed <reed@google.com>
> Commit-Queue: Mike Reed <reed@google.com>
TBR=benjaminwagner@google.com,scroggo@google.com,reed@google.com
Change-Id: I4c2d310521d1a678b407d30b9fe3c261c49d67bc
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:
Reviewed-on: https://skia-review.googlesource.com/60560
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
-rw-r--r-- | gm/encode.cpp | 26 | ||||
-rw-r--r-- | include/codec/SkCodec.h | 5 | ||||
-rw-r--r-- | src/codec/SkCodecImageGenerator.cpp | 74 | ||||
-rw-r--r-- | src/core/SkPixmap.cpp | 82 | ||||
-rw-r--r-- | src/core/SkPixmapPriv.h | 33 |
5 files changed, 9 insertions, 211 deletions
diff --git a/gm/encode.cpp b/gm/encode.cpp index 88e7724930..bf13d3dc09 100644 --- a/gm/encode.cpp +++ b/gm/encode.cpp @@ -48,29 +48,3 @@ private: DEF_GM( return new EncodeGM; ) } - -/////////// - -#if 0 -DEF_SIMPLE_GM(jpeg_orientation, canvas, 1000, 1000) { - static sk_sp<SkImage> imgs[8]; - if (!imgs[0]) { - for (int i = 0; i < 8; ++i) { - SkString path; - path.printf("/skia/orientation/Landscape_%d.jpg", i + 1); - auto stream = SkStream::MakeFromFile(path.c_str()); - auto data = SkData::MakeFromStream(stream.get(), stream->getLength()); - imgs[i] = SkImage::MakeFromEncoded(data, nullptr); - } - } - canvas->scale(0.25, 0.25); - for (int i = 0; i < 8; ++i) { - SkImage* img = imgs[i].get(); - canvas->drawImage(img, 0, 0, nullptr); - canvas->translate(0, img->height()); - if (i == 3) { - canvas->translate(img->width(), -4*img->height()); - } - } -} -#endif diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h index 6e9c8280b9..e2596890f3 100644 --- a/include/codec/SkCodec.h +++ b/include/codec/SkCodec.h @@ -15,7 +15,6 @@ #include "SkEncodedImageFormat.h" #include "SkEncodedInfo.h" #include "SkImageInfo.h" -#include "SkPixmap.h" #include "SkSize.h" #include "SkStream.h" #include "SkTypes.h" @@ -356,10 +355,6 @@ public: return this->getPixels(info, pixels, rowBytes, nullptr); } - Result getPixels(const SkPixmap& pm, const Options* opts = nullptr) { - return this->getPixels(pm.info(), pm.writable_addr(), pm.rowBytes(), opts); - } - /** * If decoding to YUV is supported, this returns true. Otherwise, this * returns false and does not modify any of the parameters. diff --git a/src/codec/SkCodecImageGenerator.cpp b/src/codec/SkCodecImageGenerator.cpp index e8d7d3038a..e6ca2122ea 100644 --- a/src/codec/SkCodecImageGenerator.cpp +++ b/src/codec/SkCodecImageGenerator.cpp @@ -5,41 +5,8 @@ * found in the LICENSE file. */ -#include "SkAutoPixmapStorage.h" #include "SkCodecImageGenerator.h" #include "SkMakeUnique.h" -#include "SkPixmapPriv.h" - -#define kMirrorX SkPixmapPriv::kMirrorX -#define kMirrorY SkPixmapPriv::kMirrorY -#define kSwapXY SkPixmapPriv::kSwapXY - -const uint8_t gOrientationFlags[] = { - 0, // kTopLeft_Origin - kMirrorX, // kTopRight_Origin - kMirrorX | kMirrorY, // kBottomRight_Origin - kMirrorY, // kBottomLeft_Origin - kSwapXY, // kLeftTop_Origin - kMirrorX | kSwapXY, // kRightTop_Origin - kMirrorX | kMirrorY | kSwapXY, // kRightBottom_Origin - kMirrorY | kSwapXY, // kLeftBottom_Origin -}; - -SkPixmapPriv::OrientFlags SkPixmapPriv::OriginToOrient(SkCodec::Origin o) { - unsigned io = static_cast<int>(o) - 1; - SkASSERT(io < SK_ARRAY_COUNT(gOrientationFlags)); - return static_cast<SkPixmapPriv::OrientFlags>(gOrientationFlags[io]); -} - -static bool should_swap_width_height(SkCodec::Origin o) { - return SkToBool(SkPixmapPriv::OriginToOrient(o) & kSwapXY); -} - -static SkImageInfo swap_width_height(SkImageInfo info) { - return info.makeWH(info.height(), info.width()); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) { auto codec = SkCodec::MakeFromData(data); @@ -50,19 +17,16 @@ std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data)); } -static SkImageInfo adjust_info(SkCodec* codec) { - SkImageInfo info = codec->getInfo(); +static SkImageInfo adjust_info(const SkImageInfo& info) { + SkImageInfo newInfo = info; if (kUnpremul_SkAlphaType == info.alphaType()) { - info = info.makeAlphaType(kPremul_SkAlphaType); + newInfo = newInfo.makeAlphaType(kPremul_SkAlphaType); } - if (should_swap_width_height(codec->getOrigin())) { - info = swap_width_height(info); - } - return info; + return newInfo; } SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data) - : INHERITED(adjust_info(codec.get())) + : INHERITED(adjust_info(codec->getInfo())) , fCodec(std::move(codec)) , fData(std::move(data)) {} @@ -71,35 +35,13 @@ SkData* SkCodecImageGenerator::onRefEncodedData() { return SkRef(fData.get()); } -bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels, - size_t requestRowBytes, const Options& opts) { - const SkCodec::Origin origin = fCodec->getOrigin(); - const SkPixmap request(requestInfo, requestPixels, requestRowBytes); - const SkPixmap* codecMap = &request; - SkAutoPixmapStorage storage; // used if we have to post-orient the output from the codec - - if (origin != SkCodec::kTopLeft_Origin) { - SkImageInfo info = requestInfo; - if (should_swap_width_height(origin)) { - info = swap_width_height(info); - } - // need a tmp buffer to receive the pixels, so we can post-orient them - if (!storage.tryAlloc(info)) { - return false; - } - codecMap = &storage; - } - +bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, + const Options& opts) { SkCodec::Options codecOpts; codecOpts.fPremulBehavior = opts.fBehavior; - SkCodec::Result result = fCodec->getPixels(*codecMap, &codecOpts); + SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, &codecOpts); switch (result) { case SkCodec::kSuccess: - if (codecMap != &request) { - return SkPixmapPriv::Orient(request, *codecMap, - SkPixmapPriv::OriginToOrient(origin)); - } - // fall through case SkCodec::kIncompleteInput: case SkCodec::kErrorInInput: return true; diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp index 7ce97d23f2..1cee0a9d02 100644 --- a/src/core/SkPixmap.cpp +++ b/src/core/SkPixmap.cpp @@ -15,10 +15,9 @@ #include "SkMask.h" #include "SkNx.h" #include "SkPM4f.h" -#include "SkPixmapPriv.h" +#include "SkPixmap.h" #include "SkReadPixelsRec.h" #include "SkSurface.h" -#include "SkTemplates.h" #include "SkUtils.h" ///////////////////////////////////////////////////////////////////////////////////////////////// @@ -382,82 +381,3 @@ bool SkPixmap::computeIsOpaque() const { } return false; } - -////////////////////////////////////////////////////////////////////////////////////////////////// - -template <typename T, typename F> -void apply(const SkPixmap& dst, const SkPixmap& src, unsigned flags, F getAddr) { - const int maxX = dst.width() - 1; - const int maxY = dst.height() - 1; - T* dstRow = (T*)dst.writable_addr(); - for (int dy = 0; dy < dst.height(); ++dy) { - for (int dx = 0; dx < dst.width(); ++dx) { - int sx = dx; - int sy = dy; - if (flags & SkPixmapPriv::kMirrorX) { - sx = maxX - sx; - } - if (flags & SkPixmapPriv::kMirrorY) { - sy = maxY - sy; - } - if (flags & SkPixmapPriv::kSwapXY) { - SkTSwap<int>(sx, sy); - } - dstRow[dx] = getAddr(src, sx, sy); - } - dstRow = SkTAddOffset<T>(dstRow, dst.rowBytes()); - } -} - -static bool apply_orientation(const SkPixmap& dst, const SkPixmap& src, unsigned flags) { - SkASSERT(dst.colorType() == src.colorType()); - - switch (dst.info().bytesPerPixel()) { - case 1: - apply<uint8_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr8(x, y); - }); break; - case 2: - apply<uint16_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr16(x, y); - }); break; - case 4: - apply<uint32_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr32(x, y); - }); break; - case 8: - apply<uint64_t>(dst, src, flags, [](const SkPixmap& pm, int x, int y) { - return *pm.addr64(x, y); - }); break; - default: - return false; - } - return true; -} - -bool SkPixmapPriv::Orient(const SkPixmap& dst, const SkPixmap& src, OrientFlags flags) { - SkASSERT((flags & ~(kMirrorX | kMirrorY | kSwapXY)) == 0); - if (src.colorType() != dst.colorType()) { - return false; - } - // note: we just ignore alphaType and colorSpace for this transformation - - int w = src.width(); - int h = src.height(); - if (flags & kSwapXY) { - SkTSwap(w, h); - } - if (dst.width() != w || dst.height() != h) { - return false; - } - if (w == 0 || h == 0) { - return true; - } - - // check for aliasing to self - if (src.addr() == dst.addr()) { - return flags == 0; - } - return apply_orientation(dst, src, flags); -} - diff --git a/src/core/SkPixmapPriv.h b/src/core/SkPixmapPriv.h deleted file mode 100644 index dfc9ce2dd0..0000000000 --- a/src/core/SkPixmapPriv.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2015 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef SkPixmapPriv_DEFINED -#define SkPixmapPriv_DEFINED - -#include "SkPixmap.h" -#include "SkCodec.h" - -class SkPixmapPriv { -public: - // These flag are applied in this order (swap is applied last) - enum OrientFlags { - kMirrorX = 1 << 0, - kMirrorY = 1 << 1, - kSwapXY = 1 << 2, - }; - - static OrientFlags OriginToOrient(SkCodec::Origin); - - /** - * Copy the pixels in this pixmap into dst, applying the orientation transformations specified - * by the flags. If the inputs are invalid, this returns false and no copy is made. - */ - static bool Orient(const SkPixmap& dst, const SkPixmap& src, OrientFlags); -}; - -#endif - |