Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(263)

Unified Diff: src/codec/SkSwizzler.h

Issue 947283002: Bmp Image Decoding (Closed) Base URL: https://skia.googlesource.com/skia.git@decode-leon-3
Patch Set: Original change plus fix Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/codec/SkMasks.cpp ('k') | src/codec/SkSwizzler.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/codec/SkSwizzler.h
diff --git a/src/codec/SkSwizzler.h b/src/codec/SkSwizzler.h
index 0bf2ee306a9377c64e5691260b2e9272ea853e06..e22c05b2679cb6c72832ec6506498372578dd2b0 100644
--- a/src/codec/SkSwizzler.h
+++ b/src/codec/SkSwizzler.h
@@ -18,32 +18,99 @@ public:
* Enum describing the config of the source data.
*/
enum SrcConfig {
- kGray, // 1 byte per pixel
- kIndex, // 1 byte per pixel
- kRGB, // 3 bytes per pixel
- kRGBX, // 4 byes per pixel (ignore 4th)
- kRGBA, // 4 bytes per pixel
- kRGB_565 // 2 bytes per pixel
+ kGray,
+ kIndex1,
+ kIndex2,
+ kIndex4,
+ kIndex,
+ kRGB,
+ kBGR,
+ kRGBX,
+ kBGRX,
+ kRGBA,
+ kBGRA,
+ kRGB_565,
};
- static int BytesPerPixel(SrcConfig sc) {
+ /*
+ *
+ * Result code for the alpha components of a row.
+ *
+ */
+ typedef uint16_t ResultAlpha;
+ static const ResultAlpha kOpaque_ResultAlpha = 0xFFFF;
+ static const ResultAlpha kTransparent_ResultAlpha = 0x0000;
+
+ /*
+ *
+ * Checks if the result of decoding a row indicates that the row was
+ * transparent.
+ *
+ */
+ static bool IsTransparent(ResultAlpha r) {
+ return kTransparent_ResultAlpha == r;
+ }
+
+ /*
+ *
+ * Checks if the result of decoding a row indicates that the row was
+ * opaque.
+ *
+ */
+ static bool IsOpaque(ResultAlpha r) {
+ return kOpaque_ResultAlpha == r;
+ }
+
+ /*
+ *
+ * Constructs the proper result code based on accumulated alpha masks
+ *
+ */
+ static ResultAlpha GetResult(uint8_t zeroAlpha, uint8_t maxAlpha);
+
+ /*
+ *
+ * Returns bits per pixel for source config
+ *
+ */
+ static int BitsPerPixel(SrcConfig sc) {
switch (sc) {
+ case kIndex1:
+ return 1;
+ case kIndex2:
+ return 2;
+ case kIndex4:
+ return 4;
case kGray:
case kIndex:
- return 1;
+ return 8;
+ case kRGB_565:
+ return 16;
case kRGB:
- return 3;
+ case kBGR:
+ return 24;
case kRGBX:
case kRGBA:
- return 4;
- case kRGB_565:
- return 2;
+ case kBGRX:
+ case kBGRA:
+ return 32;
default:
- SkDebugf("invalid source config passed to BytesPerPixel\n");
- return -1;
+ SkASSERT(false);
+ return 0;
}
}
+ /*
+ *
+ * Returns bytes per pixel for source config
+ * Raises an error if each pixel is not stored in an even number of bytes
+ *
+ */
+ static int BytesPerPixel(SrcConfig sc) {
+ SkASSERT(SkIsAlign8(BitsPerPixel(sc)));
+ return BitsPerPixel(sc) >> 3;
+ }
+
/**
* Create a new SkSwizzler.
* @param sc SrcConfig
@@ -58,36 +125,68 @@ public:
static SkSwizzler* CreateSwizzler(SrcConfig sc, const SkPMColor* ctable,
const SkImageInfo& info, void* dst,
size_t dstRowBytes, bool skipZeroes);
+
/**
* Swizzle the next line. Call height times, once for each row of source.
* @param src The next row of the source data.
- * @return Whether the row had non-opaque alpha.
+ * @return A result code describing if the row was fully opaque, fully
+ * transparent, or neither
*/
- bool next(const uint8_t* SK_RESTRICT src);
+ ResultAlpha next(const uint8_t* SK_RESTRICT src);
+
+ /**
+ *
+ * Alternate version of next that allows the caller to specify the row.
+ * It is very important to only use one version of next. Since the other
+ * version modifies the dst pointer, it will change the behavior of this
+ * function. We will check this in Debug mode.
+ *
+ */
+ ResultAlpha next(const uint8_t* SK_RESTRICT src, int y);
private:
+
+#ifdef SK_DEBUG
+ /*
+ *
+ * Keep track of which version of next the caller is using
+ *
+ */
+ enum NextMode {
+ kUninitialized_NextMode,
+ kConsecutive_NextMode,
+ kDesignateRow_NextMode,
+ };
+
+ NextMode fNextMode;
+#endif
+
/**
* Method for converting raw data to Skia pixels.
* @param dstRow Row in which to write the resulting pixels.
* @param src Row of src data, in format specified by SrcConfig
* @param width Width in pixels
- * @param bpp bytes per pixel of the source.
+ * @param deltaSrc if bitsPerPixel % 8 == 0, deltaSrc is bytesPerPixel
+ * else, deltaSrc is bitsPerPixel
* @param y Line of source.
* @param ctable Colors (used for kIndex source).
*/
- typedef bool (*RowProc)(void* SK_RESTRICT dstRow,
- const uint8_t* SK_RESTRICT src,
- int width, int bpp, int y,
- const SkPMColor ctable[]);
+ typedef ResultAlpha (*RowProc)(void* SK_RESTRICT dstRow,
+ const uint8_t* SK_RESTRICT src,
+ int width, int deltaSrc, int y,
+ const SkPMColor ctable[]);
const RowProc fRowProc;
- const SkPMColor* fColorTable; // Unowned pointer
- const int fSrcPixelSize;
+ const SkPMColor* fColorTable; // Unowned pointer
+ const int fDeltaSrc; // if bitsPerPixel % 8 == 0
+ // deltaSrc is bytesPerPixel
+ // else
+ // deltaSrc is bitsPerPixel
const SkImageInfo fDstInfo;
void* fDstRow;
const size_t fDstRowBytes;
int fCurrY;
- SkSwizzler(RowProc proc, const SkPMColor* ctable, int srcBpp,
+ SkSwizzler(RowProc proc, const SkPMColor* ctable, int deltaSrc,
const SkImageInfo& info, void* dst, size_t rowBytes);
};
« no previous file with comments | « src/codec/SkMasks.cpp ('k') | src/codec/SkSwizzler.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698