| 731 | } |
| 732 | |
| 733 | BufferRef loadStreamBuffer( IStreamRef is ) |
| 734 | { |
| 735 | // prevent crash if stream is not valid |
| 736 | if( ! is ) |
| 737 | throw StreamExc(); |
| 738 | |
| 739 | off_t fileSize = is->size(); |
| 740 | if( fileSize > std::numeric_limits<off_t>::max() ) |
| 741 | throw StreamExcOutOfMemory(); |
| 742 | |
| 743 | if( fileSize ) { // sometimes fileSize will be zero for a stream that doesn't know how big it is |
| 744 | auto result = std::make_shared<Buffer>( fileSize ); |
| 745 | is->readDataAvailable( result->getData(), static_cast<size_t>( fileSize ) ); |
| 746 | |
| 747 | return result; |
| 748 | } |
| 749 | else { |
| 750 | const size_t bufferSize = 4096; |
| 751 | size_t offset = 0; |
| 752 | auto result = std::make_shared<Buffer>( bufferSize ); |
| 753 | |
| 754 | while( ! is->isEof() ) { |
| 755 | if( offset + bufferSize > result->getAllocatedSize() ) |
| 756 | result->resize( std::max( (size_t)( result->getAllocatedSize() * 1.5f ), offset + bufferSize ) ); |
| 757 | |
| 758 | size_t bytesRead = is->readDataAvailable( reinterpret_cast<uint8_t*>( result->getData() ) + offset, bufferSize ); |
| 759 | offset += bytesRead; |
| 760 | result->setSize( offset ); |
| 761 | } |
| 762 | |
| 763 | return result; |
| 764 | } |
| 765 | } |
| 766 | |
| 767 | #if defined( CINDER_ANDROID ) |
| 768 | IStreamAndroidAssetRef loadAndroidAssetStream( const fs::path &path ) |
no test coverage detected