MCPcopy Create free account
hub / github.com/NatronGitHub/Natron / to_float_packed

Function to_float_packed

Engine/Lut.cpp:1228–1287  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1226#endif // DEAD_CODE
1227
1228void
1229to_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 }

Callers

nothing calls this directly

Calls 2

clipFunction · 0.85
getOffsetsForPackingFunction · 0.85

Tested by

no test coverage detected