Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(934)

Unified Diff: src/codec/SkRawCodec.cpp

Issue 1659873002: Updates Piex and uses it to obtain the DNG dimensions. (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Fixes windows build Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « DEPS ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/codec/SkRawCodec.cpp
diff --git a/src/codec/SkRawCodec.cpp b/src/codec/SkRawCodec.cpp
index c7de3172863876cdbf1ec0e2d5a2d0111e6ddc3f..d4c756edaf7a0e425996a67254c4378a4bab01be 100644
--- a/src/codec/SkRawCodec.cpp
+++ b/src/codec/SkRawCodec.cpp
@@ -303,13 +303,18 @@ private:
class SkDngImage {
public:
+ /*
+ * Initializes the object with the information from Piex in a first attempt. This way it can
+ * save time and storage to obtain the DNG dimensions and CFA pattern.
scroggo 2016/02/03 15:56:02 Should there be a comment somewhere describing wha
ebrauer 2016/02/04 15:17:08 Done.
+ */
static SkDngImage* NewFromStream(SkRawStream* stream) {
SkAutoTDelete<SkDngImage> dngImage(new SkDngImage(stream));
- if (!dngImage->readDng()) {
- return nullptr;
+ if (!dngImage->initFromPiex()) {
+ if (!dngImage->readDng()) {
+ return nullptr;
+ }
}
- SkASSERT(dngImage->fNegative);
return dngImage.release();
}
@@ -381,6 +386,26 @@ public:
}
private:
+ void init(const int width, const int height, const int cfaPatternSize) {
+ fImageInfo = SkImageInfo::Make(width, height, kN32_SkColorType, kOpaque_SkAlphaType);
+
+ // The DNG SDK scales only for at demosaicing, so only when a mosaic info is available also
scroggo 2016/02/03 15:56:02 I don't follow this sentence. I think you mean som
ebrauer 2016/02/04 15:17:08 Done.
+ // scale is available.
+ fIsScalable = cfaPatternSize != 0;
+ fIsXtransImage = fIsScalable ? cfaPatternSize == 36 : false;
msarett 2016/02/03 16:21:49 This seems like a possible behavior change to me?
ebrauer 2016/02/04 15:17:08 The pattern size is either 0, 2x2 or 6x6, but theo
+ }
+
+ bool initFromPiex() {
+ ::piex::PreviewImageData imageData;
+ if (::piex::IsRaw(fStream.get())
scroggo 2016/02/03 15:56:02 These two methods have already been called by SkRa
ebrauer 2016/02/04 15:17:07 Yes, they are pretty cheap that is why we try to u
+ && ::piex::GetPreviewImageData(fStream.get(), &imageData) == ::piex::Error::kOk) {
scroggo 2016/02/03 15:56:02 nit: Easier to follow along if you put the brace o
ebrauer 2016/02/04 15:17:08 Done.
+ init(static_cast<int>(imageData.full_width), static_cast<int>(imageData.full_height),
scroggo 2016/02/03 15:56:02 this->init
ebrauer 2016/02/04 15:17:08 Done.
+ imageData.cfa_pattern_dim[0] * imageData.cfa_pattern_dim[1]);
scroggo 2016/02/03 15:56:02 nit: This should either be indented 8 spaces, or t
ebrauer 2016/02/04 15:17:08 Done.
+ return true;
+ }
+ return false;
+ }
+
bool readDng() {
// Due to the limit of DNG SDK, we need to reset host and info.
fHost.reset(new SkDngHost(&fAllocator));
@@ -399,21 +424,15 @@ private:
fNegative->PostParse(*fHost, *fDngStream, *fInfo);
fNegative->SynchronizeMetadata();
- fImageInfo = SkImageInfo::Make(
- static_cast<int>(fNegative->DefaultCropSizeH().As_real64()),
+ dng_point cfaPattern(0, 0);
scroggo 2016/02/03 15:56:02 Nit: it appears that a more accurate name for this
ebrauer 2016/02/04 15:17:08 Done.
+ if (fNegative->GetMosaicInfo() != nullptr) {
+ cfaPattern = fNegative->GetMosaicInfo()->fCFAPatternSize;
+ }
+ init(static_cast<int>(fNegative->DefaultCropSizeH().As_real64()),
scroggo 2016/02/03 15:56:02 this->init
ebrauer 2016/02/04 15:17:08 Done.
static_cast<int>(fNegative->DefaultCropSizeV().As_real64()),
- kN32_SkColorType, kOpaque_SkAlphaType);
-
- // The DNG SDK scales only for at demosaicing, so only when a mosaic info
- // is available also scale is available.
- fIsScalable = fNegative->GetMosaicInfo() != nullptr;
- fIsXtransImage = fIsScalable
- ? (fNegative->GetMosaicInfo()->fCFAPatternSize.v == 6
- && fNegative->GetMosaicInfo()->fCFAPatternSize.h == 6)
- : false;
+ cfaPattern.v * cfaPattern.h);
return true;
} catch (...) {
- fNegative.reset(nullptr);
scroggo 2016/02/03 15:56:02 Why is this no longer necessary?
ebrauer 2016/02/04 15:17:08 This is unrelated to the cl, but it is somehow mis
return false;
}
}
« no previous file with comments | « DEPS ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698