| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkRegionPriv.h" | 10 #include "SkRegionPriv.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 100 |
| 101 SkRgnBuilder::~SkRgnBuilder() { | 101 SkRgnBuilder::~SkRgnBuilder() { |
| 102 sk_free(fStorage); | 102 sk_free(fStorage); |
| 103 } | 103 } |
| 104 | 104 |
| 105 bool SkRgnBuilder::init(int maxHeight, int maxTransitions, bool pathIsInverse) { | 105 bool SkRgnBuilder::init(int maxHeight, int maxTransitions, bool pathIsInverse) { |
| 106 if ((maxHeight | maxTransitions) < 0) { | 106 if ((maxHeight | maxTransitions) < 0) { |
| 107 return false; | 107 return false; |
| 108 } | 108 } |
| 109 | 109 |
| 110 Sk64 count, size; | |
| 111 | |
| 112 if (pathIsInverse) { | 110 if (pathIsInverse) { |
| 113 // allow for additional X transitions to "invert" each scanline | 111 // allow for additional X transitions to "invert" each scanline |
| 114 // [ L' ... normal transitions ... R' ] | 112 // [ L' ... normal transitions ... R' ] |
| 115 // | 113 // |
| 116 maxTransitions += 2; | 114 maxTransitions += 2; |
| 117 } | 115 } |
| 118 | 116 |
| 119 // compute the count with +1 and +3 slop for the working buffer | 117 // compute the count with +1 and +3 slop for the working buffer |
| 120 count.setMul(maxHeight + 1, 3 + maxTransitions); | 118 int64_t count = sk_64_mul(maxHeight + 1, 3 + maxTransitions); |
| 121 | 119 |
| 122 if (pathIsInverse) { | 120 if (pathIsInverse) { |
| 123 // allow for two "empty" rows for the top and bottom | 121 // allow for two "empty" rows for the top and bottom |
| 124 // [ Y, 1, L, R, S] == 5 (*2 for top and bottom) | 122 // [ Y, 1, L, R, S] == 5 (*2 for top and bottom) |
| 125 count.add(10); | 123 count += 10; |
| 126 } | 124 } |
| 127 | 125 |
| 128 if (!count.is32() || count.isNeg()) { | 126 if (count < 0 || !sk_64_isS32(count)) { |
| 129 return false; | 127 return false; |
| 130 } | 128 } |
| 131 fStorageCount = count.get32(); | 129 fStorageCount = sk_64_asS32(count); |
| 132 | 130 |
| 133 size.setMul(fStorageCount, sizeof(SkRegion::RunType)); | 131 int64_t size = sk_64_mul(fStorageCount, sizeof(SkRegion::RunType)); |
| 134 if (!size.is32() || size.isNeg()) { | 132 if (size < 0 || !sk_64_isS32(size)) { |
| 135 return false; | 133 return false; |
| 136 } | 134 } |
| 137 | 135 |
| 138 fStorage = (SkRegion::RunType*)sk_malloc_flags(size.get32(), 0); | 136 fStorage = (SkRegion::RunType*)sk_malloc_flags(sk_64_asS32(size), 0); |
| 139 if (NULL == fStorage) { | 137 if (NULL == fStorage) { |
| 140 return false; | 138 return false; |
| 141 } | 139 } |
| 142 | 140 |
| 143 fCurrScanline = NULL; // signal empty collection | 141 fCurrScanline = NULL; // signal empty collection |
| 144 fPrevScanline = NULL; // signal first scanline | 142 fPrevScanline = NULL; // signal first scanline |
| 145 return true; | 143 return true; |
| 146 } | 144 } |
| 147 | 145 |
| 148 void SkRgnBuilder::blitH(int x, int y, int width) { | 146 void SkRgnBuilder::blitH(int x, int y, int width) { |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 #endif | 506 #endif |
| 509 | 507 |
| 510 path->incReserve(count << 1); | 508 path->incReserve(count << 1); |
| 511 do { | 509 do { |
| 512 SkASSERT(count > 1); | 510 SkASSERT(count > 1); |
| 513 count -= extract_path(start, stop, path); | 511 count -= extract_path(start, stop, path); |
| 514 } while (count > 0); | 512 } while (count > 0); |
| 515 | 513 |
| 516 return true; | 514 return true; |
| 517 } | 515 } |
| OLD | NEW |