xref: /aosp_15_r20/external/skia/experimental/rust_png/ffi/FFI.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2024 Google LLC.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkRustPngFFI_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkRustPngFFI_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include <stddef.h>
12*c8dee2aaSAndroid Build Coastguard Worker #include <stdint.h>
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker // TODO(https://crbug.com/356698922): Use a real `#include` if possible.
15*c8dee2aaSAndroid Build Coastguard Worker namespace rust {
16*c8dee2aaSAndroid Build Coastguard Worker inline namespace cxxbridge1 {
17*c8dee2aaSAndroid Build Coastguard Worker template <typename T> class Slice;
18*c8dee2aaSAndroid Build Coastguard Worker }  // namespace cxxbridge1
19*c8dee2aaSAndroid Build Coastguard Worker }  // namespace rust
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker namespace rust_png {
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker // Implementing the abstract C++ class below gives a rough equivalent of
24*c8dee2aaSAndroid Build Coastguard Worker // `dyn std::io::Read` from Rust.
25*c8dee2aaSAndroid Build Coastguard Worker class ReadTrait {
26*c8dee2aaSAndroid Build Coastguard Worker public:
27*c8dee2aaSAndroid Build Coastguard Worker     // The `virtual` method below is a rough equivalent of the
28*c8dee2aaSAndroid Build Coastguard Worker     // `std::io::Read::read` method in Rust. See
29*c8dee2aaSAndroid Build Coastguard Worker     // https://doc.rust-lang.org/nightly/std/io/trait.Read.html#tymethod.read
30*c8dee2aaSAndroid Build Coastguard Worker     // for guidance on the desired implementation and behavior of this method.
31*c8dee2aaSAndroid Build Coastguard Worker     //
32*c8dee2aaSAndroid Build Coastguard Worker     // Note that (unlike in Rust) this method is infallible.  This aspect of the
33*c8dee2aaSAndroid Build Coastguard Worker     // design is used tentatively and based on the following considerations:
34*c8dee2aaSAndroid Build Coastguard Worker     // * `SkStream::read` is also infallible
35*c8dee2aaSAndroid Build Coastguard Worker     // * `SkStream::read` communicates no-more-input by reporting that 0 bytes
36*c8dee2aaSAndroid Build Coastguard Worker     //   have been read (just like Rust's `Read` trait), and this condition
37*c8dee2aaSAndroid Build Coastguard Worker     //   corresponds to the only IO error covered by `SkCodec::Result`:
38*c8dee2aaSAndroid Build Coastguard Worker     //   `kIncompleteInput`.
39*c8dee2aaSAndroid Build Coastguard Worker     // * FFI based on the `cxx` crate doesn't currently support Rust's
40*c8dee2aaSAndroid Build Coastguard Worker     //   `std::result::Result`, `std::option::Option`, nor C++'s
41*c8dee2aaSAndroid Build Coastguard Worker     //   `std::optional` or `std::expected`.
42*c8dee2aaSAndroid Build Coastguard Worker     virtual size_t read(rust::Slice<uint8_t> buffer) = 0;
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     // `drop` is not part of the `std::io::Read` trait, but we expose the
45*c8dee2aaSAndroid Build Coastguard Worker     // destructor through public API to make it possible to pass
46*c8dee2aaSAndroid Build Coastguard Worker     // `std::unique_ptr<ReadTrait>` over the FFI boundary.
47*c8dee2aaSAndroid Build Coastguard Worker     virtual ~ReadTrait() = default;
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     // This type is non-copyable and non-movable.
50*c8dee2aaSAndroid Build Coastguard Worker     ReadTrait(const ReadTrait&) = delete;
51*c8dee2aaSAndroid Build Coastguard Worker     ReadTrait(ReadTrait&&) = delete;
52*c8dee2aaSAndroid Build Coastguard Worker     ReadTrait& operator=(const ReadTrait&) = delete;
53*c8dee2aaSAndroid Build Coastguard Worker     ReadTrait& operator=(ReadTrait&&) = delete;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker protected:
56*c8dee2aaSAndroid Build Coastguard Worker     ReadTrait() = default;
57*c8dee2aaSAndroid Build Coastguard Worker };
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker // Implementing the abstract C++ class below gives a rough equivalent of
60*c8dee2aaSAndroid Build Coastguard Worker // `dyn std::io::Write` from Rust.
61*c8dee2aaSAndroid Build Coastguard Worker class WriteTrait {
62*c8dee2aaSAndroid Build Coastguard Worker public:
63*c8dee2aaSAndroid Build Coastguard Worker     // The `virtual` method below is a rough equivalent of the
64*c8dee2aaSAndroid Build Coastguard Worker     // `std::io::Write::write` method in Rust. See
65*c8dee2aaSAndroid Build Coastguard Worker     // https://doc.rust-lang.org/nightly/std/io/trait.Write.html#tymethod.write
66*c8dee2aaSAndroid Build Coastguard Worker     // for guidance on the desired implementation and behavior of this method.
67*c8dee2aaSAndroid Build Coastguard Worker     //
68*c8dee2aaSAndroid Build Coastguard Worker     // Implementation should return `true` if the whole buffer has been
69*c8dee2aaSAndroid Build Coastguard Worker     // successfully written (and return `false` to indicate an error).
70*c8dee2aaSAndroid Build Coastguard Worker     // This mimics how `SkStreamW::write` communicates errors.
71*c8dee2aaSAndroid Build Coastguard Worker     virtual bool write(rust::Slice<const uint8_t> buffer) = 0;
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker     // The `virtual` method below is a rough equivalent of the
74*c8dee2aaSAndroid Build Coastguard Worker     // `std::io::Write::flush` method in Rust. See
75*c8dee2aaSAndroid Build Coastguard Worker     // https://doc.rust-lang.org/nightly/std/io/trait.Write.html#tymethod.flush
76*c8dee2aaSAndroid Build Coastguard Worker     // for guidance on the desired implementation and behavior of this method.
77*c8dee2aaSAndroid Build Coastguard Worker     //
78*c8dee2aaSAndroid Build Coastguard Worker     // Note that (unlike in Rust) this method is infallible.  This aspect of the
79*c8dee2aaSAndroid Build Coastguard Worker     // design mimics `SkStreamW::flush`.
80*c8dee2aaSAndroid Build Coastguard Worker     virtual void flush() = 0;
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     // `drop` is not part of the `std::io::Read` trait, but we expose the
83*c8dee2aaSAndroid Build Coastguard Worker     // destructor through public API to make it possible to pass
84*c8dee2aaSAndroid Build Coastguard Worker     // `std::unique_ptr<WriteTrait>` over the FFI boundary.
85*c8dee2aaSAndroid Build Coastguard Worker     virtual ~WriteTrait() = default;
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker     // This type is non-copyable and non-movable.
88*c8dee2aaSAndroid Build Coastguard Worker     WriteTrait(const WriteTrait&) = delete;
89*c8dee2aaSAndroid Build Coastguard Worker     WriteTrait(WriteTrait&&) = delete;
90*c8dee2aaSAndroid Build Coastguard Worker     WriteTrait& operator=(const WriteTrait&) = delete;
91*c8dee2aaSAndroid Build Coastguard Worker     WriteTrait& operator=(WriteTrait&&) = delete;
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker protected:
94*c8dee2aaSAndroid Build Coastguard Worker     WriteTrait() = default;
95*c8dee2aaSAndroid Build Coastguard Worker };
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker }  // namespace rust_png
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker #endif  // SkRustPngFFI_DEFINED
100