| 1226 | #endif // DEAD_CODE |
| 1227 | |
| 1228 | void |
| 1229 | to_float_packed(float* to, |
| 1230 | const float* from, |
| 1231 | const RectI & conversionRect, |
| 1232 | const RectI & srcBounds, |
| 1233 | const RectI & dstBounds, |
| 1234 | PixelPackingEnum inputPacking, |
| 1235 | PixelPackingEnum outputPacking, |
| 1236 | bool invertY, |
| 1237 | bool premult) |
| 1238 | { |
| 1239 | if ( ( inputPacking == ePixelPackingPLANAR) || ( outputPacking == ePixelPackingPLANAR) ) { |
| 1240 | throw std::runtime_error("Invalid pixel format."); |
| 1241 | } |
| 1242 | |
| 1243 | ///clip the conversion rect to srcBounds and dstBounds |
| 1244 | RectI rect = conversionRect; |
| 1245 | if ( !clip(&rect, srcBounds) || !clip(&rect, dstBounds) ) { |
| 1246 | return; |
| 1247 | } |
| 1248 | |
| 1249 | |
| 1250 | bool inputHasAlpha = inputPacking == ePixelPackingBGRA || inputPacking == ePixelPackingRGBA; |
| 1251 | bool outputHasAlpha = outputPacking == ePixelPackingBGRA || outputPacking == ePixelPackingRGBA; |
| 1252 | int inROffset, inGOffset, inBOffset, inAOffset; |
| 1253 | int outROffset, outGOffset, outBOffset, outAOffset; |
| 1254 | getOffsetsForPacking(inputPacking, &inROffset, &inGOffset, &inBOffset, &inAOffset); |
| 1255 | getOffsetsForPacking(outputPacking, &outROffset, &outGOffset, &outBOffset, &outAOffset); |
| 1256 | |
| 1257 | |
| 1258 | int inPackingSize, outPackingSize; |
| 1259 | inPackingSize = inputHasAlpha ? 4 : 3; |
| 1260 | outPackingSize = outputHasAlpha ? 4 : 3; |
| 1261 | |
| 1262 | for (int y = rect.y1; y < rect.y2; ++y) { |
| 1263 | int srcY = y; |
| 1264 | if (invertY) { |
| 1265 | srcY = srcBounds.y2 - y - 1; |
| 1266 | } |
| 1267 | |
| 1268 | const float *src_pixels = from + (srcY * (srcBounds.x2 - srcBounds.x1) * inPackingSize); |
| 1269 | float *dst_pixels = to + (y * (dstBounds.x2 - dstBounds.x1) * outPackingSize); |
| 1270 | if ( ( inputPacking == outputPacking) && !premult ) { |
| 1271 | std::memcpy( dst_pixels, src_pixels, (rect.x2 - rect.x1) * sizeof(float) ); |
| 1272 | } else { |
| 1273 | for (int x = rect.x1; x < conversionRect.x2; ++x) { |
| 1274 | int inCol = x * inPackingSize; |
| 1275 | int outCol = x * outPackingSize; |
| 1276 | float a = (inputHasAlpha && premult) ? src_pixels[inCol + inAOffset] : 1.f; |
| 1277 | |
| 1278 | dst_pixels[outCol + outROffset] = src_pixels[inCol + inROffset] * a; |
| 1279 | dst_pixels[outCol + outGOffset] = src_pixels[inCol + inGOffset] * a; |
| 1280 | dst_pixels[outCol + outBOffset] = src_pixels[inCol + inBOffset] * a; |
| 1281 | if (outputHasAlpha) { |
| 1282 | dst_pixels[outCol + outAOffset] = a; |
| 1283 | } |
| 1284 | } |
| 1285 | } |
nothing calls this directly
no test coverage detected