| 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 "SkBmpRLECodec.h" |    8 #include "SkBmpRLECodec.h" | 
|    9 #include "SkCodecPriv.h" |    9 #include "SkCodecPriv.h" | 
|   10 #include "SkColorPriv.h" |   10 #include "SkColorPriv.h" | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   46     } |   46     } | 
|   47     if (dstInfo.dimensions() != this->getInfo().dimensions()) { |   47     if (dstInfo.dimensions() != this->getInfo().dimensions()) { | 
|   48         SkCodecPrintf("Error: scaling not supported.\n"); |   48         SkCodecPrintf("Error: scaling not supported.\n"); | 
|   49         return kInvalidScale; |   49         return kInvalidScale; | 
|   50     } |   50     } | 
|   51     if (!conversion_possible(dstInfo, this->getInfo())) { |   51     if (!conversion_possible(dstInfo, this->getInfo())) { | 
|   52         SkCodecPrintf("Error: cannot convert input type to output type.\n"); |   52         SkCodecPrintf("Error: cannot convert input type to output type.\n"); | 
|   53         return kInvalidConversion; |   53         return kInvalidConversion; | 
|   54     } |   54     } | 
|   55  |   55  | 
|   56     // Create the color table if necessary and prepare the stream for decode |   56     Result result = this->prepareToDecode(dstInfo, opts, inputColorPtr, inputCol
     orCount); | 
|   57     // Note that if it is non-NULL, inputColorCount will be modified |   57     if (kSuccess != result) { | 
|   58     if (!this->createColorTable(inputColorCount)) { |   58         return result; | 
|   59         SkCodecPrintf("Error: could not create color table.\n"); |  | 
|   60         return kInvalidInput; |  | 
|   61     } |  | 
|   62  |  | 
|   63     // Copy the color table to the client if necessary |  | 
|   64     copy_color_table(dstInfo, fColorTable, inputColorPtr, inputColorCount); |  | 
|   65  |  | 
|   66     // Initialize a swizzler if necessary |  | 
|   67     if (!this->initializeStreamBuffer()) { |  | 
|   68         SkCodecPrintf("Error: cannot initialize swizzler.\n"); |  | 
|   69         return kInvalidConversion; |  | 
|   70     } |   59     } | 
|   71  |   60  | 
|   72     // Perform the decode |   61     // Perform the decode | 
|   73     return decode(dstInfo, dst, dstRowBytes, opts); |   62     return decode(dstInfo, dst, dstRowBytes, opts); | 
|   74 } |   63 } | 
|   75  |   64  | 
|   76 /* |   65 /* | 
|   77  * Process the color table for the bmp input |   66  * Process the color table for the bmp input | 
|   78  */ |   67  */ | 
|   79  bool SkBmpRLECodec::createColorTable(int* numColors) { |   68  bool SkBmpRLECodec::createColorTable(int* numColors) { | 
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  189 } |  178 } | 
|  190  |  179  | 
|  191 /* |  180 /* | 
|  192  * Set an RLE pixel using the color table |  181  * Set an RLE pixel using the color table | 
|  193  */ |  182  */ | 
|  194 void SkBmpRLECodec::setPixel(void* dst, size_t dstRowBytes, |  183 void SkBmpRLECodec::setPixel(void* dst, size_t dstRowBytes, | 
|  195                              const SkImageInfo& dstInfo, uint32_t x, uint32_t y, |  184                              const SkImageInfo& dstInfo, uint32_t x, uint32_t y, | 
|  196                              uint8_t index) { |  185                              uint8_t index) { | 
|  197     // Set the row |  186     // Set the row | 
|  198     int height = dstInfo.height(); |  187     int height = dstInfo.height(); | 
|  199     int row; |  188     int row = this->getDstRow(y); | 
|  200     if (SkBmpCodec::kBottomUp_RowOrder == this->rowOrder()) { |  | 
|  201         row = height - y - 1; |  | 
|  202     } else { |  | 
|  203         row = y; |  | 
|  204     } |  | 
|  205  |  189  | 
|  206     // Set the pixel based on destination color type |  190     // Set the pixel based on destination color type | 
|  207     switch (dstInfo.colorType()) { |  191     switch (dstInfo.colorType()) { | 
|  208         case kN32_SkColorType: { |  192         case kN32_SkColorType: { | 
|  209             SkPMColor* dstRow = SkTAddOffset<SkPMColor>((SkPMColor*) dst, |  193             SkPMColor* dstRow = SkTAddOffset<SkPMColor>((SkPMColor*) dst, | 
|  210                     row * (int) dstRowBytes); |  194                     row * (int) dstRowBytes); | 
|  211             dstRow[x] = fColorTable->operator[](index); |  195             dstRow[x] = fColorTable->operator[](index); | 
|  212             break; |  196             break; | 
|  213         } |  197         } | 
|  214         case kRGB_565_SkColorType: { |  198         case kRGB_565_SkColorType: { | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  226  |  210  | 
|  227 /* |  211 /* | 
|  228  * Set an RLE pixel from R, G, B values |  212  * Set an RLE pixel from R, G, B values | 
|  229  */ |  213  */ | 
|  230 void SkBmpRLECodec::setRGBPixel(void* dst, size_t dstRowBytes, |  214 void SkBmpRLECodec::setRGBPixel(void* dst, size_t dstRowBytes, | 
|  231                                 const SkImageInfo& dstInfo, uint32_t x, |  215                                 const SkImageInfo& dstInfo, uint32_t x, | 
|  232                                 uint32_t y, uint8_t red, uint8_t green, |  216                                 uint32_t y, uint8_t red, uint8_t green, | 
|  233                                 uint8_t blue) { |  217                                 uint8_t blue) { | 
|  234     // Set the row |  218     // Set the row | 
|  235     int height = dstInfo.height(); |  219     int height = dstInfo.height(); | 
|  236     int row; |  220     uint32_t row = this->getDstRow(y); | 
|  237     if (SkBmpCodec::kBottomUp_RowOrder == this->rowOrder()) { |  | 
|  238         row = height - y - 1; |  | 
|  239     } else { |  | 
|  240         row = y; |  | 
|  241     } |  | 
|  242  |  221  | 
|  243     // Set the pixel based on destination color type |  222     // Set the pixel based on destination color type | 
|  244     switch (dstInfo.colorType()) { |  223     switch (dstInfo.colorType()) { | 
|  245         case kN32_SkColorType: { |  224         case kN32_SkColorType: { | 
|  246             SkPMColor* dstRow = SkTAddOffset<SkPMColor>((SkPMColor*) dst, |  225             SkPMColor* dstRow = SkTAddOffset<SkPMColor>((SkPMColor*) dst, | 
|  247                     row * (int) dstRowBytes); |  226                     row * (int) dstRowBytes); | 
|  248             dstRow[x] = SkPackARGB32NoCheck(0xFF, red, green, blue); |  227             dstRow[x] = SkPackARGB32NoCheck(0xFF, red, green, blue); | 
|  249             break; |  228             break; | 
|  250         } |  229         } | 
|  251         case kRGB_565_SkColorType: { |  230         case kRGB_565_SkColorType: { | 
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  449                 // Set the indicated number of pixels |  428                 // Set the indicated number of pixels | 
|  450                 for (int which = 0; x < endX; x++) { |  429                 for (int which = 0; x < endX; x++) { | 
|  451                     setPixel(dst, dstRowBytes, dstInfo, x, y, |  430                     setPixel(dst, dstRowBytes, dstInfo, x, y, | 
|  452                             indices[which]); |  431                             indices[which]); | 
|  453                     which = !which; |  432                     which = !which; | 
|  454                 } |  433                 } | 
|  455             } |  434             } | 
|  456         } |  435         } | 
|  457     } |  436     } | 
|  458 } |  437 } | 
 |  438  | 
 |  439 SkCodec::Result SkBmpRLECodec::prepareToDecode(const SkImageInfo& dstInfo, | 
 |  440         const SkCodec::Options& options, SkPMColor inputColorPtr[], int* inputCo
     lorCount) { | 
 |  441     // Create the color table if necessary and prepare the stream for decode | 
 |  442     // Note that if it is non-NULL, inputColorCount will be modified | 
 |  443     if (!this->createColorTable(inputColorCount)) { | 
 |  444         SkCodecPrintf("Error: could not create color table.\n"); | 
 |  445         return SkCodec::kInvalidInput; | 
 |  446     } | 
 |  447  | 
 |  448     // Copy the color table to the client if necessary | 
 |  449     copy_color_table(dstInfo, this->fColorTable, inputColorPtr, inputColorCount)
     ; | 
 |  450  | 
 |  451     // Initialize a buffer for encoded RLE data | 
 |  452     if (!this->initializeStreamBuffer()) { | 
 |  453         SkCodecPrintf("Error: cannot initialize swizzler.\n"); | 
 |  454         return SkCodec::kInvalidConversion; | 
 |  455     } | 
 |  456  | 
 |  457     return SkCodec::kSuccess; | 
 |  458 } | 
| OLD | NEW |