2013-06-14 15:33:20 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2013 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "SkBitmap.h"
|
2013-07-18 20:06:28 +00:00
|
|
|
#include "SkCanvas.h"
|
|
|
|
#include "SkColor.h"
|
2013-06-14 15:33:20 +00:00
|
|
|
#include "SkColorPriv.h"
|
2013-07-18 20:06:28 +00:00
|
|
|
#include "SkData.h"
|
2013-12-20 16:35:22 +00:00
|
|
|
#include "SkDecodingImageGenerator.h"
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
#include "SkDiscardableMemoryPool.h"
|
2013-06-14 15:33:20 +00:00
|
|
|
#include "SkForceLinking.h"
|
2013-07-18 20:06:28 +00:00
|
|
|
#include "SkGradientShader.h"
|
2013-06-14 15:33:20 +00:00
|
|
|
#include "SkImageDecoder.h"
|
2013-07-18 20:06:28 +00:00
|
|
|
#include "SkImageEncoder.h"
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
#include "SkImageGenerator.h"
|
|
|
|
#include "SkImagePriv.h"
|
2013-06-14 15:33:20 +00:00
|
|
|
#include "SkOSFile.h"
|
2013-07-18 20:06:28 +00:00
|
|
|
#include "SkPoint.h"
|
|
|
|
#include "SkShader.h"
|
2013-06-14 15:33:20 +00:00
|
|
|
#include "SkStream.h"
|
|
|
|
#include "SkString.h"
|
2014-01-24 20:56:26 +00:00
|
|
|
#include "Test.h"
|
2013-06-14 15:33:20 +00:00
|
|
|
|
|
|
|
__SK_FORCE_IMAGE_DECODER_LINKING;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Interprets c as an unpremultiplied color, and returns the
|
|
|
|
* premultiplied equivalent.
|
|
|
|
*/
|
|
|
|
static SkPMColor premultiply_unpmcolor(SkPMColor c) {
|
|
|
|
U8CPU a = SkGetPackedA32(c);
|
|
|
|
U8CPU r = SkGetPackedR32(c);
|
|
|
|
U8CPU g = SkGetPackedG32(c);
|
|
|
|
U8CPU b = SkGetPackedB32(c);
|
|
|
|
return SkPreMultiplyARGB(a, r, g, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return true if this stream format should be skipped, due
|
|
|
|
* to do being an opaque format or not a valid format.
|
|
|
|
*/
|
|
|
|
static bool skip_image_format(SkImageDecoder::Format format) {
|
|
|
|
switch (format) {
|
|
|
|
case SkImageDecoder::kPNG_Format:
|
|
|
|
case SkImageDecoder::kWEBP_Format:
|
|
|
|
return false;
|
|
|
|
// Skip unknown since it will not be decoded anyway.
|
|
|
|
case SkImageDecoder::kUnknown_Format:
|
|
|
|
// Technically ICO and BMP supports alpha channels, but our image
|
|
|
|
// decoders do not, so skip them as well.
|
|
|
|
case SkImageDecoder::kICO_Format:
|
|
|
|
case SkImageDecoder::kBMP_Format:
|
|
|
|
// The rest of these are opaque.
|
|
|
|
case SkImageDecoder::kWBMP_Format:
|
|
|
|
case SkImageDecoder::kGIF_Format:
|
|
|
|
case SkImageDecoder::kJPEG_Format:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
SkASSERT(false);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test decoding an image in premultiplied mode and unpremultiplied mode and compare
|
|
|
|
* them.
|
|
|
|
*/
|
|
|
|
static void compare_unpremul(skiatest::Reporter* reporter, const SkString& filename) {
|
|
|
|
// Decode a resource:
|
|
|
|
SkBitmap bm8888;
|
|
|
|
SkBitmap bm8888Unpremul;
|
|
|
|
|
|
|
|
SkFILEStream stream(filename.c_str());
|
|
|
|
|
|
|
|
SkImageDecoder::Format format = SkImageDecoder::GetStreamFormat(&stream);
|
|
|
|
if (skip_image_format(format)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(&stream));
|
|
|
|
if (NULL == decoder.get()) {
|
|
|
|
SkDebugf("couldn't decode %s\n", filename.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool success = decoder->decode(&stream, &bm8888, SkBitmap::kARGB_8888_Config,
|
|
|
|
SkImageDecoder::kDecodePixels_Mode);
|
|
|
|
if (!success) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
success = stream.rewind();
|
|
|
|
REPORTER_ASSERT(reporter, success);
|
|
|
|
if (!success) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
decoder->setRequireUnpremultipliedColors(true);
|
|
|
|
success = decoder->decode(&stream, &bm8888Unpremul, SkBitmap::kARGB_8888_Config,
|
|
|
|
SkImageDecoder::kDecodePixels_Mode);
|
|
|
|
if (!success) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool dimensionsMatch = bm8888.width() == bm8888Unpremul.width()
|
|
|
|
&& bm8888.height() == bm8888Unpremul.height();
|
|
|
|
REPORTER_ASSERT(reporter, dimensionsMatch);
|
|
|
|
if (!dimensionsMatch) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Only do the comparison if the two bitmaps are both 8888.
|
|
|
|
if (bm8888.config() != SkBitmap::kARGB_8888_Config
|
|
|
|
|| bm8888Unpremul.config() != SkBitmap::kARGB_8888_Config) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now compare the two bitmaps.
|
|
|
|
for (int i = 0; i < bm8888.width(); ++i) {
|
|
|
|
for (int j = 0; j < bm8888.height(); ++j) {
|
|
|
|
// "c0" is the color of the premultiplied bitmap at (i, j).
|
|
|
|
const SkPMColor c0 = *bm8888.getAddr32(i, j);
|
|
|
|
// "c1" is the result of premultiplying the color of the unpremultiplied
|
|
|
|
// bitmap at (i, j).
|
|
|
|
const SkPMColor c1 = premultiply_unpmcolor(*bm8888Unpremul.getAddr32(i, j));
|
|
|
|
// Compute the difference for each component.
|
|
|
|
int da = SkAbs32(SkGetPackedA32(c0) - SkGetPackedA32(c1));
|
|
|
|
int dr = SkAbs32(SkGetPackedR32(c0) - SkGetPackedR32(c1));
|
|
|
|
int dg = SkAbs32(SkGetPackedG32(c0) - SkGetPackedG32(c1));
|
|
|
|
int db = SkAbs32(SkGetPackedB32(c0) - SkGetPackedB32(c1));
|
|
|
|
|
|
|
|
// Alpha component must be exactly the same.
|
|
|
|
REPORTER_ASSERT(reporter, 0 == da);
|
2013-06-14 20:39:48 +00:00
|
|
|
|
|
|
|
// Color components may not match exactly due to rounding error.
|
|
|
|
REPORTER_ASSERT(reporter, dr <= 1);
|
|
|
|
REPORTER_ASSERT(reporter, dg <= 1);
|
|
|
|
REPORTER_ASSERT(reporter, db <= 1);
|
2013-06-14 15:33:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-18 19:34:49 +00:00
|
|
|
static void test_unpremul(skiatest::Reporter* reporter) {
|
2013-06-14 15:33:20 +00:00
|
|
|
// This test cannot run if there is no resource path.
|
|
|
|
SkString resourcePath = skiatest::Test::GetResourcePath();
|
|
|
|
if (resourcePath.isEmpty()) {
|
2013-10-24 21:39:35 +00:00
|
|
|
SkDebugf("Could not run unpremul test because resourcePath not specified.");
|
2013-06-14 15:33:20 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
SkOSFile::Iter iter(resourcePath.c_str());
|
|
|
|
SkString basename;
|
|
|
|
if (iter.next(&basename)) {
|
|
|
|
do {
|
|
|
|
SkString filename = SkOSPath::SkPathJoin(resourcePath.c_str(), basename.c_str());
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
// SkDebugf("about to decode \"%s\"\n", filename.c_str());
|
2013-06-14 15:33:20 +00:00
|
|
|
compare_unpremul(reporter, filename);
|
|
|
|
} while (iter.next(&basename));
|
|
|
|
} else {
|
|
|
|
SkDebugf("Failed to find any files :(\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-18 20:06:28 +00:00
|
|
|
#ifdef SK_DEBUG
|
|
|
|
// Create a stream containing a bitmap encoded to Type type.
|
2013-09-25 21:34:24 +00:00
|
|
|
static SkMemoryStream* create_image_stream(SkImageEncoder::Type type) {
|
2013-07-18 20:06:28 +00:00
|
|
|
SkBitmap bm;
|
|
|
|
const int size = 50;
|
2014-02-13 14:41:43 +00:00
|
|
|
bm.allocN32Pixels(size, size);
|
2013-07-18 20:06:28 +00:00
|
|
|
SkCanvas canvas(bm);
|
|
|
|
SkPoint points[2] = {
|
|
|
|
{ SkIntToScalar(0), SkIntToScalar(0) },
|
|
|
|
{ SkIntToScalar(size), SkIntToScalar(size) }
|
|
|
|
};
|
|
|
|
SkColor colors[2] = { SK_ColorWHITE, SK_ColorBLUE };
|
|
|
|
SkShader* shader = SkGradientShader::CreateLinear(points, colors, NULL,
|
|
|
|
SK_ARRAY_COUNT(colors),
|
|
|
|
SkShader::kClamp_TileMode);
|
|
|
|
SkPaint paint;
|
|
|
|
paint.setShader(shader)->unref();
|
|
|
|
canvas.drawPaint(paint);
|
|
|
|
// Now encode it to a stream.
|
|
|
|
SkAutoTUnref<SkData> data(SkImageEncoder::EncodeData(bm, type, 100));
|
|
|
|
if (NULL == data.get()) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return SkNEW_ARGS(SkMemoryStream, (data.get()));
|
|
|
|
}
|
|
|
|
|
|
|
|
// For every format that supports tile based decoding, ensure that
|
|
|
|
// calling decodeSubset will not fail if the caller has unreffed the
|
|
|
|
// stream provided in buildTileIndex.
|
|
|
|
// Only runs in debug mode since we are testing for a crash.
|
|
|
|
static void test_stream_life() {
|
|
|
|
const SkImageEncoder::Type gTypes[] = {
|
|
|
|
#ifdef SK_BUILD_FOR_ANDROID
|
2013-08-07 19:53:53 +00:00
|
|
|
SkImageEncoder::kJPEG_Type,
|
2013-07-18 20:06:28 +00:00
|
|
|
SkImageEncoder::kPNG_Type,
|
|
|
|
#endif
|
|
|
|
SkImageEncoder::kWEBP_Type,
|
|
|
|
};
|
|
|
|
for (size_t i = 0; i < SK_ARRAY_COUNT(gTypes); ++i) {
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
// SkDebugf("encoding to %i\n", i);
|
2013-09-25 21:34:24 +00:00
|
|
|
SkAutoTUnref<SkMemoryStream> stream(create_image_stream(gTypes[i]));
|
2013-07-18 20:06:28 +00:00
|
|
|
if (NULL == stream.get()) {
|
|
|
|
SkDebugf("no stream\n");
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream));
|
|
|
|
if (NULL == decoder.get()) {
|
|
|
|
SkDebugf("no decoder\n");
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
int width, height;
|
|
|
|
if (!decoder->buildTileIndex(stream.get(), &width, &height)) {
|
|
|
|
SkDebugf("could not build a tile index\n");
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// Now unref the stream to make sure it survives
|
|
|
|
stream.reset(NULL);
|
|
|
|
SkBitmap bm;
|
|
|
|
decoder->decodeSubset(&bm, SkIRect::MakeWH(width, height),
|
|
|
|
SkBitmap::kARGB_8888_Config);
|
|
|
|
}
|
|
|
|
}
|
Add an option on SkImageDecoder to skip writing 0s.
Only implemented for PNG.
Add a getter and setter, and sets the default to false in the
constructor. Also copies the setting in copyFieldsToOther.
Fix an indpendent bug where fDitherImage was not being copied in
copyFieldsToOther.
In SkScaledBitmapSampler::begin, consolidate the settings passed in
by passing a const reference to the decoder. The decoder can be
referenced for its settings of dither, unpremultiplied, and now
skipping writing zeroes. Update callers to use the new API. In png
decoder, rather than passing around a pointer to an initial
read of getDitherImage, and potentially changing it, look at the
field on the decoder itself, and modify it directly. This is a
change in behavior - now if that same decoder is used to decode
a different image, the dither setting has changed. I think this is
okay because A) the typical use case is to use a new decoder for
each decode, B) we do not make any promises that a decode does not
change the decoder and C) it makes the code in SkScaledBitmapSampler
much cleaner.
In SkScaledBitmapScampler, add new row procs for skipping zeroes. Now
that choosing the row proc has five dimensions (src config, dst config,
dither, skip writing zeroes, unpremultiplied), use a new method: each
src/dst combination has a function for choosing the right proc depending
on the decoder.
SkScaledBitmapScampler::RowProc is now public for convenience.
Remove Sample_Gray_D8888_Unpremul, which is effectively no different
from Sample_Gray_D8888.
In cases where unpremultiplied was trivial, such as 565 and when
sampling from gray, decoding may now succeed.
Add a benchmark (currently disabled) for comparing the speed of skipping
writing zeroes versus not skipping. For this particular image, which is
mostly transparent pixels, normal decoding took about 3.6 milliseconds,
while skipping zeroes in the decode took only about 2.5 milliseconds
(this is on a Nexus 4). Presumably it would be slower on an image
with a small amount of transparency, but there will be no slowdown
for an image which reports that it has no transparency.
In SkImageRef_ashmem, always skip writing zeroes, since ashmem
memory is guaranteed to be initialized to 0.
Add a flag to skip writing zeroes in skimage.
Add a regression test for choosing the rowproc to ensure I did not
change any behavior accidentally.
BUG=skia:1661
R=reed@google.com
Review URL: https://codereview.chromium.org/24269006
git-svn-id: http://skia.googlecode.com/svn/trunk@11558 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-10-01 17:27:15 +00:00
|
|
|
|
|
|
|
// Test inside SkScaledBitmapSampler.cpp
|
|
|
|
extern void test_row_proc_choice();
|
|
|
|
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
#endif // SK_DEBUG
|
2013-07-18 20:06:28 +00:00
|
|
|
|
2013-12-12 21:11:12 +00:00
|
|
|
DEF_TEST(ImageDecoding, reporter) {
|
2013-07-18 19:34:49 +00:00
|
|
|
test_unpremul(reporter);
|
2013-07-18 20:06:28 +00:00
|
|
|
#ifdef SK_DEBUG
|
|
|
|
test_stream_life();
|
Add an option on SkImageDecoder to skip writing 0s.
Only implemented for PNG.
Add a getter and setter, and sets the default to false in the
constructor. Also copies the setting in copyFieldsToOther.
Fix an indpendent bug where fDitherImage was not being copied in
copyFieldsToOther.
In SkScaledBitmapSampler::begin, consolidate the settings passed in
by passing a const reference to the decoder. The decoder can be
referenced for its settings of dither, unpremultiplied, and now
skipping writing zeroes. Update callers to use the new API. In png
decoder, rather than passing around a pointer to an initial
read of getDitherImage, and potentially changing it, look at the
field on the decoder itself, and modify it directly. This is a
change in behavior - now if that same decoder is used to decode
a different image, the dither setting has changed. I think this is
okay because A) the typical use case is to use a new decoder for
each decode, B) we do not make any promises that a decode does not
change the decoder and C) it makes the code in SkScaledBitmapSampler
much cleaner.
In SkScaledBitmapScampler, add new row procs for skipping zeroes. Now
that choosing the row proc has five dimensions (src config, dst config,
dither, skip writing zeroes, unpremultiplied), use a new method: each
src/dst combination has a function for choosing the right proc depending
on the decoder.
SkScaledBitmapScampler::RowProc is now public for convenience.
Remove Sample_Gray_D8888_Unpremul, which is effectively no different
from Sample_Gray_D8888.
In cases where unpremultiplied was trivial, such as 565 and when
sampling from gray, decoding may now succeed.
Add a benchmark (currently disabled) for comparing the speed of skipping
writing zeroes versus not skipping. For this particular image, which is
mostly transparent pixels, normal decoding took about 3.6 milliseconds,
while skipping zeroes in the decode took only about 2.5 milliseconds
(this is on a Nexus 4). Presumably it would be slower on an image
with a small amount of transparency, but there will be no slowdown
for an image which reports that it has no transparency.
In SkImageRef_ashmem, always skip writing zeroes, since ashmem
memory is guaranteed to be initialized to 0.
Add a flag to skip writing zeroes in skimage.
Add a regression test for choosing the rowproc to ensure I did not
change any behavior accidentally.
BUG=skia:1661
R=reed@google.com
Review URL: https://codereview.chromium.org/24269006
git-svn-id: http://skia.googlecode.com/svn/trunk@11558 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-10-01 17:27:15 +00:00
|
|
|
test_row_proc_choice();
|
2013-07-18 20:06:28 +00:00
|
|
|
#endif
|
2013-07-18 19:34:49 +00:00
|
|
|
}
|
2013-12-20 16:35:22 +00:00
|
|
|
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
// expected output for 8x8 bitmap
|
2014-01-21 23:39:22 +00:00
|
|
|
static const int kExpectedWidth = 8;
|
|
|
|
static const int kExpectedHeight = 8;
|
|
|
|
static const SkColor kExpectedPixels[] = {
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
0xffbba570, 0xff395f5d, 0xffe25c39, 0xff197666,
|
|
|
|
0xff3cba27, 0xffdefcb0, 0xffc13874, 0xfffa0093,
|
|
|
|
0xffbda60e, 0xffc01db6, 0xff2bd688, 0xff9362d4,
|
|
|
|
0xffc641b2, 0xffa5cede, 0xff606eba, 0xff8f4bf3,
|
|
|
|
0xff3bf742, 0xff8f02a8, 0xff5509df, 0xffc7027e,
|
|
|
|
0xff24aa8a, 0xff886c96, 0xff625481, 0xff403689,
|
|
|
|
0xffc52152, 0xff78ccd6, 0xffdcb4ab, 0xff09d27d,
|
|
|
|
0xffca00f3, 0xff605d47, 0xff446fb2, 0xff576e46,
|
|
|
|
0xff273df9, 0xffb41a83, 0xfff812c3, 0xffccab67,
|
|
|
|
0xff034218, 0xff7db9a7, 0xff821048, 0xfffe4ab4,
|
|
|
|
0xff6fac98, 0xff941d27, 0xff5fe411, 0xfffbb283,
|
|
|
|
0xffd86e99, 0xff169162, 0xff71128c, 0xff39cab4,
|
|
|
|
0xffa7fe63, 0xff4c956b, 0xffbc22e0, 0xffb272e4,
|
|
|
|
0xff129f4a, 0xffe34513, 0xff3d3742, 0xffbd190a,
|
|
|
|
0xffb07222, 0xff2e23f8, 0xfff089d9, 0xffb35738,
|
|
|
|
0xffa86022, 0xff3340fe, 0xff95fe71, 0xff6a71df
|
|
|
|
};
|
|
|
|
SK_COMPILE_ASSERT((kExpectedWidth * kExpectedHeight)
|
|
|
|
== SK_ARRAY_COUNT(kExpectedPixels), array_size_mismatch);
|
2013-12-20 16:35:22 +00:00
|
|
|
|
|
|
|
DEF_TEST(WebP, reporter) {
|
|
|
|
const unsigned char encodedWebP[] = {
|
|
|
|
0x52, 0x49, 0x46, 0x46, 0x2c, 0x01, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50,
|
|
|
|
0x56, 0x50, 0x38, 0x4c, 0x20, 0x01, 0x00, 0x00, 0x2f, 0x07, 0xc0, 0x01,
|
|
|
|
0x00, 0xff, 0x01, 0x45, 0x03, 0x00, 0xe2, 0xd5, 0xae, 0x60, 0x2b, 0xad,
|
|
|
|
0xd9, 0x68, 0x76, 0xb6, 0x8d, 0x6a, 0x1d, 0xc0, 0xe6, 0x19, 0xd6, 0x16,
|
|
|
|
0xb7, 0xb4, 0xef, 0xcf, 0xc3, 0x15, 0x6c, 0xb3, 0xbd, 0x77, 0x0d, 0x85,
|
|
|
|
0x6d, 0x1b, 0xa9, 0xb1, 0x2b, 0xdc, 0x3d, 0x83, 0xdb, 0x00, 0x00, 0xc8,
|
|
|
|
0x26, 0xe5, 0x01, 0x99, 0x8a, 0xd5, 0xdd, 0xfc, 0x82, 0xcd, 0xcd, 0x9a,
|
|
|
|
0x8c, 0x13, 0xcc, 0x1b, 0xba, 0xf5, 0x05, 0xdb, 0xee, 0x6a, 0xdb, 0x38,
|
|
|
|
0x60, 0xfe, 0x43, 0x2c, 0xd4, 0x6a, 0x99, 0x4d, 0xc6, 0xc0, 0xd3, 0x28,
|
|
|
|
0x1b, 0xc1, 0xb1, 0x17, 0x4e, 0x43, 0x0e, 0x3d, 0x27, 0xe9, 0xe4, 0x84,
|
|
|
|
0x4f, 0x24, 0x62, 0x69, 0x85, 0x43, 0x8d, 0xc2, 0x04, 0x00, 0x07, 0x59,
|
|
|
|
0x60, 0xfd, 0x8b, 0x4d, 0x60, 0x32, 0x72, 0xcf, 0x88, 0x0c, 0x2f, 0x2f,
|
|
|
|
0xad, 0x62, 0xbd, 0x27, 0x09, 0x16, 0x70, 0x78, 0x6c, 0xd9, 0x82, 0xef,
|
|
|
|
0x1a, 0xa2, 0xcc, 0xf0, 0xf1, 0x6f, 0xd8, 0x78, 0x2e, 0x39, 0xa1, 0xcf,
|
|
|
|
0x14, 0x4b, 0x89, 0xb4, 0x1b, 0x48, 0x15, 0x7c, 0x48, 0x6f, 0x8c, 0x20,
|
|
|
|
0xb7, 0x00, 0xcf, 0xfc, 0xdb, 0xd0, 0xe9, 0xe7, 0x42, 0x09, 0xa4, 0x03,
|
|
|
|
0x40, 0xac, 0xda, 0x40, 0x01, 0x00, 0x5f, 0xa1, 0x3d, 0x64, 0xe1, 0xf4,
|
|
|
|
0x03, 0x45, 0x29, 0xe0, 0xe2, 0x4a, 0xc3, 0xa2, 0xe8, 0xe0, 0x25, 0x12,
|
|
|
|
0x74, 0xc6, 0xe8, 0xfb, 0x93, 0x4f, 0x9f, 0x5e, 0xc0, 0xa6, 0x91, 0x1b,
|
|
|
|
0xa4, 0x24, 0x82, 0xc3, 0x61, 0x07, 0x4c, 0x49, 0x4f, 0x53, 0xae, 0x5f,
|
|
|
|
0x5d, 0x39, 0x36, 0xc0, 0x5b, 0x57, 0x54, 0x60, 0x10, 0x00, 0x00, 0xd1,
|
|
|
|
0x68, 0xb6, 0x6d, 0xdb, 0x36, 0x22, 0xfa, 0x1f, 0x35, 0x75, 0x22, 0xec,
|
|
|
|
0x31, 0xbc, 0x5d, 0x8f, 0x87, 0x53, 0xa2, 0x05, 0x8c, 0x2f, 0xcd, 0xa8,
|
|
|
|
0xa7, 0xf3, 0xa3, 0xbd, 0x83, 0x8b, 0x2a, 0xc8, 0x58, 0xf5, 0xac, 0x80,
|
|
|
|
0xe3, 0xfe, 0x66, 0xa4, 0x7c, 0x1b, 0x6c, 0xd1, 0xa9, 0xd8, 0x14, 0xd0,
|
|
|
|
0xc5, 0xb5, 0x39, 0x71, 0x97, 0x19, 0x19, 0x1b
|
|
|
|
};
|
|
|
|
SkAutoDataUnref encoded(SkData::NewWithCopy(encodedWebP,
|
|
|
|
sizeof(encodedWebP)));
|
|
|
|
SkBitmap bm;
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
|
|
|
|
bool success = SkInstallDiscardablePixelRef(
|
|
|
|
SkDecodingImageGenerator::Create(encoded,
|
|
|
|
SkDecodingImageGenerator::Options()), &bm, NULL);
|
|
|
|
|
2013-12-20 16:35:22 +00:00
|
|
|
REPORTER_ASSERT(reporter, success);
|
|
|
|
if (!success) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
SkAutoLockPixels alp(bm);
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
|
2014-01-03 07:01:45 +00:00
|
|
|
bool rightSize = ((kExpectedWidth == bm.width())
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
&& (kExpectedHeight == bm.height()));
|
2013-12-20 16:35:22 +00:00
|
|
|
REPORTER_ASSERT(reporter, rightSize);
|
|
|
|
if (rightSize) {
|
|
|
|
bool error = false;
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
const SkColor* correctPixel = kExpectedPixels;
|
2013-12-20 16:35:22 +00:00
|
|
|
for (int y = 0; y < bm.height(); ++y) {
|
|
|
|
for (int x = 0; x < bm.width(); ++x) {
|
|
|
|
error |= (*correctPixel != bm.getColor(x, y));
|
|
|
|
++correctPixel;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
REPORTER_ASSERT(reporter, !error);
|
|
|
|
}
|
|
|
|
}
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// example of how Android will do this inside their BitmapFactory
|
|
|
|
static SkPixelRef* install_pixel_ref(SkBitmap* bitmap,
|
|
|
|
SkStreamRewindable* stream,
|
|
|
|
int sampleSize, bool ditherImage) {
|
|
|
|
SkASSERT(bitmap != NULL);
|
|
|
|
SkASSERT(stream != NULL);
|
|
|
|
SkASSERT(stream->rewind());
|
|
|
|
SkASSERT(stream->unique());
|
2014-02-11 18:21:45 +00:00
|
|
|
SkColorType colorType = bitmap->colorType();
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
SkDecodingImageGenerator::Options opts(sampleSize, ditherImage, colorType);
|
|
|
|
SkAutoTDelete<SkImageGenerator> gen(
|
|
|
|
SkDecodingImageGenerator::Create(stream, opts));
|
|
|
|
SkImageInfo info;
|
|
|
|
if ((NULL == gen.get()) || !gen->getInfo(&info)) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
SkDiscardableMemory::Factory* factory = NULL;
|
|
|
|
if (info.getSafeSize(info.minRowBytes()) < (32 * 1024)) {
|
|
|
|
// only use ashmem for large images, since mmaps come at a price
|
|
|
|
factory = SkGetGlobalDiscardableMemoryPool();
|
|
|
|
}
|
|
|
|
if (SkInstallDiscardablePixelRef(gen.detach(), bitmap, factory)) {
|
|
|
|
return bitmap->pixelRef();
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* A test for the SkDecodingImageGenerator::Create and
|
|
|
|
* SkInstallDiscardablePixelRef functions.
|
|
|
|
*/
|
|
|
|
DEF_TEST(ImprovedBitmapFactory, reporter) {
|
|
|
|
SkString resourcePath = skiatest::Test::GetResourcePath();
|
|
|
|
SkString directory = SkOSPath::SkPathJoin(resourcePath.c_str(), "encoding");
|
|
|
|
SkString path = SkOSPath::SkPathJoin(directory.c_str(), "randPixels.png");
|
|
|
|
SkAutoTUnref<SkStreamRewindable> stream(
|
|
|
|
SkStream::NewFromFile(path.c_str()));
|
|
|
|
if (sk_exists(path.c_str())) {
|
|
|
|
SkBitmap bm;
|
2014-02-13 14:41:43 +00:00
|
|
|
SkAssertResult(bm.setConfig(SkImageInfo::MakeN32Premul(1, 1)));
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
REPORTER_ASSERT(reporter,
|
|
|
|
NULL != install_pixel_ref(&bm, stream.detach(), 1, true));
|
|
|
|
SkAutoLockPixels alp(bm);
|
|
|
|
REPORTER_ASSERT(reporter, NULL != bm.getPixels());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#if defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_UNIX)
|
|
|
|
static inline bool check_rounding(int value, int dividend, int divisor) {
|
|
|
|
// returns true if (dividend/divisor) rounds up OR down to value
|
|
|
|
return (((divisor * value) > (dividend - divisor))
|
|
|
|
&& ((divisor * value) < (dividend + divisor)));
|
|
|
|
}
|
|
|
|
#endif // SK_BUILD_FOR_ANDROID || SK_BUILD_FOR_UNIX
|
|
|
|
|
|
|
|
|
|
|
|
#if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
|
|
|
|
#define kBackwards_SkColorType kRGBA_8888_SkColorType
|
|
|
|
#elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A)
|
|
|
|
#define kBackwards_SkColorType kBGRA_8888_SkColorType
|
|
|
|
#else
|
|
|
|
#error "SK_*32_SHFIT values must correspond to BGRA or RGBA byte order"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static inline const char* SkColorType_to_string(SkColorType colorType) {
|
|
|
|
switch(colorType) {
|
|
|
|
case kAlpha_8_SkColorType: return "Alpha_8";
|
|
|
|
case kRGB_565_SkColorType: return "RGB_565";
|
|
|
|
case kARGB_4444_SkColorType: return "ARGB_4444";
|
2014-04-10 22:49:20 +00:00
|
|
|
case kN32_SkColorType: return "N32";
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
case kBackwards_SkColorType: return "Backwards";
|
|
|
|
case kIndex_8_SkColorType: return "Index_8";
|
|
|
|
default: return "ERROR";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-10 14:58:10 +00:00
|
|
|
static inline const char* options_colorType(
|
|
|
|
const SkDecodingImageGenerator::Options& opts) {
|
|
|
|
if (opts.fUseRequestedColorType) {
|
|
|
|
return SkColorType_to_string(opts.fRequestedColorType);
|
|
|
|
} else {
|
|
|
|
return "(none)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline const char* yn(bool value) {
|
|
|
|
if (value) {
|
|
|
|
return "yes";
|
|
|
|
} else {
|
|
|
|
return "no";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
/**
|
|
|
|
* Given either a SkStream or a SkData, try to decode the encoded
|
|
|
|
* image using the specified options and report errors.
|
|
|
|
*/
|
|
|
|
static void test_options(skiatest::Reporter* reporter,
|
|
|
|
const SkDecodingImageGenerator::Options& opts,
|
|
|
|
SkStreamRewindable* encodedStream,
|
|
|
|
SkData* encodedData,
|
|
|
|
bool useData,
|
|
|
|
const SkString& path) {
|
|
|
|
SkBitmap bm;
|
|
|
|
bool success = false;
|
|
|
|
if (useData) {
|
|
|
|
if (NULL == encodedData) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
success = SkInstallDiscardablePixelRef(
|
|
|
|
SkDecodingImageGenerator::Create(encodedData, opts), &bm, NULL);
|
|
|
|
} else {
|
|
|
|
if (NULL == encodedStream) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
success = SkInstallDiscardablePixelRef(
|
|
|
|
SkDecodingImageGenerator::Create(encodedStream->duplicate(), opts),
|
|
|
|
&bm, NULL);
|
|
|
|
}
|
|
|
|
if (!success) {
|
|
|
|
if (opts.fUseRequestedColorType
|
|
|
|
&& (kARGB_4444_SkColorType == opts.fRequestedColorType)) {
|
|
|
|
return; // Ignore known conversion inabilities.
|
|
|
|
}
|
|
|
|
// If we get here, it's a failure and we will need more
|
|
|
|
// information about why it failed.
|
2014-01-10 14:58:10 +00:00
|
|
|
ERRORF(reporter, "Bounds decode failed [sampleSize=%d dither=%s "
|
|
|
|
"colorType=%s %s]", opts.fSampleSize, yn(opts.fDitherImage),
|
|
|
|
options_colorType(opts), path.c_str());
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
#if defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_UNIX)
|
|
|
|
// Android is the only system that use Skia's image decoders in
|
|
|
|
// production. For now, we'll only verify that samplesize works
|
|
|
|
// on systems where it already is known to work.
|
|
|
|
REPORTER_ASSERT(reporter, check_rounding(bm.height(), kExpectedHeight,
|
|
|
|
opts.fSampleSize));
|
|
|
|
REPORTER_ASSERT(reporter, check_rounding(bm.width(), kExpectedWidth,
|
|
|
|
opts.fSampleSize));
|
|
|
|
#endif // SK_BUILD_FOR_ANDROID || SK_BUILD_FOR_UNIX
|
|
|
|
SkAutoLockPixels alp(bm);
|
|
|
|
if (bm.getPixels() == NULL) {
|
2014-01-10 14:58:10 +00:00
|
|
|
ERRORF(reporter, "Pixel decode failed [sampleSize=%d dither=%s "
|
|
|
|
"colorType=%s %s]", opts.fSampleSize, yn(opts.fDitherImage),
|
|
|
|
options_colorType(opts), path.c_str());
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
SkBitmap::Config requestedConfig
|
|
|
|
= SkColorTypeToBitmapConfig(opts.fRequestedColorType);
|
|
|
|
REPORTER_ASSERT(reporter,
|
|
|
|
(!opts.fUseRequestedColorType)
|
|
|
|
|| (bm.config() == requestedConfig));
|
|
|
|
|
|
|
|
// Condition under which we should check the decoding results:
|
|
|
|
if ((SkBitmap::kARGB_8888_Config == bm.config())
|
|
|
|
&& (!path.endsWith(".jpg")) // lossy
|
|
|
|
&& (opts.fSampleSize == 1)) { // scaled
|
|
|
|
const SkColor* correctPixels = kExpectedPixels;
|
|
|
|
SkASSERT(bm.height() == kExpectedHeight);
|
|
|
|
SkASSERT(bm.width() == kExpectedWidth);
|
|
|
|
int pixelErrors = 0;
|
|
|
|
for (int y = 0; y < bm.height(); ++y) {
|
|
|
|
for (int x = 0; x < bm.width(); ++x) {
|
|
|
|
if (*correctPixels != bm.getColor(x, y)) {
|
|
|
|
++pixelErrors;
|
|
|
|
}
|
|
|
|
++correctPixels;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (pixelErrors != 0) {
|
2014-01-10 14:58:10 +00:00
|
|
|
ERRORF(reporter, "Pixel-level mismatch (%d of %d) "
|
|
|
|
"[sampleSize=%d dither=%s colorType=%s %s]",
|
|
|
|
pixelErrors, kExpectedHeight * kExpectedWidth,
|
|
|
|
opts.fSampleSize, yn(opts.fDitherImage),
|
|
|
|
options_colorType(opts), path.c_str());
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* SkDecodingImageGenerator has an Options struct which lets the
|
|
|
|
* client of the generator set sample size, dithering, and bitmap
|
|
|
|
* config. This test loops through many possible options and tries
|
|
|
|
* them on a set of 5 small encoded images (each in a different
|
|
|
|
* format). We test both SkData and SkStreamRewindable decoding.
|
|
|
|
*/
|
|
|
|
DEF_TEST(ImageDecoderOptions, reporter) {
|
|
|
|
const char* files[] = {
|
|
|
|
"randPixels.bmp",
|
|
|
|
"randPixels.jpg",
|
|
|
|
"randPixels.png",
|
|
|
|
"randPixels.webp",
|
|
|
|
#if !defined(SK_BUILD_FOR_WIN)
|
|
|
|
// TODO(halcanary): Find out why this fails sometimes.
|
|
|
|
"randPixels.gif",
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
SkString resourceDir = skiatest::Test::GetResourcePath();
|
|
|
|
SkString directory = SkOSPath::SkPathJoin(resourceDir.c_str(), "encoding");
|
|
|
|
if (!sk_exists(directory.c_str())) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int scaleList[] = {1, 2, 3, 4};
|
|
|
|
bool ditherList[] = {true, false};
|
|
|
|
SkColorType colorList[] = {
|
|
|
|
kAlpha_8_SkColorType,
|
|
|
|
kRGB_565_SkColorType,
|
|
|
|
kARGB_4444_SkColorType, // Most decoders will fail on 4444.
|
2014-04-10 22:49:20 +00:00
|
|
|
kN32_SkColorType
|
Add Options to SkDecodingImageGenerator, simplify API.
Motivation: We want to remove redundant classes from Skia. To
that end we want to remove SkImageRef and its subclasses and
replace their uses with SkDiscardablePixelRef +
SkDecodingImageGenerator. Since Android uses SkImageRef, we need
to make sure that SkDecodingImageGenerator allows all of the
settings that Android exposes in BitmapFactory.Options.
To that end, we have created an Options struct for the
SkDecodingImageGenerator which lets the client of the generator set
sample size, dithering, and bitmap config.
We have made the SkDecodingImageGenerator constructor private
and replaced the SkDecodingImageGenerator::Install functions
with a SkDecodingImageGenerator::Create functions (one for
SkData and one for SkStream) which now take a
SkDecodingImageGenerator::Options struct.
Also added a ImageDecoderOptions test which loops through a list
of sets of options and tries them on a set of 5 small encoded
images.
Also updated several users of SkDecodingImageGenerator::Install to
follow new call signature - gm/factory.cpp, LazyDecodeBitmap.cpp,
and PictureTest.cpp, CachedDecodingPixelRefTest.cpp.
We also added a new ImprovedBitmapFactory Test which simulates the
exact function that Android will need to modify to use this,
installPixelRef() in BitmapFactory.
R=reed@google.com, scroggo@google.com
Committed: https://code.google.com/p/skia/source/detail?r=12744
Review URL: https://codereview.chromium.org/93703004
git-svn-id: http://skia.googlecode.com/svn/trunk@12855 2bbb7eff-a529-9590-31e7-b0007b416f81
2014-01-02 13:15:13 +00:00
|
|
|
// Note that indexed color is left out of the list. Lazy
|
|
|
|
// decoding doesn't do indexed color.
|
|
|
|
};
|
|
|
|
const bool useDataList[] = {true, false};
|
|
|
|
|
|
|
|
for (size_t fidx = 0; fidx < SK_ARRAY_COUNT(files); ++fidx) {
|
|
|
|
SkString path = SkOSPath::SkPathJoin(directory.c_str(), files[fidx]);
|
|
|
|
if (!sk_exists(path.c_str())) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
SkAutoDataUnref encodedData(SkData::NewFromFileName(path.c_str()));
|
|
|
|
REPORTER_ASSERT(reporter, encodedData.get() != NULL);
|
|
|
|
SkAutoTUnref<SkStreamRewindable> encodedStream(
|
|
|
|
SkStream::NewFromFile(path.c_str()));
|
|
|
|
REPORTER_ASSERT(reporter, encodedStream.get() != NULL);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < SK_ARRAY_COUNT(scaleList); ++i) {
|
|
|
|
for (size_t j = 0; j < SK_ARRAY_COUNT(ditherList); ++j) {
|
|
|
|
for (size_t m = 0; m < SK_ARRAY_COUNT(useDataList); ++m) {
|
|
|
|
for (size_t k = 0; k < SK_ARRAY_COUNT(colorList); ++k) {
|
|
|
|
SkDecodingImageGenerator::Options opts(scaleList[i],
|
|
|
|
ditherList[j],
|
|
|
|
colorList[k]);
|
|
|
|
test_options(reporter, opts, encodedStream, encodedData,
|
|
|
|
useDataList[m], path);
|
|
|
|
|
|
|
|
}
|
|
|
|
SkDecodingImageGenerator::Options options(scaleList[i],
|
|
|
|
ditherList[j]);
|
|
|
|
test_options(reporter, options, encodedStream, encodedData,
|
|
|
|
useDataList[m], path);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|