OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBuffer.h" | 8 #include "SkBuffer.h" |
9 #include "SkOnce.h" | 9 #include "SkOnce.h" |
10 #include "SkPath.h" | 10 #include "SkPath.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 | 105 |
106 SkPathRef* SkPathRef::CreateFromBuffer(SkRBuffer* buffer | 106 SkPathRef* SkPathRef::CreateFromBuffer(SkRBuffer* buffer |
107 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O | 107 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O |
108 , bool newFormat, int32_t oldPacked | 108 , bool newFormat, int32_t oldPacked |
109 #endif | 109 #endif |
110 ) { | 110 ) { |
111 SkPathRef* ref = SkNEW(SkPathRef); | 111 SkPathRef* ref = SkNEW(SkPathRef); |
112 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O | 112 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O |
113 if (newFormat) { | 113 if (newFormat) { |
114 #endif | 114 #endif |
115 int32_t packed = buffer->readU32(); | 115 int32_t packed; |
| 116 if (!buffer->readS32(&packed)) { |
| 117 SkDELETE(ref); |
| 118 return NULL; |
| 119 } |
116 | 120 |
117 ref->fIsFinite = (packed >> kIsFinite_SerializationShift) & 1; | 121 ref->fIsFinite = (packed >> kIsFinite_SerializationShift) & 1; |
118 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O | 122 #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TO
O |
119 } else { | 123 } else { |
120 ref->fIsFinite = (oldPacked >> SkPath::kOldIsFinite_SerializationShift)
& 1; | 124 ref->fIsFinite = (oldPacked >> SkPath::kOldIsFinite_SerializationShift)
& 1; |
121 } | 125 } |
122 #endif | 126 #endif |
123 | 127 |
124 ref->fGenerationID = buffer->readU32(); | 128 int32_t verbCount, pointCount, conicCount; |
125 int32_t verbCount = buffer->readS32(); | 129 if (!buffer->readU32(&(ref->fGenerationID)) || |
126 int32_t pointCount = buffer->readS32(); | 130 !buffer->readS32(&verbCount) || |
127 int32_t conicCount = buffer->readS32(); | 131 !buffer->readS32(&pointCount) || |
| 132 !buffer->readS32(&conicCount)) { |
| 133 SkDELETE(ref); |
| 134 return NULL; |
| 135 } |
| 136 |
128 ref->resetToSize(verbCount, pointCount, conicCount); | 137 ref->resetToSize(verbCount, pointCount, conicCount); |
129 | |
130 SkASSERT(verbCount == ref->countVerbs()); | 138 SkASSERT(verbCount == ref->countVerbs()); |
131 SkASSERT(pointCount == ref->countPoints()); | 139 SkASSERT(pointCount == ref->countPoints()); |
132 SkASSERT(conicCount == ref->fConicWeights.count()); | 140 SkASSERT(conicCount == ref->fConicWeights.count()); |
133 buffer->read(ref->verbsMemWritable(), verbCount * sizeof(uint8_t)); | 141 |
134 buffer->read(ref->fPoints, pointCount * sizeof(SkPoint)); | 142 if (!buffer->read(ref->verbsMemWritable(), verbCount * sizeof(uint8_t)) || |
135 buffer->read(ref->fConicWeights.begin(), conicCount * sizeof(SkScalar)); | 143 !buffer->read(ref->fPoints, pointCount * sizeof(SkPoint)) || |
136 buffer->read(&ref->fBounds, sizeof(SkRect)); | 144 !buffer->read(ref->fConicWeights.begin(), conicCount * sizeof(SkScalar))
|| |
| 145 !buffer->read(&ref->fBounds, sizeof(SkRect))) { |
| 146 SkDELETE(ref); |
| 147 return NULL; |
| 148 } |
137 ref->fBoundsIsDirty = false; | 149 ref->fBoundsIsDirty = false; |
138 return ref; | 150 return ref; |
139 } | 151 } |
140 | 152 |
141 void SkPathRef::Rewind(SkAutoTUnref<SkPathRef>* pathRef) { | 153 void SkPathRef::Rewind(SkAutoTUnref<SkPathRef>* pathRef) { |
142 if ((*pathRef)->unique()) { | 154 if ((*pathRef)->unique()) { |
143 SkDEBUGCODE((*pathRef)->validate();) | 155 SkDEBUGCODE((*pathRef)->validate();) |
144 (*pathRef)->fBoundsIsDirty = true; // this also invalidates fIsFinite | 156 (*pathRef)->fBoundsIsDirty = true; // this also invalidates fIsFinite |
145 (*pathRef)->fVerbCnt = 0; | 157 (*pathRef)->fVerbCnt = 0; |
146 (*pathRef)->fPointCnt = 0; | 158 (*pathRef)->fPointCnt = 0; |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 fPoints[i].fY - fBounds.fBottom < SK_ScalarNearlyZero); | 342 fPoints[i].fY - fBounds.fBottom < SK_ScalarNearlyZero); |
331 if (!fPoints[i].isFinite()) { | 343 if (!fPoints[i].isFinite()) { |
332 isFinite = false; | 344 isFinite = false; |
333 } | 345 } |
334 } | 346 } |
335 SkASSERT(SkToBool(fIsFinite) == isFinite); | 347 SkASSERT(SkToBool(fIsFinite) == isFinite); |
336 } | 348 } |
337 #endif | 349 #endif |
338 } | 350 } |
339 #endif | 351 #endif |
OLD | NEW |