taisei/src/rwops/rwops_util.h
2024-05-17 04:58:47 +02:00

44 lines
1.6 KiB
C

/*
* This software is licensed under the terms of the MIT License.
* See COPYING for further information.
* ---
* Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
*/
#pragma once
#include "taisei.h"
#include <SDL.h>
typedef int (*rwutil_reopen_func)(SDL_RWops *rw);
/*
* Compute an absolute seek position from `offset` and `whence`, give a stream open at `pos` of
* total size `size`.
*
* If `size` is negative, it is assumed to be unknown.
*
* The returned value is clamped to be >=0, and <=size if size is known.
*
* If whence is RW_SEEK_END and the size is unknown, this function will return a negative value.
*/
int64_t rwutil_compute_seek_pos(int64_t offset, int whence, int64_t pos, int64_t size);
/*
* Emulate a seeking operation in a non-seekable stream.
* Forward seeks are implemented by reading and discarding data.
* Backward seeks are implemented by re-opening the stream and 'seeking' forward.
*
* `pos` must point to the current position within the stream. Read operations must update this
* position correctly.
* `reopen` must reset the stream position to 0.
*
* Returns the new value of *pos.
*/
int64_t rwutil_seek_emulated(SDL_RWops *rw, int64_t offset, int whence, int64_t *pos, rwutil_reopen_func reopen, size_t readbuf_size, void *readbuf) attr_nonnull_all attr_nodiscard;
/*
* Like rwutil_seek_emulated, but takes an absolute position instead of offset and whence.
*/
int64_t rwutil_seek_emulated_abs(SDL_RWops *rw, int64_t new_pos, int64_t *pos, rwutil_reopen_func reopen, size_t readbuf_size, void *readbuf) attr_nonnull_all attr_nodiscard;