| 46 | bool is_open() const override { return mDecoder != nullptr; } |
| 47 | void close() override { if (mDecoder) mDecoder->end(); } |
| 48 | fl::size_t read(char* dst, fl::size_t bytesToRead) override { |
| 49 | if (!mDecoder || !mHasValidFrame) return 0; |
| 50 | fl::size totalRead = 0; |
| 51 | while (bytesToRead > 0 && mHasValidFrame) { |
| 52 | fl::size rem = mFrameSize - mCurrentPos; |
| 53 | if (rem == 0) { if (!decodeNextFrameIfNeeded()) break; rem = mFrameSize - mCurrentPos; } |
| 54 | fl::size toRead = fl::min(bytesToRead, rem); |
| 55 | if (toRead > 0 && mCurrentFrame && mCurrentFrame->rgb().data()) { |
| 56 | fl::memcpy(dst + totalRead, (fl::u8*)mCurrentFrame->rgb().data() + mCurrentPos, toRead); |
| 57 | mCurrentPos += toRead; totalRead += toRead; bytesToRead -= toRead; |
| 58 | } else break; |
| 59 | } |
| 60 | return totalRead; |
| 61 | } |
| 62 | using filebuf::read; |
| 63 | fl::size_t write(const char*, fl::size_t) override { return 0; } |
| 64 | fl::size_t tell() override { return 0; } |