| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * Copyright 2015 Google Inc. |    2  * Copyright 2015 Google Inc. | 
|    3  * |    3  * | 
|    4  * Use of this source code is governed by a BSD-style license that can be |    4  * Use of this source code is governed by a BSD-style license that can be | 
|    5  * found in the LICENSE file. |    5  * found in the LICENSE file. | 
|    6  */ |    6  */ | 
|    7  |    7  | 
|    8 #include "DMSrcSink.h" |    8 #include "DMSrcSink.h" | 
|    9 #include "SamplePipeControllers.h" |    9 #include "SamplePipeControllers.h" | 
|   10 #include "SkCodec.h" |   10 #include "SkCodec.h" | 
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  175                 } |  175                 } | 
|  176             } |  176             } | 
|  177             canvas->drawBitmap(bitmap, 0, 0); |  177             canvas->drawBitmap(bitmap, 0, 0); | 
|  178             break; |  178             break; | 
|  179         } |  179         } | 
|  180         case kScanline_Subset_Mode: { |  180         case kScanline_Subset_Mode: { | 
|  181             //this mode decodes the image in divisor*divisor subsets, using a sc
     anline decoder |  181             //this mode decodes the image in divisor*divisor subsets, using a sc
     anline decoder | 
|  182             const int divisor = 2; |  182             const int divisor = 2; | 
|  183             const int w = decodeInfo.width(); |  183             const int w = decodeInfo.width(); | 
|  184             const int h = decodeInfo.height(); |  184             const int h = decodeInfo.height(); | 
|  185             if (w*h == 1) { |  | 
|  186                 return Error::Nonfatal("Subset decoding not supported."); |  | 
|  187             } |  | 
|  188             if (divisor > w || divisor > h) { |  185             if (divisor > w || divisor > h) { | 
|  189                 return SkStringPrintf("divisor %d is too big for %s with dimensi
     ons (%d x %d)", |  186                 return Error::Nonfatal(SkStringPrintf("Cannot decode subset: div
     isor %d is too big" | 
|  190                         divisor, fPath.c_str(), w, h); |  187                         "for %s with dimensions (%d x %d)", divisor, fPath.c_str
     (), w, h)); | 
|  191             } |  188             } | 
|  192             const int subsetWidth = w/divisor; |  189             const int subsetWidth = w/divisor; | 
|  193             const int subsetHeight = h/divisor; |  190             const int subsetHeight = h/divisor; | 
|  194             // One of our subsets will be larger to contain any pixels that do n
     ot divide evenly. |  191             // One of our subsets will be larger to contain any pixels that do n
     ot divide evenly. | 
|  195             const int extraX = w % divisor; |  192             const int extraX = w % divisor; | 
|  196             const int extraY = h % divisor; |  193             const int extraY = h % divisor; | 
|  197             /* |  194             /* | 
|  198             * if w or h are not evenly divided by divisor need to adjust width a
     nd height of end |  195             * if w or h are not evenly divided by divisor need to adjust width a
     nd height of end | 
|  199             * subsets to cover entire image. |  196             * subsets to cover entire image. | 
|  200             * Add extraX and extraY to largestSubsetBm's width and height to adj
     ust width |  197             * Add extraX and extraY to largestSubsetBm's width and height to adj
     ust width | 
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  400         return ""; |  397         return ""; | 
|  401     } |  398     } | 
|  402     // Decode subsets.  This is a little involved. |  399     // Decode subsets.  This is a little involved. | 
|  403     SkAutoTDelete<SkMemoryStream> stream(new SkMemoryStream(encoded)); |  400     SkAutoTDelete<SkMemoryStream> stream(new SkMemoryStream(encoded)); | 
|  404     SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream.get()))
     ; |  401     SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream.get()))
     ; | 
|  405     if (!decoder) { |  402     if (!decoder) { | 
|  406         return SkStringPrintf("Can't find a good decoder for %s.", fPath.c_str()
     ); |  403         return SkStringPrintf("Can't find a good decoder for %s.", fPath.c_str()
     ); | 
|  407     } |  404     } | 
|  408     stream->rewind(); |  405     stream->rewind(); | 
|  409     int w,h; |  406     int w,h; | 
|  410     if (!decoder->buildTileIndex(stream.detach(), &w, &h) || w*h == 1) { |  407     if (!decoder->buildTileIndex(stream.detach(), &w, &h)) { | 
|  411         return Error::Nonfatal("Subset decoding not supported."); |  408         return Error::Nonfatal("Subset decoding not supported."); | 
|  412     } |  409     } | 
|  413  |  410  | 
|  414     // Divide the image into subsets that cover the entire image. |  411     // Divide the image into subsets that cover the entire image. | 
|  415     if (fDivisor > w || fDivisor > h) { |  412     if (fDivisor > w || fDivisor > h) { | 
|  416         return SkStringPrintf("divisor %d is too big for %s with dimensions (%d 
     x %d)", |  413         return Error::Nonfatal(SkStringPrintf("Cannot decode subset: divisor %d 
     is too big" | 
|  417                               fDivisor, fPath.c_str(), w, h); |  414                 "for %s with dimensions (%d x %d)", fDivisor, fPath.c_str(), w, 
     h)); | 
|  418     } |  415     } | 
|  419     const int subsetWidth  = w / fDivisor, |  416     const int subsetWidth  = w / fDivisor, | 
|  420               subsetHeight = h / fDivisor; |  417               subsetHeight = h / fDivisor; | 
|  421     for (int y = 0; y < h; y += subsetHeight) { |  418     for (int y = 0; y < h; y += subsetHeight) { | 
|  422         for (int x = 0; x < w; x += subsetWidth) { |  419         for (int x = 0; x < w; x += subsetWidth) { | 
|  423             SkBitmap subset; |  420             SkBitmap subset; | 
|  424             SkIRect rect = SkIRect::MakeXYWH(x, y, subsetWidth, subsetHeight); |  421             SkIRect rect = SkIRect::MakeXYWH(x, y, subsetWidth, subsetHeight); | 
|  425             if (!decoder->decodeSubset(&subset, rect, dstColorType)) { |  422             if (!decoder->decodeSubset(&subset, rect, dstColorType)) { | 
|  426                 return SkStringPrintf("Could not decode subset (%d, %d, %d, %d).
     ", |  423                 return SkStringPrintf("Could not decode subset (%d, %d, %d, %d).
     ", | 
|  427                                       x, y, x+subsetWidth, y+subsetHeight); |  424                                       x, y, x+subsetWidth, y+subsetHeight); | 
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  970             skr.visit<void>(i, drawsAsSingletonPictures); |  967             skr.visit<void>(i, drawsAsSingletonPictures); | 
|  971         } |  968         } | 
|  972         SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); |  969         SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); | 
|  973  |  970  | 
|  974         canvas->drawPicture(macroPic); |  971         canvas->drawPicture(macroPic); | 
|  975         return ""; |  972         return ""; | 
|  976     }); |  973     }); | 
|  977 } |  974 } | 
|  978  |  975  | 
|  979 }  // namespace DM |  976 }  // namespace DM | 
| OLD | NEW |