FakeStreams.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright 2016 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/core/SkData.h"
  8. #include "include/core/SkStream.h"
  9. #ifndef FakeStreams_DEFINED
  10. #define FakeStreams_DEFINED
  11. // Stream that is not an asset stream (!hasPosition() or !hasLength())
  12. class NotAssetMemStream : public SkStream {
  13. public:
  14. NotAssetMemStream(sk_sp<SkData> data) : fStream(std::move(data)) {}
  15. bool hasPosition() const override {
  16. return false;
  17. }
  18. bool hasLength() const override {
  19. return false;
  20. }
  21. size_t peek(void* buf, size_t bytes) const override {
  22. return fStream.peek(buf, bytes);
  23. }
  24. size_t read(void* buf, size_t bytes) override {
  25. return fStream.read(buf, bytes);
  26. }
  27. bool rewind() override {
  28. return fStream.rewind();
  29. }
  30. bool isAtEnd() const override {
  31. return fStream.isAtEnd();
  32. }
  33. private:
  34. SkMemoryStream fStream;
  35. };
  36. /*
  37. * Represents a stream without all of its data.
  38. */
  39. class HaltingStream : public SkStream {
  40. public:
  41. HaltingStream(sk_sp<SkData> data, size_t initialLimit)
  42. : fTotalSize(data->size())
  43. , fLimit(initialLimit)
  44. , fStream(std::move(data))
  45. {}
  46. void addNewData(size_t extra) {
  47. fLimit = SkTMin(fTotalSize, fLimit + extra);
  48. }
  49. size_t read(void* buffer, size_t size) override {
  50. if (fStream.getPosition() + size > fLimit) {
  51. size = fLimit - fStream.getPosition();
  52. }
  53. return fStream.read(buffer, size);
  54. }
  55. bool isAtEnd() const override {
  56. return fStream.isAtEnd();
  57. }
  58. bool hasLength() const override { return true; }
  59. size_t getLength() const override { return fLimit; }
  60. bool hasPosition() const override { return true; }
  61. size_t getPosition() const override { return fStream.getPosition(); }
  62. bool rewind() override { return fStream.rewind(); }
  63. bool move(long offset) override { return fStream.move(offset); }
  64. bool seek(size_t position) override { return fStream.seek(position); }
  65. bool isAllDataReceived() const { return fLimit == fTotalSize; }
  66. private:
  67. const size_t fTotalSize;
  68. size_t fLimit;
  69. SkMemoryStream fStream;
  70. };
  71. #endif // FakeStreams_DEFINED