diff options
author | Hal Canary <halcanary@google.com> | 2016-11-23 20:41:22 -0500 |
---|---|---|
committer | Derek Sollenberger <djsollen@google.com> | 2016-12-07 13:29:42 +0000 |
commit | 10219fb261606fcc71c607167b28295b4578a10d (patch) | |
tree | 38b06a88ef8cd07c6d5517612c098d1a81880044 | |
parent | 4a7cda98fca86d1a1b7df78d302e3caaf07137e1 (diff) |
SkImageEncoder->SkEncodeImage
Test: none
Change-Id: I15630d2852d12840329181f135852e28d287bbcf
(cherry picked from commit 8c6bac4c77caeefb667bec90d16b5384fd2b2b31)
-rw-r--r-- | cmds/screencap/screencap.cpp | 21 | ||||
-rwxr-xr-x | core/jni/android/graphics/Bitmap.cpp | 24 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 21 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.h | 4 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapRegionDecoder.cpp | 2 | ||||
-rw-r--r-- | core/jni/android/graphics/Movie_FactoryDefault.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.cpp | 7 |
7 files changed, 42 insertions, 38 deletions
diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index a41f1224f9ec..377e29d99576 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -175,13 +175,20 @@ int main(int argc, char** argv) if (base != NULL) { if (png) { - const SkImageInfo info = SkImageInfo::Make(w, h, flinger2skia(f), - kPremul_SkAlphaType); - sk_sp<SkData> data(SkImageEncoder::EncodeData(info, base, s*bytesPerPixel(f), - SkImageEncoder::kPNG_Type, SkImageEncoder::kDefaultQuality)); - if (data.get()) { - write(fd, data->data(), data->size()); - } + const SkImageInfo info = + SkImageInfo::Make(w, h, flinger2skia(f), kPremul_SkAlphaType); + SkPixmap pixmap(info, base, s * bytesPerPixel(f)); + struct FDWStream final : public SkWStream { + size_t fBytesWritten = 0; + int fFd; + FDWStream(int f) : fFd(f) {} + size_t bytesWritten() const override { return fBytesWritten; } + bool write(const void* buffer, size_t size) override { + fBytesWritten += size; + return size == 0 || ::write(fFd, buffer, size) > 0; + } + } fdStream(fd); + (void)SkEncodeImage(&fdStream, pixmap, SkEncodedImageFormat::kPNG, 100); if (fn != NULL) { notifyMediaScanner(fn); } diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index d9aa8f1f4a0a..178e07342555 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -668,42 +668,34 @@ enum JavaEncodeFormat { static jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle, jint format, jint quality, jobject jstream, jbyteArray jstorage) { - - LocalScopedBitmap bitmap(bitmapHandle); - SkImageEncoder::Type fm; - + SkEncodedImageFormat fm; switch (format) { case kJPEG_JavaEncodeFormat: - fm = SkImageEncoder::kJPEG_Type; + fm = SkEncodedImageFormat::kJPEG; break; case kPNG_JavaEncodeFormat: - fm = SkImageEncoder::kPNG_Type; + fm = SkEncodedImageFormat::kPNG; break; case kWEBP_JavaEncodeFormat: - fm = SkImageEncoder::kWEBP_Type; + fm = SkEncodedImageFormat::kWEBP; break; default: return JNI_FALSE; } + LocalScopedBitmap bitmap(bitmapHandle); if (!bitmap.valid()) { return JNI_FALSE; } - bool success = false; - std::unique_ptr<SkWStream> strm(CreateJavaOutputStreamAdaptor(env, jstream, jstorage)); if (!strm.get()) { return JNI_FALSE; } - std::unique_ptr<SkImageEncoder> encoder(SkImageEncoder::Create(fm)); - if (encoder.get()) { - SkBitmap skbitmap; - bitmap->getSkBitmap(&skbitmap); - success = encoder->encodeStream(strm.get(), skbitmap, quality); - } - return success ? JNI_TRUE : JNI_FALSE; + SkBitmap skbitmap; + bitmap->getSkBitmap(&skbitmap); + return SkEncodeImage(strm.get(), skbitmap, fm, quality) ? JNI_TRUE : JNI_FALSE; } static void Bitmap_erase(JNIEnv* env, jobject, jlong bitmapHandle, jint color) { diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 2923f94fb7f7..e86acc4b200c 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -48,31 +48,31 @@ jmethodID gInsetStruct_constructorMethodID; using namespace android; -jstring encodedFormatToString(JNIEnv* env, SkEncodedFormat format) { +jstring encodedFormatToString(JNIEnv* env, SkEncodedImageFormat format) { const char* mimeType; switch (format) { - case SkEncodedFormat::kBMP_SkEncodedFormat: + case SkEncodedImageFormat::kBMP: mimeType = "image/bmp"; break; - case SkEncodedFormat::kGIF_SkEncodedFormat: + case SkEncodedImageFormat::kGIF: mimeType = "image/gif"; break; - case SkEncodedFormat::kICO_SkEncodedFormat: + case SkEncodedImageFormat::kICO: mimeType = "image/x-ico"; break; - case SkEncodedFormat::kJPEG_SkEncodedFormat: + case SkEncodedImageFormat::kJPEG: mimeType = "image/jpeg"; break; - case SkEncodedFormat::kPNG_SkEncodedFormat: + case SkEncodedImageFormat::kPNG: mimeType = "image/png"; break; - case SkEncodedFormat::kWEBP_SkEncodedFormat: + case SkEncodedImageFormat::kWEBP: mimeType = "image/webp"; break; - case SkEncodedFormat::kWBMP_SkEncodedFormat: + case SkEncodedImageFormat::kWBMP: mimeType = "image/vnd.wap.wbmp"; break; - case SkEncodedFormat::kDNG_SkEncodedFormat: + case SkEncodedImageFormat::kDNG: mimeType = "image/x-adobe-dng"; break; default: @@ -309,7 +309,8 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding // Set the options and return if the client only wants the size. if (options != NULL) { - jstring mimeType = encodedFormatToString(env, codec->getEncodedFormat()); + jstring mimeType = encodedFormatToString( + env, (SkEncodedImageFormat)codec->getEncodedFormat()); if (env->ExceptionCheck()) { return nullObjectReturn("OOM in encodedFormatToString()"); } diff --git a/core/jni/android/graphics/BitmapFactory.h b/core/jni/android/graphics/BitmapFactory.h index 07825dfe42ef..76db41dca53f 100644 --- a/core/jni/android/graphics/BitmapFactory.h +++ b/core/jni/android/graphics/BitmapFactory.h @@ -2,7 +2,7 @@ #define _ANDROID_GRAPHICS_BITMAP_FACTORY_H_ #include "GraphicsJNI.h" -#include "SkEncodedFormat.h" +#include "SkEncodedImageFormat.h" extern jclass gOptions_class; extern jfieldID gOptions_justBoundsFieldID; @@ -20,7 +20,7 @@ extern jfieldID gOptions_mimeFieldID; extern jfieldID gOptions_mCancelID; extern jfieldID gOptions_bitmapFieldID; -jstring encodedFormatToString(JNIEnv* env, SkEncodedFormat format); +jstring encodedFormatToString(JNIEnv* env, SkEncodedImageFormat format); jobject decodeBitmap(JNIEnv* env, void* data, size_t size); diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index 3b2d5d2c4409..3247851a0ede 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -187,7 +187,7 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, jint in env->SetIntField(options, gOptions_widthFieldID, bitmap.width()); env->SetIntField(options, gOptions_heightFieldID, bitmap.height()); env->SetObjectField(options, gOptions_mimeFieldID, - encodedFormatToString(env, brd->getEncodedFormat())); + encodedFormatToString(env, (SkEncodedImageFormat)brd->getEncodedFormat())); if (env->ExceptionCheck()) { return nullObjectReturn("OOM in encodedFormatToString()"); } diff --git a/core/jni/android/graphics/Movie_FactoryDefault.cpp b/core/jni/android/graphics/Movie_FactoryDefault.cpp index 175e0a64d05b..610f08f45c00 100644 --- a/core/jni/android/graphics/Movie_FactoryDefault.cpp +++ b/core/jni/android/graphics/Movie_FactoryDefault.cpp @@ -7,6 +7,7 @@ #include "Movie.h" #include "SkStream.h" +#include "SkTRegistry.h" typedef SkTRegistry<Movie*(*)(SkStreamRewindable*)> MovieReg; diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index 0f2d09d69bd7..c9432a17bb43 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -17,6 +17,7 @@ #include "SkiaPipeline.h" #include "utils/TraceUtils.h" +#include <SkImageEncoder.h> #include <SkOSFile.h> #include <SkOverdrawCanvas.h> #include <SkOverdrawColorFilter.h> @@ -166,8 +167,10 @@ class PngPixelSerializer : public SkPixelSerializer { public: bool onUseEncodedData(const void*, size_t) override { return true; } SkData* onEncode(const SkPixmap& pixmap) override { - return SkImageEncoder::EncodeData(pixmap.info(), pixmap.addr(), pixmap.rowBytes(), - SkImageEncoder::kPNG_Type, 100); + SkDynamicMemoryWStream buf; + return SkEncodeImage(&buf, pixmap, SkEncodedImageFormat::kPNG, 100) + ? buf.detachAsData().release() + : nullptr; } }; |