File: segment_reader.h

package info (click to toggle)
chromium 139.0.7258.138-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,120,676 kB
  • sloc: cpp: 35,100,869; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (73 lines) | stat: -rw-r--r-- 2,825 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_SEGMENT_READER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_SEGMENT_READER_H_

#include <stdint.h>

#include "base/containers/span.h"
#include "base/memory/scoped_refptr.h"
#include "third_party/blink/renderer/platform/image-decoders/rw_buffer.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/wtf/shared_buffer.h"
#include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"

class SkData;
template <typename T>
class sk_sp;

namespace blink {

// Interface that looks like SharedBuffer. Used by ImageDecoders to use various
// sources of input including:
// - SharedBuffer
//   - for when the caller already has a SharedBuffer
// - SkData
//   - for when the caller already has an SkData
// - ROBuffer
//   - for when the caller wants to read/write in different threads
//
// Unlike SharedBuffer, this is a read-only interface. There is no way to
// modify the underlying data source.
class PLATFORM_EXPORT SegmentReader
    : public ThreadSafeRefCounted<SegmentReader> {
 public:
  // This version is thread-safe so long as no thread is modifying the
  // underlying SharedBuffer. This class does not modify it, so that would
  // mean modifying it in another way.
  static scoped_refptr<SegmentReader> CreateFromSharedBuffer(
      scoped_refptr<const SharedBuffer>);

  // These versions use thread-safe input, so they are always thread-safe.
  static scoped_refptr<SegmentReader> CreateFromSkData(sk_sp<SkData>);
  static scoped_refptr<SegmentReader> CreateFromROBuffer(
      scoped_refptr<ROBuffer>);

  SegmentReader() = default;
  SegmentReader(const SegmentReader&) = delete;
  SegmentReader& operator=(const SegmentReader&) = delete;
  virtual size_t size() const = 0;
  // Returns a span of however much data is left in the segment containing the
  // `position`. If there's no data at the specified `position`, an empty span
  // is returned.
  virtual base::span<const uint8_t> GetSomeData(size_t position) const = 0;
  virtual sk_sp<SkData> GetAsSkData() const = 0;
  virtual void LockData() {}
  virtual void UnlockData() {}

  static sk_sp<SkData> RWBufferCopyAsSkData(RWBuffer::ROIter iter,
                                            size_t available);
  static base::span<const uint8_t> RWBufferGetSomeData(
      RWBuffer::ROIter& iter,
      size_t& position_of_block,
      size_t position);

 protected:
  friend class ThreadSafeRefCounted<SegmentReader>;
  virtual ~SegmentReader() = default;
};

}  // namespace blink
#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_SEGMENT_READER_H_