From a57488a1f5c14c2114c57880b85c1bbc90024973 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Mon, 25 Jun 2018 14:01:29 -0400 Subject: Expose public factories for platform decoders Bug: skia:8076 Move SkImageGeneratorCG and SkImageGeneratorWIC to include/ports/, and make them SK_API. Remove SkImageGeneratorCG::NewFromEncodedCG. No known clients are using it, and it was a private API in src/. There is already a MakeFromEncodedCG to replace it. Similarly, switch WIC from New to Make. Add a compile test for using them with SetImageGeneratorFromEncodedDataFactory. Change-Id: I897eb7a887b3736a6c614a68e38f38b6a1942cf1 Reviewed-on: https://skia-review.googlesource.com/137387 Reviewed-by: Mike Reed Reviewed-by: Mike Klein Commit-Queue: Leon Scroggins --- dm/DMSrcSink.cpp | 3 +- include/ports/SkImageGeneratorCG.h | 41 ++++++++++++++++++++++++ include/ports/SkImageGeneratorWIC.h | 58 ++++++++++++++++++++++++++++++++++ src/ports/SkImageGeneratorCG.cpp | 6 ---- src/ports/SkImageGeneratorCG.h | 49 ----------------------------- src/ports/SkImageGeneratorWIC.cpp | 12 ++++--- src/ports/SkImageGeneratorWIC.h | 63 ------------------------------------- tests/ImageGeneratorTest.cpp | 14 +++++++++ 8 files changed, 121 insertions(+), 125 deletions(-) create mode 100644 include/ports/SkImageGeneratorCG.h create mode 100644 include/ports/SkImageGeneratorWIC.h delete mode 100644 src/ports/SkImageGeneratorCG.h delete mode 100644 src/ports/SkImageGeneratorWIC.h diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index baa98a0784..9a16e89b07 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -954,9 +954,8 @@ Error ImageGenSrc::draw(SkCanvas* canvas) const { #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) gen = SkImageGeneratorCG::MakeFromEncodedCG(encoded); #elif defined(SK_BUILD_FOR_WIN) - gen.reset(SkImageGeneratorWIC::NewFromEncodedWIC(encoded.get())); + gen = SkImageGeneratorWIC::MakeFromEncodedWIC(encoded); #endif - if (!gen) { return "Could not create platform image generator."; } diff --git a/include/ports/SkImageGeneratorCG.h b/include/ports/SkImageGeneratorCG.h new file mode 100644 index 0000000000..bdf445ae15 --- /dev/null +++ b/include/ports/SkImageGeneratorCG.h @@ -0,0 +1,41 @@ +/* + * 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 "SkTypes.h" +#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) + +#include "SkCGUtils.h" +#include "SkData.h" +#include "SkEncodedOrigin.h" +#include "SkImageGenerator.h" +#include "SkTemplates.h" + +class SK_API SkImageGeneratorCG : public SkImageGenerator { +public: + static std::unique_ptr MakeFromEncodedCG(sk_sp); + +protected: + sk_sp onRefEncodedData() override; + + bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options&) + override; + +private: + /* + * Takes ownership of the imageSrc + */ + SkImageGeneratorCG(const SkImageInfo& info, const void* imageSrc, sk_sp data, + SkEncodedOrigin origin); + + SkAutoTCallVProc fImageSrc; + sk_sp fData; + const SkEncodedOrigin fOrigin; + + typedef SkImageGenerator INHERITED; +}; + +#endif //defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) diff --git a/include/ports/SkImageGeneratorWIC.h b/include/ports/SkImageGeneratorWIC.h new file mode 100644 index 0000000000..0ea0305a34 --- /dev/null +++ b/include/ports/SkImageGeneratorWIC.h @@ -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 "SkTypes.h" + +#if defined(SK_BUILD_FOR_WIN) + +#include "SkData.h" +#include "SkImageGenerator.h" +#include "SkTemplates.h" +#include "SkTScopedComPtr.h" + +#include + +/* + * Any Windows program that uses COM must initialize the COM library by calling + * the CoInitializeEx function. In addition, each thread that uses a COM + * interface must make a separate call to this function. + * + * For every successful call to CoInitializeEx, the thread must call + * CoUninitialize before it exits. + * + * SkImageGeneratorWIC requires the COM library and leaves it to the client to + * initialize COM for their application. + * + * For more information on initializing COM, please see: + * https://msdn.microsoft.com/en-us/library/windows/desktop/ff485844.aspx + */ +class SK_API SkImageGeneratorWIC : public SkImageGenerator { +public: + static std::unique_ptr MakeFromEncodedWIC(sk_sp); + +protected: + sk_sp onRefEncodedData() override; + + bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options&) + override; + +private: + /* + * Takes ownership of the imagingFactory + * Takes ownership of the imageSource + */ + SkImageGeneratorWIC(const SkImageInfo& info, IWICImagingFactory* imagingFactory, + IWICBitmapSource* imageSource, sk_sp); + + SkTScopedComPtr fImagingFactory; + SkTScopedComPtr fImageSource; + sk_sp fData; + + typedef SkImageGenerator INHERITED; +}; + +#endif // SK_BUILD_FOR_WIN diff --git a/src/ports/SkImageGeneratorCG.cpp b/src/ports/SkImageGeneratorCG.cpp index 743b218254..b1058c6c9d 100644 --- a/src/ports/SkImageGeneratorCG.cpp +++ b/src/ports/SkImageGeneratorCG.cpp @@ -29,12 +29,6 @@ static CGImageSourceRef data_to_CGImageSrc(SkData* data) { return imageSrc; } -#ifdef SK_LEGACY_NEW_FROM_ENCODED_CG -SkImageGenerator* SkImageGeneratorCG::NewFromEncodedCG(SkData* data) { - return MakeFromEncodedCG(sk_ref_sp(data)).release(); -} -#endif - std::unique_ptr SkImageGeneratorCG::MakeFromEncodedCG(sk_sp data) { CGImageSourceRef imageSrc = data_to_CGImageSrc(data.get()); if (!imageSrc) { diff --git a/src/ports/SkImageGeneratorCG.h b/src/ports/SkImageGeneratorCG.h deleted file mode 100644 index ee91c845fc..0000000000 --- a/src/ports/SkImageGeneratorCG.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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 "SkTypes.h" -#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) - -#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 MakeFromEncodedCG(sk_sp); - -protected: - sk_sp onRefEncodedData() override; - - bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options&) - override; - -private: - /* - * Takes ownership of the imageSrc - */ - SkImageGeneratorCG(const SkImageInfo& info, const void* imageSrc, sk_sp data, - SkEncodedOrigin origin); - - SkAutoTCallVProc fImageSrc; - sk_sp fData; - const SkEncodedOrigin fOrigin; - - typedef SkImageGenerator INHERITED; -}; - -#endif //defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) diff --git a/src/ports/SkImageGeneratorWIC.cpp b/src/ports/SkImageGeneratorWIC.cpp index 9aa89733d8..2726f886a2 100644 --- a/src/ports/SkImageGeneratorWIC.cpp +++ b/src/ports/SkImageGeneratorWIC.cpp @@ -18,7 +18,7 @@ #undef CLSID_WICImagingFactory #endif -SkImageGenerator* SkImageGeneratorWIC::NewFromEncodedWIC(SkData* data) { +std::unique_ptr SkImageGeneratorWIC::MakeFromEncodedWIC(sk_sp data) { // Create Windows Imaging Component ImagingFactory. SkTScopedComPtr imagingFactory; HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, @@ -31,7 +31,7 @@ SkImageGenerator* SkImageGeneratorWIC::NewFromEncodedWIC(SkData* data) { SkTScopedComPtr iStream; // Note that iStream will take ownership of the new memory stream because // we set |deleteOnRelease| to true. - hr = SkIStream::CreateFromSkStream(new SkMemoryStream(sk_ref_sp(data)), true, &iStream); + hr = SkIStream::CreateFromSkStream(new SkMemoryStream(data), true, &iStream); if (FAILED(hr)) { return nullptr; } @@ -121,15 +121,17 @@ SkImageGenerator* SkImageGeneratorWIC::NewFromEncodedWIC(SkData* data) { // FIXME: If we change the implementation to handle swizzling ourselves, // we can support more output formats. SkImageInfo info = SkImageInfo::MakeS32(width, height, alphaType); - return new SkImageGeneratorWIC(info, imagingFactory.release(), imageSource.release(), data); + return std::unique_ptr( + new SkImageGeneratorWIC(info, imagingFactory.release(), imageSource.release(), + std::move(data))); } SkImageGeneratorWIC::SkImageGeneratorWIC(const SkImageInfo& info, - IWICImagingFactory* imagingFactory, IWICBitmapSource* imageSource, SkData* data) + IWICImagingFactory* imagingFactory, IWICBitmapSource* imageSource, sk_sp data) : INHERITED(info) , fImagingFactory(imagingFactory) , fImageSource(imageSource) - , fData(SkRef(data)) + , fData(std::move(data)) {} sk_sp SkImageGeneratorWIC::onRefEncodedData() { diff --git a/src/ports/SkImageGeneratorWIC.h b/src/ports/SkImageGeneratorWIC.h deleted file mode 100644 index 5da68f2ea7..0000000000 --- a/src/ports/SkImageGeneratorWIC.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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 "SkTypes.h" - -#if defined(SK_BUILD_FOR_WIN) - -#include "SkData.h" -#include "SkImageGenerator.h" -#include "SkTemplates.h" -#include "SkTScopedComPtr.h" - -#include - -/* - * Any Windows program that uses COM must initialize the COM library by calling - * the CoInitializeEx function. In addition, each thread that uses a COM - * interface must make a separate call to this function. - * - * For every successful call to CoInitializeEx, the thread must call - * CoUninitialize before it exits. - * - * SkImageGeneratorWIC requires the COM library and leaves it to the client to - * initialize COM for their application. - * - * For more information on initializing COM, please see: - * https://msdn.microsoft.com/en-us/library/windows/desktop/ff485844.aspx - */ -class SkImageGeneratorWIC : public SkImageGenerator { -public: - /* - * Refs the data if an image generator can be returned. Otherwise does - * not affect the data. - */ - static SkImageGenerator* NewFromEncodedWIC(SkData* data); - -protected: - sk_sp onRefEncodedData() override; - - bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options&) - override; - -private: - /* - * Takes ownership of the imagingFactory - * Takes ownership of the imageSource - * Refs the data - */ - SkImageGeneratorWIC(const SkImageInfo& info, IWICImagingFactory* imagingFactory, - IWICBitmapSource* imageSource, SkData* data); - - SkTScopedComPtr fImagingFactory; - SkTScopedComPtr fImageSource; - sk_sp fData; - - typedef SkImageGenerator INHERITED; -}; - -#endif // SK_BUILD_FOR_WIN diff --git a/tests/ImageGeneratorTest.cpp b/tests/ImageGeneratorTest.cpp index 574c8e8728..0bddcd939d 100644 --- a/tests/ImageGeneratorTest.cpp +++ b/tests/ImageGeneratorTest.cpp @@ -12,6 +12,12 @@ #include "SkImageInfoPriv.h" #include "Test.h" +#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) + #include "SkImageGeneratorCG.h" +#elif defined(SK_BUILD_FOR_WIN) + #include "SkImageGeneratorWIC.h" +#endif + static bool gMyFactoryWasCalled; static std::unique_ptr my_factory(sk_sp) { @@ -36,6 +42,14 @@ static void test_imagegenerator_factory(skiatest::Reporter* reporter) { gen = SkImageGenerator::MakeFromEncoded(data); REPORTER_ASSERT(reporter, nullptr == gen); REPORTER_ASSERT(reporter, gMyFactoryWasCalled); + + // This just verifies that the signatures match. +#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) + SkGraphics::SetImageGeneratorFromEncodedDataFactory(SkImageGeneratorCG::MakeFromEncodedCG); +#elif defined(SK_BUILD_FOR_WIN) + SkGraphics::SetImageGeneratorFromEncodedDataFactory(SkImageGeneratorWIC::MakeFromEncodedWIC); +#endif + SkGraphics::SetImageGeneratorFromEncodedDataFactory(prev); } -- cgit v1.2.3