| 542 | } |
| 543 | |
| 544 | bool imageResizeRgba32fLinear(ImageContainer* _dst, const ImageContainer* _src) |
| 545 | { |
| 546 | const uint16_t numSides = _src->m_numLayers * (_src->m_cubeMap ? 6 : 1); |
| 547 | |
| 548 | for (uint16_t side = 0; side < numSides; ++side) |
| 549 | { |
| 550 | bimg::ImageMip srcMip; |
| 551 | bimg::imageGetRawData(*_src, side, 0, _src->m_data, _src->m_size, srcMip); |
| 552 | |
| 553 | bimg::ImageMip dstMip; |
| 554 | bimg::imageGetRawData(*_dst, side, 0, _dst->m_data, _dst->m_size, dstMip); |
| 555 | uint8_t* dstData = const_cast<uint8_t*>(dstMip.m_data); |
| 556 | |
| 557 | const uint32_t srcPitch = _src->m_width*16; |
| 558 | const uint32_t srcSlice = _src->m_height*srcPitch; |
| 559 | const uint32_t dstPitch = _dst->m_width*16; |
| 560 | const uint32_t dstSlice = _dst->m_height*dstPitch; |
| 561 | |
| 562 | for (uint32_t zz = 0, depth = _dst->m_depth; zz < depth; ++zz, dstData += dstSlice) |
| 563 | { |
| 564 | const uint32_t srcDataStep = uint32_t(bx::floor(zz * _src->m_depth / float(_dst->m_depth) ) ); |
| 565 | const uint8_t* srcData = &srcMip.m_data[srcDataStep*srcSlice]; |
| 566 | |
| 567 | int result = stbir_resize_float_generic( |
| 568 | (const float*)srcData, _src->m_width, _src->m_height, srcPitch |
| 569 | , ( float*)dstData, _dst->m_width, _dst->m_height, dstPitch |
| 570 | , 4, 3 |
| 571 | , STBIR_FLAG_ALPHA_PREMULTIPLIED |
| 572 | , STBIR_EDGE_CLAMP |
| 573 | , STBIR_FILTER_BOX |
| 574 | , STBIR_COLORSPACE_LINEAR |
| 575 | , NULL |
| 576 | ); |
| 577 | |
| 578 | if (1 != result) |
| 579 | { |
| 580 | return false; |
| 581 | } |
| 582 | } |
| 583 | |
| 584 | } |
| 585 | |
| 586 | return true; |
| 587 | } |
| 588 | |
| 589 | static float getAlpha(UnpackFn _unpack, const void* _data) |
| 590 | { |
no test coverage detected