Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54bd6475 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[res] Enable zero-copy assets access" into main

parents 3a58b526 82a34378
Loading
Loading
Loading
Loading
+25 −9
Original line number Original line Diff line number Diff line
@@ -87,16 +87,26 @@ class BufferReader final : public zip_archive::Reader {
    }
    }


    bool ReadAtOffset(uint8_t* buf, size_t len, off64_t offset) const override {
    bool ReadAtOffset(uint8_t* buf, size_t len, off64_t offset) const override {
        if (mInputSize < len || offset > mInputSize - len) {
        auto in = AccessAtOffset(buf, len, offset);
        if (!in) {
          return false;
          return false;
        }
        }
        memcpy(buf, in, len);
        return true;
    }


    const uint8_t* AccessAtOffset(uint8_t*, size_t len, off64_t offset) const override {
      if (offset > mInputSize - len) {
        return nullptr;
      }
      const incfs::map_ptr<uint8_t> pos = mInput.offset(offset);
      const incfs::map_ptr<uint8_t> pos = mInput.offset(offset);
      if (!pos.verify(len)) {
      if (!pos.verify(len)) {
          return false;
        return nullptr;
      }
      return pos.unsafe_ptr();
    }
    }


        memcpy(buf, pos.unsafe_ptr(), len);
    bool IsZeroCopy() const override {
      return true;
      return true;
    }
    }


@@ -107,7 +117,7 @@ class BufferReader final : public zip_archive::Reader {


class BufferWriter final : public zip_archive::Writer {
class BufferWriter final : public zip_archive::Writer {
  public:
  public:
    BufferWriter(void* output, size_t outputSize) : Writer(),
    BufferWriter(void* output, size_t outputSize) :
        mOutput(reinterpret_cast<uint8_t*>(output)), mOutputSize(outputSize), mBytesWritten(0) {
        mOutput(reinterpret_cast<uint8_t*>(output)), mOutputSize(outputSize), mBytesWritten(0) {
    }
    }


@@ -121,6 +131,12 @@ class BufferWriter final : public zip_archive::Writer {
        return true;
        return true;
    }
    }


    Buffer GetBuffer(size_t length) override {
        const auto remaining_size = mOutputSize - mBytesWritten;
        return remaining_size >= length
                   ? Buffer(mOutput + mBytesWritten, remaining_size) : Buffer();
    }

  private:
  private:
    uint8_t* const mOutput;
    uint8_t* const mOutput;
    const size_t mOutputSize;
    const size_t mOutputSize;