diff options
Diffstat (limited to 'src/ports/SkOSFile_win.cpp')
-rw-r--r-- | src/ports/SkOSFile_win.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/ports/SkOSFile_win.cpp b/src/ports/SkOSFile_win.cpp index cf46cea985..ceafc7904f 100644 --- a/src/ports/SkOSFile_win.cpp +++ b/src/ports/SkOSFile_win.cpp @@ -124,6 +124,33 @@ void* sk_fmmap(FILE* f, size_t* length) { return sk_fdmmap(fileno, length); } +size_t sk_qread(FILE* file, void* buffer, size_t count, size_t offset) { + int fileno = sk_fileno(file); + HANDLE fileHandle = (HANDLE)_get_osfhandle(fileno); + if (INVALID_HANDLE_VALUE == file) { + return SIZE_MAX; + } + + OVERLAPPED overlapped = {0}; + ULARGE_INTEGER winOffset; + winOffset.QuadPart = offset; + overlapped.Offset = winOffset.LowPart; + overlapped.OffsetHigh = winOffset.HighPart; + + if (!SkTFitsIn<DWORD>(count)) { + count = std::numeric_limits<DWORD>::max(); + } + + DWORD bytesRead; + if (ReadFile(fileHandle, buffer, static_cast<DWORD>(count), &bytesRead, &overlapped)) { + return bytesRead; + } + if (GetLastError() == ERROR_HANDLE_EOF) { + return 0; + } + return SIZE_MAX; +} + //////////////////////////////////////////////////////////////////////////// struct SkOSFileIterData { |