| 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 #ifndef SkSwizzler_DEFINED | 8 #ifndef SkSwizzler_DEFINED |
| 9 #define SkSwizzler_DEFINED | 9 #define SkSwizzler_DEFINED |
| 10 | 10 |
| 11 #include "SkCodec.h" | 11 #include "SkCodec.h" |
| 12 #include "SkColor.h" | 12 #include "SkColor.h" |
| 13 #include "SkImageInfo.h" | 13 #include "SkImageInfo.h" |
| 14 #include "SkSampler.h" | 14 #include "SkSampler.h" |
| 15 | 15 |
| 16 class SkSwizzler : public SkSampler { | 16 class SkSwizzler : public SkSampler { |
| 17 public: | 17 public: |
| 18 /** | 18 /** |
| 19 * Enum describing the config of the source data. | |
| 20 */ | |
| 21 enum SrcConfig { | |
| 22 kUnknown, // Invalid type. | |
| 23 kBit, // A single bit to distinguish between white and black. | |
| 24 kGray, | |
| 25 kGrayAlpha, | |
| 26 kIndex1, | |
| 27 kIndex2, | |
| 28 kIndex4, | |
| 29 kIndex, | |
| 30 kRGB, | |
| 31 kBGR, | |
| 32 kBGRX, // The alpha channel can be anything, but the image is opaque
. | |
| 33 kRGBA, | |
| 34 kBGRA, | |
| 35 kCMYK, | |
| 36 kNoOp8, // kNoOp modes are used exclusively for sampling, subsetting,
and | |
| 37 kNoOp16, // copying. The pixels themselves do not need to be modified
. | |
| 38 kNoOp32, | |
| 39 }; | |
| 40 | |
| 41 /* | |
| 42 * | |
| 43 * Returns bits per pixel for source config | |
| 44 * | |
| 45 */ | |
| 46 static int BitsPerPixel(SrcConfig sc) { | |
| 47 switch (sc) { | |
| 48 case kBit: | |
| 49 case kIndex1: | |
| 50 return 1; | |
| 51 case kIndex2: | |
| 52 return 2; | |
| 53 case kIndex4: | |
| 54 return 4; | |
| 55 case kGray: | |
| 56 case kIndex: | |
| 57 case kNoOp8: | |
| 58 return 8; | |
| 59 case kGrayAlpha: | |
| 60 case kNoOp16: | |
| 61 return 16; | |
| 62 case kRGB: | |
| 63 case kBGR: | |
| 64 return 24; | |
| 65 case kRGBA: | |
| 66 case kBGRX: | |
| 67 case kBGRA: | |
| 68 case kCMYK: | |
| 69 case kNoOp32: | |
| 70 return 32; | |
| 71 default: | |
| 72 SkASSERT(false); | |
| 73 return 0; | |
| 74 } | |
| 75 } | |
| 76 | |
| 77 /* | |
| 78 * | |
| 79 * Returns bytes per pixel for source config | |
| 80 * Raises an error if each pixel is not stored in an even number of bytes | |
| 81 * | |
| 82 */ | |
| 83 static int BytesPerPixel(SrcConfig sc) { | |
| 84 SkASSERT(SkIsAlign8(BitsPerPixel(sc))); | |
| 85 return BitsPerPixel(sc) >> 3; | |
| 86 } | |
| 87 | |
| 88 /** | |
| 89 * Create a new SkSwizzler. | 19 * Create a new SkSwizzler. |
| 90 * @param SrcConfig Description of the format of the source. | 20 * @param encodedInfo Description of the format of the encoded data. |
| 91 * @param ctable Unowned pointer to an array of up to 256 colors for an | 21 * @param ctable Unowned pointer to an array of up to 256 colors for an |
| 92 * index source. | 22 * index source. |
| 93 * @param dstInfo Describes the destination. | 23 * @param dstInfo Describes the destination. |
| 94 * @param options Indicates if dst is zero-initialized. The | 24 * @param options Indicates if dst is zero-initialized. The |
| 95 * implementation may choose to skip writing zeroes | 25 * implementation may choose to skip writing zeroes |
| 96 * if set to kYes_ZeroInitialized. | 26 * if set to kYes_ZeroInitialized. |
| 97 * Contains partial scanline information. | 27 * Contains partial scanline information. |
| 98 * @param frame Is non-NULL if the source pixels are part of an image | 28 * @param frame Is non-NULL if the source pixels are part of an image |
| 99 * frame that is a subset of the full image. | 29 * frame that is a subset of the full image. |
| 100 * | 30 * |
| 101 * Note that a deeper discussion of partial scanline subsets and image fram
e | 31 * Note that a deeper discussion of partial scanline subsets and image fram
e |
| 102 * subsets is below. Currently, we do not support both simultaneously. If | 32 * subsets is below. Currently, we do not support both simultaneously. If |
| 103 * options->fSubset is non-NULL, frame must be NULL. | 33 * options->fSubset is non-NULL, frame must be NULL. |
| 104 * | 34 * |
| 105 * @return A new SkSwizzler or nullptr on failure. | 35 * @return A new SkSwizzler or nullptr on failure. |
| 106 */ | 36 */ |
| 107 static SkSwizzler* CreateSwizzler(SrcConfig, const SkPMColor* ctable, | 37 static SkSwizzler* CreateSwizzler(const SkEncodedInfo& encodedInfo, const Sk
PMColor* ctable, |
| 108 const SkImageInfo& dstInfo, const SkCodec:
:Options&, | 38 const SkImageInfo& dstInfo, const SkCodec:
:Options&, |
| 109 const SkIRect* frame = nullptr); | 39 const SkIRect* frame = nullptr); |
| 110 | 40 |
| 111 /** | 41 /** |
| 112 * Swizzle a line. Generally this will be called height times, once | 42 * Swizzle a line. Generally this will be called height times, once |
| 113 * for each row of source. | 43 * for each row of source. |
| 114 * By allowing the caller to pass in the dst pointer, we give the caller | 44 * By allowing the caller to pass in the dst pointer, we give the caller |
| 115 * flexibility to use the swizzler even when the encoded data does not | 45 * flexibility to use the swizzler even when the encoded data does not |
| 116 * store the rows in order. This also improves usability for scaled and | 46 * store the rows in order. This also improves usability for scaled and |
| 117 * subset decodes. | 47 * subset decodes. |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 // fBPP is bitsPerPixel | 192 // fBPP is bitsPerPixel |
| 263 const int fDstBPP; // Bytes per pixel for the destination
color type | 193 const int fDstBPP; // Bytes per pixel for the destination
color type |
| 264 | 194 |
| 265 SkSwizzler(RowProc fastProc, RowProc proc, const SkPMColor* ctable, int srcO
ffset, | 195 SkSwizzler(RowProc fastProc, RowProc proc, const SkPMColor* ctable, int srcO
ffset, |
| 266 int srcWidth, int dstOffset, int dstWidth, int srcBPP, int dstBPP); | 196 int srcWidth, int dstOffset, int dstWidth, int srcBPP, int dstBPP); |
| 267 | 197 |
| 268 int onSetSampleX(int) override; | 198 int onSetSampleX(int) override; |
| 269 | 199 |
| 270 }; | 200 }; |
| 271 #endif // SkSwizzler_DEFINED | 201 #endif // SkSwizzler_DEFINED |
| OLD | NEW |