Chromium Code Reviews| Index: src/codec/SkCodecPriv.h |
| diff --git a/src/codec/SkCodecPriv.h b/src/codec/SkCodecPriv.h |
| index 2769cec1cd4025f15611d4c9e5d53e65cb2eb47b..1bad7b3028af46ac2289289980c42f3a601d84f8 100644 |
| --- a/src/codec/SkCodecPriv.h |
| +++ b/src/codec/SkCodecPriv.h |
| @@ -8,6 +8,7 @@ |
| #ifndef SkCodecPriv_DEFINED |
| #define SkCodecPriv_DEFINED |
| +#include "SkColorPriv.h" |
| #include "SkColorTable.h" |
| #include "SkImageInfo.h" |
| #include "SkSwizzler.h" |
| @@ -34,7 +35,7 @@ |
| * returns a scaled dimension based on the original dimension and the sampleSize |
| * NOTE: we round down here for scaled dimension to match the behavior of SkImageDecoder |
| */ |
| -static int get_scaled_dimension(int srcDimension, int sampleSize) { |
| +inline int get_scaled_dimension(int srcDimension, int sampleSize) { |
| if (sampleSize > srcDimension) { |
| return 1; |
| } |
| @@ -47,7 +48,7 @@ static int get_scaled_dimension(int srcDimension, int sampleSize) { |
| * |
| * This does not need to be called and is not called when sampleFactor == 1. |
| */ |
| -static int get_start_coord(int sampleFactor) { return sampleFactor / 2; }; |
| +inline int get_start_coord(int sampleFactor) { return sampleFactor / 2; }; |
| /* |
| * Given a coordinate in the original image, this returns the corresponding |
| @@ -57,7 +58,7 @@ static int get_start_coord(int sampleFactor) { return sampleFactor / 2; }; |
| * |
| * This does not need to be called and is not called when sampleFactor == 1. |
| */ |
| -static int get_dst_coord(int srcCoord, int sampleFactor) { return srcCoord / sampleFactor; }; |
| +inline int get_dst_coord(int srcCoord, int sampleFactor) { return srcCoord / sampleFactor; }; |
| /* |
| * When scaling, we will discard certain y-coordinates (rows) and |
| @@ -67,7 +68,7 @@ static int get_dst_coord(int srcCoord, int sampleFactor) { return srcCoord / sam |
| * |
| * This does not need to be called and is not called when sampleFactor == 1. |
| */ |
| -static bool is_coord_necessary(int srcCoord, int sampleFactor, int scaledDim) { |
| +inline bool is_coord_necessary(int srcCoord, int sampleFactor, int scaledDim) { |
| // Get the first coordinate that we want to keep |
| int startCoord = get_start_coord(sampleFactor); |
| @@ -80,7 +81,32 @@ static bool is_coord_necessary(int srcCoord, int sampleFactor, int scaledDim) { |
| return ((srcCoord - startCoord) % sampleFactor) == 0; |
| } |
| -static inline bool valid_alpha(SkAlphaType dstAlpha, SkAlphaType srcAlpha) { |
| +inline uint32_t ceil_div(uint32_t a, uint32_t b) { |
| + return (a + b - 1) / b; |
| +} |
| + |
| +/* |
| + * Gets the output row corresponding to the encoded row for interlaced gifs |
| + */ |
| +inline uint32_t get_output_row_interlaced(uint32_t encodedRow, uint32_t height) { |
|
scroggo
2015/10/08 13:50:30
This got moved here, but it looks like it's back t
msarett
2015/10/08 15:33:25
Yes!
|
| + SkASSERT(encodedRow < height); |
| + // First pass |
| + if (encodedRow * 8 < height) { |
| + return encodedRow * 8; |
| + } |
| + // Second pass |
| + if (encodedRow * 4 < height) { |
| + return 4 + 8 * (encodedRow - ceil_div(height, 8)); |
| + } |
| + // Third pass |
| + if (encodedRow * 2 < height) { |
| + return 2 + 4 * (encodedRow - ceil_div(height, 4)); |
| + } |
| + // Fourth pass |
| + return 1 + 2 * (encodedRow - ceil_div(height, 2)); |
| +} |
| + |
| +inline bool valid_alpha(SkAlphaType dstAlpha, SkAlphaType srcAlpha) { |
| // Check for supported alpha types |
| if (srcAlpha != dstAlpha) { |
| if (kOpaque_SkAlphaType == srcAlpha) { |
| @@ -110,7 +136,7 @@ static inline bool valid_alpha(SkAlphaType dstAlpha, SkAlphaType srcAlpha) { |
| * - always support N32 |
| * - otherwise match the src color type |
| */ |
| -static bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) { |
| +inline bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) { |
| if (dst.profileType() != src.profileType()) { |
| return false; |
| } |
| @@ -134,15 +160,34 @@ static bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) |
| /* |
| * If there is a color table, get a pointer to the colors, otherwise return nullptr |
| */ |
| -static const SkPMColor* get_color_ptr(SkColorTable* colorTable) { |
| +inline const SkPMColor* get_color_ptr(SkColorTable* colorTable) { |
| return nullptr != colorTable ? colorTable->readColors() : nullptr; |
| } |
| /* |
| + * Given that the encoded image uses a color table, return the fill value |
| + */ |
| +inline uint32_t get_color_table_fill_value(SkColorType colorType, const SkPMColor* colorPtr, |
| + uint8_t fillIndex) { |
| + SkASSERT(nullptr != colorPtr); |
| + switch (colorType) { |
| + case kN32_SkColorType: |
| + return colorPtr[fillIndex]; |
| + case kRGB_565_SkColorType: |
| + return SkPixel32ToPixel16(colorPtr[fillIndex]); |
| + case kIndex_8_SkColorType: |
| + return fillIndex; |
| + default: |
| + SkASSERT(false); |
| + return 0; |
| + } |
| +} |
| + |
| +/* |
| * |
| * Copy the codec color table back to the client when kIndex8 color type is requested |
| */ |
| -static inline void copy_color_table(const SkImageInfo& dstInfo, SkColorTable* colorTable, |
| +inline void copy_color_table(const SkImageInfo& dstInfo, SkColorTable* colorTable, |
| SkPMColor* inputColorPtr, int* inputColorCount) { |
| if (kIndex_8_SkColorType == dstInfo.colorType()) { |
| SkASSERT(nullptr != inputColorPtr); |
| @@ -155,21 +200,21 @@ static inline void copy_color_table(const SkImageInfo& dstInfo, SkColorTable* co |
| /* |
| * Compute row bytes for an image using pixels per byte |
| */ |
| -static inline size_t compute_row_bytes_ppb(int width, uint32_t pixelsPerByte) { |
| +inline size_t compute_row_bytes_ppb(int width, uint32_t pixelsPerByte) { |
| return (width + pixelsPerByte - 1) / pixelsPerByte; |
| } |
| /* |
| * Compute row bytes for an image using bytes per pixel |
| */ |
| -static inline size_t compute_row_bytes_bpp(int width, uint32_t bytesPerPixel) { |
| +inline size_t compute_row_bytes_bpp(int width, uint32_t bytesPerPixel) { |
| return width * bytesPerPixel; |
| } |
| /* |
| * Compute row bytes for an image |
| */ |
| -static inline size_t compute_row_bytes(int width, uint32_t bitsPerPixel) { |
| +inline size_t compute_row_bytes(int width, uint32_t bitsPerPixel) { |
| if (bitsPerPixel < 16) { |
| SkASSERT(0 == 8 % bitsPerPixel); |
| const uint32_t pixelsPerByte = 8 / bitsPerPixel; |
| @@ -182,27 +227,10 @@ static inline size_t compute_row_bytes(int width, uint32_t bitsPerPixel) { |
| } |
| /* |
| - * On incomplete images, get the color to fill with |
| - */ |
| -static inline SkPMColor get_fill_color_or_index(SkAlphaType alphaType) { |
| - // This condition works properly for all supported output color types. |
| - // kIndex8: The low 8-bits of both possible return values is 0, which is |
| - // our desired default index. |
| - // kGray8: The low 8-bits of both possible return values is 0, which is |
| - // black, our desired fill value. |
| - // kRGB565: The low 16-bits of both possible return values is 0, which is |
| - // black, our desired fill value. |
| - // kN32: Return black for opaque images and transparent for non-opaque |
| - // images. |
| - return kOpaque_SkAlphaType == alphaType ? |
| - SK_ColorBLACK : SK_ColorTRANSPARENT; |
| -} |
| - |
| -/* |
| * Get a byte from a buffer |
| * This method is unsafe, the caller is responsible for performing a check |
| */ |
| -static inline uint8_t get_byte(uint8_t* buffer, uint32_t i) { |
| +inline uint8_t get_byte(uint8_t* buffer, uint32_t i) { |
| return buffer[i]; |
| } |
| @@ -210,7 +238,7 @@ static inline uint8_t get_byte(uint8_t* buffer, uint32_t i) { |
| * Get a short from a buffer |
| * This method is unsafe, the caller is responsible for performing a check |
| */ |
| -static inline uint16_t get_short(uint8_t* buffer, uint32_t i) { |
| +inline uint16_t get_short(uint8_t* buffer, uint32_t i) { |
| uint16_t result; |
| memcpy(&result, &(buffer[i]), 2); |
| #ifdef SK_CPU_BENDIAN |
| @@ -224,7 +252,7 @@ static inline uint16_t get_short(uint8_t* buffer, uint32_t i) { |
| * Get an int from a buffer |
| * This method is unsafe, the caller is responsible for performing a check |
| */ |
| -static inline uint32_t get_int(uint8_t* buffer, uint32_t i) { |
| +inline uint32_t get_int(uint8_t* buffer, uint32_t i) { |
| uint32_t result; |
| memcpy(&result, &(buffer[i]), 4); |
| #ifdef SK_CPU_BENDIAN |