Merge "SkImageEncoder->SkEncodeImage"

This commit is contained in:
Derek Sollenberger
2016-12-07 18:10:16 +00:00
committed by Android (Google) Code Review
7 changed files with 42 additions and 38 deletions

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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()");
}

View File

@@ -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);

View File

@@ -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()");
}

View File

@@ -7,6 +7,7 @@
#include "Movie.h"
#include "SkStream.h"
#include "SkTRegistry.h"
typedef SkTRegistry<Movie*(*)(SkStreamRewindable*)> MovieReg;

View File

@@ -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;
}
};