Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright 2016 Google Inc. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license that can be | |
| 5 * found in the LICENSE file. | |
| 6 */ | |
| 7 | |
| 8 #include "SkPngPredictors.h" | |
| 9 #include "SkTypes.h" | |
| 10 | |
| 11 namespace { | |
| 12 enum EncodeOrDecode { | |
|
mtklein
2016/02/19 21:53:07
Please remove the dead kDecode path and all relate
| |
| 13 kEncode, | |
| 14 kDecode, | |
| 15 }; | |
| 16 } | |
| 17 | |
| 18 // If encoding, prev == out is okay. | |
| 19 // If decoding, scanline == out is okay. | |
| 20 // prev can be null. | |
| 21 template<int COMPONENT_COUNT, EncodeOrDecode ENCODE_OR_DECODE> | |
|
mtklein
2016/02/19 21:53:07
ALL_UPPPER_CASE_IS_FOR_MACROS_DUDE
This is genera
| |
| 22 static void paeth(int width, const uint8_t* prev, const uint8_t* scanline, uint8 _t* out) { | |
| 23 static_assert(COMPONENT_COUNT > 0, ""); | |
| 24 // a = left, b = above, c = upper left | |
| 25 if (prev) { | |
| 26 uint8_t a[COMPONENT_COUNT]{}, c[COMPONENT_COUNT]{}; | |
|
mtklein
2016/02/19 21:53:07
I think this would be easier to follow byte-by-byt
| |
| 27 while (width-- > 0) { | |
| 28 for (int cmp = 0; cmp < COMPONENT_COUNT; ++cmp) { | |
| 29 uint8_t b = *prev++; | |
| 30 uint8_t x = *scanline++; | |
| 31 int pa = SkTAbs<int>(b - c[cmp]); | |
| 32 int pb = SkTAbs<int>(a[cmp] - c[cmp]); | |
| 33 int pc = SkTAbs<int>((b - c[cmp]) + (a[cmp] - c[cmp])); | |
| 34 int smallest = SkTMin(pc, SkTMin(pa, pb)); | |
|
mtklein
2016/02/19 21:53:07
For serial code, this is faster and simpler like t
| |
| 35 uint8_t pred = smallest == pa ? a[cmp] : (smallest == pb ? b : c [cmp]); | |
| 36 static_assert(ENCODE_OR_DECODE == kEncode || ENCODE_OR_DECODE == kDecode, ""); | |
| 37 if (ENCODE_OR_DECODE == kEncode) { | |
| 38 *out++ = x - pred; | |
| 39 } else { | |
| 40 *out++ = x + pred; | |
| 41 } | |
| 42 a[cmp] = x; | |
| 43 c[cmp] = b; | |
| 44 } | |
| 45 } | |
| 46 } else { | |
|
mtklein
2016/02/19 21:53:07
Let's split this else case off as
static void s
| |
| 47 uint8_t a[COMPONENT_COUNT]{}; | |
| 48 while (width-- > 0) { | |
| 49 for (int cmp = 0; cmp < COMPONENT_COUNT; ++cmp) { | |
| 50 uint8_t x = *scanline++; | |
| 51 *out++ = x - a[cmp]; | |
|
mtklein
2016/02/19 21:53:07
This is why you should not land dead code.
| |
| 52 a[cmp] = x; | |
| 53 } | |
| 54 } | |
| 55 } | |
| 56 } | |
| 57 | |
| 58 void SkPaethEncode3(int width, const uint8_t* prev, const uint8_t* scanline, uin t8_t* out) { | |
| 59 return paeth<3, kEncode>(width, prev, scanline, out); | |
| 60 } | |
| 61 | |
| 62 void SkPaethEncode1(int width, const uint8_t* prev, const uint8_t* scanline, uin t8_t* out) { | |
| 63 return paeth<1, kEncode>(width, prev, scanline, out); | |
| 64 } | |
| OLD | NEW |