| OLD | NEW |
| (Empty) |
| 1 #include "SkKernel33MaskFilter.h" | |
| 2 #include "SkColorPriv.h" | |
| 3 | |
| 4 SkMask::Format SkKernel33ProcMaskFilter::getFormat() | |
| 5 { | |
| 6 return SkMask::kA8_Format; | |
| 7 } | |
| 8 | |
| 9 bool SkKernel33ProcMaskFilter::filterMask(SkMask* dst, const SkMask& src, const
SkMatrix&, SkIPoint* margin) | |
| 10 { | |
| 11 // margin??? | |
| 12 dst->fImage = NULL; | |
| 13 dst->fBounds = src.fBounds; | |
| 14 dst->fBounds.inset(-1, -1); | |
| 15 dst->fFormat = SkMask::kA8_Format; | |
| 16 | |
| 17 if (NULL == src.fImage) | |
| 18 return true; | |
| 19 | |
| 20 dst->fRowBytes = dst->fBounds.width(); | |
| 21 size_t size = dst->computeImageSize(); | |
| 22 if (0 == size) { | |
| 23 return false; // too big to allocate, abort | |
| 24 } | |
| 25 dst->fImage = SkMask::AllocImage(size); | |
| 26 | |
| 27 const int h = src.fBounds.height(); | |
| 28 const int w = src.fBounds.width(); | |
| 29 const int srcRB = src.fRowBytes; | |
| 30 const uint8_t* srcImage = src.fImage; | |
| 31 uint8_t* dstImage = dst->fImage; | |
| 32 | |
| 33 uint8_t* srcRows[3]; | |
| 34 uint8_t storage[3][3]; | |
| 35 | |
| 36 srcRows[0] = storage[0]; | |
| 37 srcRows[1] = storage[1]; | |
| 38 srcRows[2] = storage[2]; | |
| 39 | |
| 40 unsigned scale = fPercent256; | |
| 41 | |
| 42 for (int y = -1; y <= h; y++) | |
| 43 { | |
| 44 uint8_t* dstRow = dstImage; | |
| 45 for (int x = -1; x <= w; x++) | |
| 46 { | |
| 47 memset(storage, 0, sizeof(storage)); | |
| 48 uint8_t* storagePtr = &storage[0][0]; | |
| 49 | |
| 50 for (int ky = y - 1; ky <= y + 1; ky++) | |
| 51 { | |
| 52 const uint8_t* srcRow = srcImage + ky * srcRB; // may be out-of
-range | |
| 53 for (int kx = x - 1; kx <= x + 1; kx++) | |
| 54 { | |
| 55 if ((unsigned)ky < (unsigned)h && (unsigned)kx < (unsigned)w
) | |
| 56 *storagePtr = srcRow[kx]; | |
| 57 storagePtr++; | |
| 58 } | |
| 59 } | |
| 60 int value = this->computeValue(srcRows); | |
| 61 | |
| 62 if (scale < 256) | |
| 63 value = SkAlphaBlend(value, srcRows[1][1], scale); | |
| 64 *dstRow++ = SkToU8(value); | |
| 65 } | |
| 66 dstImage += dst->fRowBytes; | |
| 67 } | |
| 68 return true; | |
| 69 } | |
| 70 | |
| 71 void SkKernel33ProcMaskFilter::flatten(SkFlattenableWriteBuffer& wb) | |
| 72 { | |
| 73 this->INHERITED::flatten(wb); | |
| 74 wb.write32(fPercent256); | |
| 75 } | |
| 76 | |
| 77 SkKernel33ProcMaskFilter::SkKernel33ProcMaskFilter(SkFlattenableReadBuffer& rb) | |
| 78 : SkMaskFilter(rb) | |
| 79 { | |
| 80 fPercent256 = rb.readS32(); | |
| 81 } | |
| 82 | |
| 83 /////////////////////////////////////////////////////////////////////////////// | |
| 84 | |
| 85 uint8_t SkKernel33MaskFilter::computeValue(uint8_t* const* srcRows) | |
| 86 { | |
| 87 int value = 0; | |
| 88 | |
| 89 for (int i = 0; i < 3; i++) | |
| 90 for (int j = 0; j < 3; j++) | |
| 91 value += fKernel[i][j] * srcRows[i][j]; | |
| 92 | |
| 93 value >>= fShift; | |
| 94 | |
| 95 if (value < 0) | |
| 96 value = 0; | |
| 97 else if (value > 255) | |
| 98 value = 255; | |
| 99 return (uint8_t)value; | |
| 100 } | |
| 101 | |
| 102 void SkKernel33MaskFilter::flatten(SkFlattenableWriteBuffer& wb) | |
| 103 { | |
| 104 this->INHERITED::flatten(wb); | |
| 105 wb.writeMul4(fKernel, 9 * sizeof(int)); | |
| 106 wb.write32(fShift); | |
| 107 } | |
| 108 | |
| 109 SkFlattenable::Factory SkKernel33MaskFilter::getFactory() | |
| 110 { | |
| 111 return Create; | |
| 112 } | |
| 113 | |
| 114 SkFlattenable* SkKernel33MaskFilter::Create(SkFlattenableReadBuffer& rb) | |
| 115 { | |
| 116 return new SkKernel33MaskFilter(rb); | |
| 117 } | |
| 118 | |
| 119 SkKernel33MaskFilter::SkKernel33MaskFilter(SkFlattenableReadBuffer& rb) | |
| 120 : SkKernel33ProcMaskFilter(rb) | |
| 121 { | |
| 122 rb.read(fKernel, 9 * sizeof(int)); | |
| 123 fShift = rb.readS32(); | |
| 124 } | |
| 125 | |
| OLD | NEW |