aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkStream.cpp
diff options
context:
space:
mode:
authorGravatar Ben Wagner <bungeman@google.com>2017-03-10 13:08:15 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-10 19:58:46 +0000
commit4d1955c43aaab045511b74a495dfbea4ef0057c5 (patch)
tree23d0f457f69b98bde35dc9a3afa32451ee5f6694 /src/core/SkStream.cpp
parentdc9f0dbe4cdcdf6fead5fc28532d58f7d998a447 (diff)
Fix SkFILEStream.
Change-Id: I8c66e4e3e857227aed3d0bc497982f4c0d96d917 Reviewed-on: https://skia-review.googlesource.com/9498 Commit-Queue: Ben Wagner <bungeman@google.com> Reviewed-by: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'src/core/SkStream.cpp')
-rw-r--r--src/core/SkStream.cpp116
1 files changed, 53 insertions, 63 deletions
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index db9caee541..1435dab235 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -155,105 +155,95 @@ bool SkWStream::writeStream(SkStream* stream, size_t length) {
///////////////////////////////////////////////////////////////////////////////
-SkFILEStream::SkFILEStream(const char file[]) : fName(file), fOwnership(kCallerPasses_Ownership) {
- fFILE = file ? sk_fopen(fName.c_str(), kRead_SkFILE_Flag) : nullptr;
-}
+SkFILEStream::SkFILEStream(std::shared_ptr<FILE> file, size_t size,
+ size_t offset, size_t originalOffset)
+ : fFILE(std::move(file))
+ , fSize(size)
+ , fOffset(SkTMin(offset, fSize))
+ , fOriginalOffset(SkTMin(originalOffset, fSize))
+{ }
+
+SkFILEStream::SkFILEStream(std::shared_ptr<FILE> file, size_t size, size_t offset)
+ : SkFILEStream(std::move(file), size, offset, offset)
+{ }
+
+SkFILEStream::SkFILEStream(FILE* file)
+ : SkFILEStream(std::shared_ptr<FILE>(file, sk_fclose),
+ file ? sk_fgetsize(file) : 0,
+ file ? sk_ftell(file) : 0)
+{ }
-SkFILEStream::SkFILEStream(FILE* file, Ownership ownership)
- : fFILE(file)
- , fOwnership(ownership) {
-}
+
+SkFILEStream::SkFILEStream(const char path[])
+ : SkFILEStream(path ? sk_fopen(path, kRead_SkFILE_Flag) : nullptr)
+{ }
SkFILEStream::~SkFILEStream() {
- if (fFILE && fOwnership != kCallerRetains_Ownership) {
- sk_fclose(fFILE);
- }
+ this->close();
}
-void SkFILEStream::setPath(const char path[]) {
- fName.set(path);
- if (fFILE) {
- sk_fclose(fFILE);
- fFILE = nullptr;
- }
- if (path) {
- fFILE = sk_fopen(fName.c_str(), kRead_SkFILE_Flag);
- }
+void SkFILEStream::close() {
+ fFILE.reset();
+ fSize = 0;
+ fOffset = 0;
}
size_t SkFILEStream::read(void* buffer, size_t size) {
- if (fFILE) {
- return sk_fread(buffer, size, fFILE);
+ if (size > fSize - fOffset) {
+ size = fSize - fOffset;
}
- return 0;
+ size_t bytesRead = size;
+ if (buffer) {
+ bytesRead = sk_qread(fFILE.get(), buffer, size, fOffset);
+ }
+ if (bytesRead == SIZE_MAX) {
+ return 0;
+ }
+ fOffset += bytesRead;
+ return bytesRead;
}
bool SkFILEStream::isAtEnd() const {
- return sk_feof(fFILE);
+ if (fOffset == fSize) {
+ return true;
+ }
+ return fOffset >= sk_fgetsize(fFILE.get());
}
bool SkFILEStream::rewind() {
- if (fFILE) {
- if (sk_frewind(fFILE)) {
- return true;
- }
- // we hit an error
- sk_fclose(fFILE);
- fFILE = nullptr;
- }
- return false;
+ // TODO: fOriginalOffset instead of 0.
+ fOffset = 0;
+ return true;
}
SkStreamAsset* SkFILEStream::duplicate() const {
- if (nullptr == fFILE) {
- return new SkMemoryStream();
- }
-
- if (fData.get()) {
- return new SkMemoryStream(fData);
- }
-
- if (!fName.isEmpty()) {
- std::unique_ptr<SkFILEStream> that(new SkFILEStream(fName.c_str()));
- if (sk_fidentical(that->fFILE, this->fFILE)) {
- return that.release();
- }
- }
-
- fData = SkData::MakeFromFILE(fFILE);
- if (nullptr == fData) {
- return nullptr;
- }
- return new SkMemoryStream(fData);
+ // TODO: fOriginalOffset instead of 0.
+ return new SkFILEStream(fFILE, fSize, 0, fOriginalOffset);
}
size_t SkFILEStream::getPosition() const {
- return sk_ftell(fFILE);
+ return fOffset;
}
bool SkFILEStream::seek(size_t position) {
- return sk_fseek(fFILE, position);
+ fOffset = position > fSize ? fSize : position;
+ return true;
}
bool SkFILEStream::move(long offset) {
- return sk_fmove(fFILE, offset);
+ return this->seek(fOffset + offset);
}
SkStreamAsset* SkFILEStream::fork() const {
- std::unique_ptr<SkStreamAsset> that(this->duplicate());
- that->seek(this->getPosition());
- return that.release();
+ return new SkFILEStream(fFILE, fSize, fOffset, fOriginalOffset);
}
size_t SkFILEStream::getLength() const {
- return sk_fgetsize(fFILE);
+ return fSize;
}
const void* SkFILEStream::getMemoryBase() {
- if (nullptr == fData.get()) {
- return nullptr;
- }
- return fData->data();
+ return nullptr;
}
///////////////////////////////////////////////////////////////////////////////