| 124 | } |
| 125 | |
| 126 | static void ReadPathInternal(DecodeStream* stream, PathData* value, const uint8_t records[], |
| 127 | int64_t numVerbs) { |
| 128 | auto numBits = stream->readNumBits(); |
| 129 | float lastX = 0; |
| 130 | float lastY = 0; |
| 131 | auto& verbs = value->verbs; |
| 132 | auto& points = value->points; |
| 133 | for (uint32_t i = 0; i < numVerbs; i++) { |
| 134 | if (stream->context->hasException()) { |
| 135 | break; |
| 136 | } |
| 137 | auto pathRecord = records[i]; |
| 138 | switch (static_cast<PathRecord>(pathRecord)) { |
| 139 | case PathRecord::Close: |
| 140 | verbs.push_back(PathDataVerb::Close); |
| 141 | break; |
| 142 | case PathRecord::Move: |
| 143 | verbs.push_back(PathDataVerb::MoveTo); |
| 144 | lastX = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 145 | lastY = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 146 | points.push_back({lastX, lastY}); |
| 147 | break; |
| 148 | case PathRecord::Line: |
| 149 | verbs.push_back(PathDataVerb::LineTo); |
| 150 | lastX = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 151 | lastY = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 152 | points.push_back({lastX, lastY}); |
| 153 | break; |
| 154 | case PathRecord::HLine: |
| 155 | verbs.push_back(PathDataVerb::LineTo); |
| 156 | lastX = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 157 | points.push_back({lastX, lastY}); |
| 158 | break; |
| 159 | case PathRecord::VLine: |
| 160 | verbs.push_back(PathDataVerb::LineTo); |
| 161 | lastY = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 162 | points.push_back({lastX, lastY}); |
| 163 | break; |
| 164 | case PathRecord::Curve01: |
| 165 | verbs.push_back(PathDataVerb::CurveTo); |
| 166 | points.push_back({lastX, lastY}); |
| 167 | lastX = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 168 | lastY = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 169 | points.push_back({lastX, lastY}); |
| 170 | lastX = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 171 | lastY = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 172 | points.push_back({lastX, lastY}); |
| 173 | break; |
| 174 | case PathRecord::Curve10: |
| 175 | verbs.push_back(PathDataVerb::CurveTo); |
| 176 | lastX = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 177 | lastY = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 178 | points.push_back({lastX, lastY}); |
| 179 | lastX = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 180 | lastY = stream->readBits(numBits) * SPATIAL_PRECISION; |
| 181 | points.push_back({lastX, lastY}); |
| 182 | points.push_back({lastX, lastY}); |
| 183 | break; |
no test coverage detected