Index: src/codec/SkCodecPriv.h |
diff --git a/src/codec/SkCodecPriv.h b/src/codec/SkCodecPriv.h |
index 9a28cfdda1690df3268b02198930bd8db2144135..726074195daf23d787c0187520baa9a4a97e1e86 100644 |
--- a/src/codec/SkCodecPriv.h |
+++ b/src/codec/SkCodecPriv.h |
@@ -30,6 +30,45 @@ |
#define COMPUTE_RESULT_ALPHA \ |
SkSwizzler::GetResult(zeroAlpha, maxAlpha); |
+/* |
+ * Returns the first coordinate that we will keep during a scaled decode. |
+ * The output can be interpreted as an x-coordinate or a y-coordinate. |
+ * |
+ * This does not need to be called and is not called when sampleFactor == 1. |
+ */ |
+static int get_start_coord(int sampleFactor) { return sampleFactor / 2; }; |
+ |
+/* |
+ * Given a coordinate in the original image, this returns the corresponding |
+ * coordinate in the scaled image. This function is meaningless if |
+ * IsCoordNecessary returns false. |
+ * The output can be interpreted as an x-coordinate or a y-coordinate. |
+ * |
+ * 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; }; |
+ |
+/* |
+ * When scaling, we will discard certain y-coordinates (rows) and |
+ * x-coordinates (columns). This function returns true if we should keep the |
+ * coordinate and false otherwise. |
+ * The inputs may be x-coordinates or y-coordinates. |
+ * |
+ * 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) { |
+ // Get the first coordinate that we want to keep |
+ int startCoord = get_start_coord(sampleFactor); |
+ |
+ // Return false on edge cases |
+ if (srcCoord < startCoord || get_dst_coord(srcCoord, sampleFactor) >= scaledDim) { |
+ return false; |
+ } |
+ |
+ // Every sampleFactor rows are necessary |
+ return ((srcCoord - startCoord) % sampleFactor) == 0; |
+} |
+ |
static inline bool valid_alpha(SkAlphaType dstAlpha, SkAlphaType srcAlpha) { |
// Check for supported alpha types |
if (srcAlpha != dstAlpha) { |
@@ -132,6 +171,23 @@ 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 |
*/ |