static WEBP_INLINE void DoHorizontalFilter(const uint8_t* in, int width, int height, int stride, int row, int num_rows, int inverse, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; SANITY_CHECK(in, out); in += start_offset; out += start_offset; preds = inverse ? out : in; if (row == 0) { // Leftmost pixel is the same as input for topmost scanline. out[0] = in[0]; PredictLine(in + 1, preds, out + 1, width - 1, inverse); row = 1; preds += stride; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { // Leftmost pixel is predicted from above. PredictLine(in, preds - stride, out, 1, inverse); PredictLine(in + 1, preds, out + 1, width - 1, inverse); ++row; preds += stride; in += stride; out += stride; } }
static WEBP_INLINE void DoVerticalFilter(const uint8_t* in, int width, int height, int stride, int row, int num_rows, int inverse, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; SANITY_CHECK(in, out); in += start_offset; out += start_offset; preds = inverse ? out : in; if (row == 0) { // Very first top-left pixel is copied. out[0] = in[0]; // Rest of top scan-line is left-predicted. PredictLine(in + 1, preds, out + 1, width - 1, inverse); row = 1; in += stride; out += stride; } else { // We are starting from in-between. Make sure 'preds' points to prev row. preds -= stride; } // Filter line-by-line. while (row < last_row) { PredictLine(in, preds, out, width, inverse); ++row; preds += stride; in += stride; out += stride; } }
static WEBP_INLINE void DoGradientFilter(const uint8_t* in, int width, int height, int stride, int inverse, uint8_t* out) { const uint8_t* preds = (inverse ? out : in); int h; SANITY_CHECK(in, out); // left prediction for top scan-line out[0] = in[0]; PredictLine(in + 1, preds, out + 1, width - 1, inverse); // Filter line-by-line. for (h = 1; h < height; ++h) { int w; preds += stride; in += stride; out += stride; // leftmost pixel: predict from above. PredictLine(in, preds - stride, out, 1, inverse); for (w = 1; w < width; ++w) { const int pred = GradientPredictor(preds[w - 1], preds[w - stride], preds[w - stride - 1]); out[w] = in[w] + (inverse ? pred : -pred); } } }
static WEBP_INLINE void DoVerticalFilter(const uint8_t* in, int width, int height, int stride, int inverse, uint8_t* out) { int h; const uint8_t* preds = (inverse ? out : in); SANITY_CHECK(in, out); // Very first top-left pixel is copied. out[0] = in[0]; // Rest of top scan-line is left-predicted. PredictLine(in + 1, preds, out + 1, width - 1, inverse); // Filter line-by-line. for (h = 1; h < height; ++h) { in += stride; out += stride; PredictLine(in, preds, out, width, inverse); preds += stride; } }
static WEBP_INLINE void DoHorizontalFilter(const uint8_t* in, int width, int height, int stride, int inverse, uint8_t* out) { int h; const uint8_t* preds = (inverse ? out : in); SANITY_CHECK(in, out); // Filter line-by-line. for (h = 0; h < height; ++h) { // Leftmost pixel is predicted from above (except for topmost scanline). if (h == 0) { out[0] = in[0]; } else { PredictLine(in, preds - stride, out, 1, inverse); } PredictLine(in + 1, preds, out + 1, width - 1, inverse); preds += stride; in += stride; out += stride; } }
static WEBP_INLINE void DoGradientFilter(const uint8_t* in, int width, int height, int stride, int row, int num_rows, int inverse, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; SANITY_CHECK(in, out); in += start_offset; out += start_offset; preds = inverse ? out : in; // left prediction for top scan-line if (row == 0) { out[0] = in[0]; PredictLine(in + 1, preds, out + 1, width - 1, inverse); row = 1; preds += stride; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { int w; // leftmost pixel: predict from above. PredictLine(in, preds - stride, out, 1, inverse); for (w = 1; w < width; ++w) { const int pred = GradientPredictor(preds[w - 1], preds[w - stride], preds[w - stride - 1]); out[w] = in[w] + (inverse ? pred : -pred); } ++row; preds += stride; in += stride; out += stride; } }