diff options
author | yujieqin <yujieqin@google.com> | 2016-02-29 07:14:42 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-29 07:14:42 -0800 |
commit | f236ee4e44662e519db4b4997eee5d2bc8543f9c (patch) | |
tree | eabb285ab13b2b22e3beddea95dee94b1dd8476c /src | |
parent | e93c17b35af5ebc16af8bb09fd5a83d61a25d879 (diff) |
Enable RAW codec for Windows
* Fix the exception catching
* Set preprocessor differently for MSVC
BUG=skia:4889(b/26958348)
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1738913002
Committed: https://skia.googlesource.com/skia/+/474e4c3dd28b67f590851321f15d9983ef7fd031
Review URL: https://codereview.chromium.org/1738913002
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkRawCodec.cpp | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/src/codec/SkRawCodec.cpp b/src/codec/SkRawCodec.cpp index a006e50837..9d0fb1cb25 100644 --- a/src/codec/SkRawCodec.cpp +++ b/src/codec/SkRawCodec.cpp @@ -10,17 +10,20 @@ #include "SkColorPriv.h" #include "SkData.h" #include "SkJpegCodec.h" +#include "SkMutex.h" #include "SkRawCodec.h" #include "SkRefCnt.h" #include "SkStream.h" #include "SkStreamPriv.h" #include "SkSwizzler.h" +#include "SkTArray.h" #include "SkTaskGroup.h" #include "SkTemplates.h" #include "SkTypes.h" #include "dng_area_task.h" #include "dng_color_space.h" +#include "dng_errors.h" #include "dng_exceptions.h" #include "dng_host.h" #include "dng_info.h" @@ -105,15 +108,30 @@ public: const std::vector<dng_rect> taskAreas = compute_task_areas(maxTasks, area, tileSize); const int numTasks = static_cast<int>(taskAreas.size()); + SkMutex mutex; + SkTArray<dng_exception> exceptions; task.Start(numTasks, tileSize, &Allocator(), Sniffer()); for (int taskIndex = 0; taskIndex < numTasks; ++taskIndex) { - taskGroup.add([&task, this, taskIndex, taskAreas, tileSize] { - task.ProcessOnThread(taskIndex, taskAreas[taskIndex], tileSize, this->Sniffer()); + taskGroup.add([&mutex, &exceptions, &task, this, taskIndex, taskAreas, tileSize] { + try { + task.ProcessOnThread(taskIndex, taskAreas[taskIndex], tileSize, this->Sniffer()); + } catch (dng_exception& exception) { + SkAutoMutexAcquire lock(mutex); + exceptions.push_back(exception); + } catch (...) { + SkAutoMutexAcquire lock(mutex); + exceptions.push_back(dng_exception(dng_error_unknown)); + } }); } taskGroup.wait(); task.Finish(numTasks); + + // Currently we only re-throw the first catched exception. + if (!exceptions.empty()) { + Throw_dng_error(exceptions.front().ErrorCode(), nullptr, nullptr); + } } uint32 PerformAreaTaskThreads() override { @@ -428,15 +446,15 @@ public: } } - // render() takes ownership of fHost, fInfo, fNegative and fDngStream when available. - SkAutoTDelete<dng_host> host(fHost.release()); - SkAutoTDelete<dng_info> info(fInfo.release()); - SkAutoTDelete<dng_negative> negative(fNegative.release()); - SkAutoTDelete<dng_stream> dngStream(fDngStream.release()); - // DNG SDK preserves the aspect ratio, so it only needs to know the longer dimension. const int preferredSize = SkTMax(width, height); try { + // render() takes ownership of fHost, fInfo, fNegative and fDngStream when available. + SkAutoTDelete<dng_host> host(fHost.release()); + SkAutoTDelete<dng_info> info(fInfo.release()); + SkAutoTDelete<dng_negative> negative(fNegative.release()); + SkAutoTDelete<dng_stream> dngStream(fDngStream.release()); + host->SetPreferredSize(preferredSize); host->ValidateSizes(); @@ -506,11 +524,12 @@ private: } bool readDng() { - // Due to the limit of DNG SDK, we need to reset host and info. - fHost.reset(new SkDngHost(&fAllocator)); - fInfo.reset(new dng_info); - fDngStream.reset(new SkDngStream(fStream)); try { + // Due to the limit of DNG SDK, we need to reset host and info. + fHost.reset(new SkDngHost(&fAllocator)); + fInfo.reset(new dng_info); + fDngStream.reset(new SkDngStream(fStream)); + fHost->ValidateSizes(); fInfo->Parse(*fHost, *fDngStream); fInfo->PostParse(*fHost); |