| Index: dm/DMSrcSink.cpp
|
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
|
| index 39b92cd80021355a8e7283c3f43ad29c5f3b0e76..f3ed574d89c24298cde4a17dc8a2b5ad261d0aeb 100644
|
| --- a/dm/DMSrcSink.cpp
|
| +++ b/dm/DMSrcSink.cpp
|
| @@ -31,24 +31,26 @@ Name GMSrc::name() const {
|
|
|
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
| -ImageSrc::ImageSrc(Path path, int subsets) : fPath(path), fSubsets(subsets) {}
|
| +ImageSrc::ImageSrc(Path path, int divisor) : fPath(path), fDivisor(divisor) {}
|
|
|
| Error ImageSrc::draw(SkCanvas* canvas) const {
|
| SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
|
| if (!encoded) {
|
| return SkStringPrintf("Couldn't read %s.", fPath.c_str());
|
| }
|
| - if (fSubsets == 0) {
|
| + const SkColorType dstColorType = canvas->imageInfo().colorType();
|
| + if (fDivisor == 0) {
|
| // Decode the full image.
|
| SkBitmap bitmap;
|
| - if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bitmap)) {
|
| + if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bitmap,
|
| + dstColorType, SkImageDecoder::kDecodePixels_Mode)) {
|
| return SkStringPrintf("Couldn't decode %s.", fPath.c_str());
|
| }
|
| encoded.reset((SkData*)NULL); // Might as well drop this when we're done with it.
|
| canvas->drawBitmap(bitmap, 0,0);
|
| return "";
|
| }
|
| - // Decode random subsets. This is a little involved.
|
| + // Decode subsets. This is a little involved.
|
| SkAutoTDelete<SkMemoryStream> stream(new SkMemoryStream(encoded));
|
| SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream.get()));
|
| if (!decoder) {
|
| @@ -59,21 +61,24 @@ Error ImageSrc::draw(SkCanvas* canvas) const {
|
| if (!decoder->buildTileIndex(stream.detach(), &w, &h) || w*h == 1) {
|
| return ""; // Not an error. Subset decoding is not always supported.
|
| }
|
| - SkRandom rand;
|
| - for (int i = 0; i < fSubsets; i++) {
|
| - SkIRect rect;
|
| - do {
|
| - rect.fLeft = rand.nextULessThan(w);
|
| - rect.fTop = rand.nextULessThan(h);
|
| - rect.fRight = rand.nextULessThan(w);
|
| - rect.fBottom = rand.nextULessThan(h);
|
| - rect.sort();
|
| - } while (rect.isEmpty());
|
| - SkBitmap subset;
|
| - if (!decoder->decodeSubset(&subset, rect, kUnknown_SkColorType/*use best fit*/)) {
|
| - return SkStringPrintf("Could not decode subset %d.\n", i);
|
| +
|
| + // Divide the image into subsets that cover the entire image.
|
| + if (fDivisor > w || fDivisor > h) {
|
| + return SkStringPrintf("divisor %d is too big for %s with dimensions (%d x %d)",
|
| + fDivisor, fPath.c_str(), w, h);
|
| + }
|
| + const int subsetWidth = w / fDivisor,
|
| + subsetHeight = h / fDivisor;
|
| + for (int y = 0; y < h; y += subsetHeight) {
|
| + for (int x = 0; x < w; x += subsetWidth) {
|
| + SkBitmap subset;
|
| + SkIRect rect = SkIRect::MakeXYWH(x, y, subsetWidth, subsetHeight);
|
| + if (!decoder->decodeSubset(&subset, rect, dstColorType)) {
|
| + return SkStringPrintf("Could not decode subset (%d, %d, %d, %d).",
|
| + x, y, x+subsetWidth, y+subsetHeight);
|
| + }
|
| + canvas->drawBitmap(subset, SkIntToScalar(x), SkIntToScalar(y));
|
| }
|
| - canvas->drawBitmap(subset, SkIntToScalar(rect.fLeft), SkIntToScalar(rect.fTop));
|
| }
|
| return "";
|
| }
|
| @@ -92,11 +97,7 @@ SkISize ImageSrc::size() const {
|
| }
|
|
|
| Name ImageSrc::name() const {
|
| - Name name = SkOSPath::Basename(fPath.c_str());
|
| - if (fSubsets > 0) {
|
| - name.appendf("-%d-subsets", fSubsets);
|
| - }
|
| - return name;
|
| + return SkOSPath::Basename(fPath.c_str());
|
| }
|
|
|
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|