/* * Tries to handle the image with PIEX. If PIEX returns kOk and finds the preview image, create a * SkJpegCodec. If PIEX returns kFail, then the file is invalid, return nullptr. In other cases, * fallback to create SkRawCodec for DNG images. */ SkCodec* SkRawCodec::NewFromStream(SkStream* stream) { SkAutoTDelete<SkRawStream> rawStream; if (is_asset_stream(*stream)) { rawStream.reset(new SkRawAssetStream(stream)); } else { rawStream.reset(new SkRawBufferedStream(stream)); } // Does not take the ownership of rawStream. SkPiexStream piexStream(rawStream.get()); ::piex::PreviewImageData imageData; if (::piex::IsRaw(&piexStream)) { ::piex::Error error = ::piex::GetPreviewImageData(&piexStream, &imageData); if (error == ::piex::Error::kOk && imageData.preview.length > 0) { // transferBuffer() is destructive to the rawStream. Abandon the rawStream after this // function call. // FIXME: one may avoid the copy of memoryStream and use the buffered rawStream. SkMemoryStream* memoryStream = rawStream->transferBuffer(imageData.preview.offset, imageData.preview.length); return memoryStream ? SkJpegCodec::NewFromStream(memoryStream) : nullptr; } else if (error == ::piex::Error::kFail) { return nullptr; } } // Takes the ownership of the rawStream. SkAutoTDelete<SkDngImage> dngImage(SkDngImage::NewFromStream(rawStream.release())); if (!dngImage) { return nullptr; } return new SkRawCodec(dngImage.release()); }
/* * Tries to handle the image with PIEX. If PIEX returns kOk and finds the preview image, create a * SkJpegCodec. If PIEX returns kFail, then the file is invalid, return nullptr. In other cases, * fallback to create SkRawCodec for DNG images. */ SkCodec* SkRawCodec::NewFromStream(SkStream* stream) { SkAutoTDelete<SkRawStream> rawStream(new SkRawStream(stream)); ::piex::PreviewImageData imageData; if (::piex::IsRaw(rawStream.get())) { ::piex::Error error = ::piex::GetPreviewImageData(rawStream.get(), &imageData); if (error == ::piex::Error::kOk && imageData.preview_length > 0) { #if !defined(GOOGLE3) // transferBuffer() is destructive to the rawStream. Abandon the rawStream after this // function call. // FIXME: one may avoid the copy of memoryStream and use the buffered rawStream. SkMemoryStream* memoryStream = rawStream->transferBuffer(imageData.preview_offset, imageData.preview_length); return memoryStream ? SkJpegCodec::NewFromStream(memoryStream) : nullptr; #else return nullptr; #endif } else if (error == ::piex::Error::kFail) { return nullptr; } } SkAutoTDelete<SkDngImage> dngImage(SkDngImage::NewFromStream(rawStream.release())); if (!dngImage) { return nullptr; } return new SkRawCodec(dngImage.release()); }
static SkDngImage* NewFromStream(SkRawStream* stream) { SkAutoTDelete<SkDngImage> dngImage(new SkDngImage(stream)); if (!dngImage->readDng()) { return nullptr; } SkASSERT(dngImage->fNegative); return dngImage.release(); }
/* * 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 color filter array (CFA) pattern * which is essential for the demosaicing of the sensor image. * Note: this will take the ownership of the stream. */ static SkDngImage* NewFromStream(SkRawStream* stream) { SkAutoTDelete<SkDngImage> dngImage(new SkDngImage(stream)); if (!dngImage->initFromPiex()) { if (!dngImage->readDng()) { return nullptr; } } return dngImage.release(); }
/* * Tries to handle the image with PIEX. If PIEX returns kOk and finds the preview image, create a * SkJpegCodec. If PIEX returns kFail, then the file is invalid, return nullptr. In other cases, * fallback to create SkRawCodec for DNG images. */ SkCodec* SkRawCodec::NewFromStream(SkStream* stream) { std::unique_ptr<SkRawStream> rawStream; if (is_asset_stream(*stream)) { rawStream.reset(new SkRawAssetStream(stream)); } else { rawStream.reset(new SkRawBufferedStream(stream)); } // Does not take the ownership of rawStream. SkPiexStream piexStream(rawStream.get()); ::piex::PreviewImageData imageData; if (::piex::IsRaw(&piexStream)) { ::piex::Error error = ::piex::GetPreviewImageData(&piexStream, &imageData); if (error == ::piex::Error::kFail) { return nullptr; } sk_sp<SkColorSpace> colorSpace; switch (imageData.color_space) { case ::piex::PreviewImageData::kSrgb: colorSpace = SkColorSpace::MakeSRGB(); break; case ::piex::PreviewImageData::kAdobeRgb: colorSpace = SkColorSpace_Base::MakeNamed(SkColorSpace_Base::kAdobeRGB_Named); break; } // Theoretically PIEX can return JPEG compressed image or uncompressed RGB image. We only // handle the JPEG compressed preview image here. if (error == ::piex::Error::kOk && imageData.preview.length > 0 && imageData.preview.format == ::piex::Image::kJpegCompressed) { // transferBuffer() is destructive to the rawStream. Abandon the rawStream after this // function call. // FIXME: one may avoid the copy of memoryStream and use the buffered rawStream. SkMemoryStream* memoryStream = rawStream->transferBuffer(imageData.preview.offset, imageData.preview.length); return memoryStream ? SkJpegCodec::NewFromStream(memoryStream, std::move(colorSpace)) : nullptr; } } // Takes the ownership of the rawStream. std::unique_ptr<SkDngImage> dngImage(SkDngImage::NewFromStream(rawStream.release())); if (!dngImage) { return nullptr; } return new SkRawCodec(dngImage.release()); }
/* * 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 color filter array (CFA) pattern * which is essential for the demosaicing of the sensor image. * Note: this will take the ownership of the stream. */ static SkDngImage* NewFromStream(SkRawStream* stream) { std::unique_ptr<SkDngImage> dngImage(new SkDngImage(stream)); if (!dngImage->isTiffHeaderValid()) { return nullptr; } if (!dngImage->initFromPiex()) { if (!dngImage->readDng()) { return nullptr; } } return dngImage.release(); }