aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkJpegCodec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec/SkJpegCodec.cpp')
-rw-r--r--src/codec/SkJpegCodec.cpp45
1 files changed, 43 insertions, 2 deletions
diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
index 4f48886be2..2cc7921277 100644
--- a/src/codec/SkJpegCodec.cpp
+++ b/src/codec/SkJpegCodec.cpp
@@ -5,11 +5,13 @@
* found in the LICENSE file.
*/
-#include "SkCodec.h"
#include "SkJpegCodec.h"
-#include "SkJpegDecoderMgr.h"
+
+#include "SkCodec.h"
#include "SkCodecPriv.h"
#include "SkColorData.h"
+#include "SkJpegDecoderMgr.h"
+#include "SkJpegInfo.h"
#include "SkStream.h"
#include "SkTemplates.h"
#include "SkTypes.h"
@@ -968,3 +970,42 @@ SkCodec::Result SkJpegCodec::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void
return kSuccess;
}
+
+// This function is declared in SkJpegInfo.h, used by SkPDF.
+bool SkGetJpegInfo(const void* data, size_t len,
+ SkISize* size,
+ SkEncodedInfo::Color* colorType,
+ SkEncodedOrigin* orientation) {
+ if (!SkJpegCodec::IsJpeg(data, len)) {
+ return false;
+ }
+
+ SkMemoryStream stream(data, len);
+ JpegDecoderMgr decoderMgr(&stream);
+ // libjpeg errors will be caught and reported here
+ skjpeg_error_mgr::AutoPushJmpBuf jmp(decoderMgr.errorMgr());
+ if (setjmp(jmp)) {
+ return false;
+ }
+ decoderMgr.init();
+ jpeg_decompress_struct* dinfo = decoderMgr.dinfo();
+ jpeg_save_markers(dinfo, kExifMarker, 0xFFFF);
+ jpeg_save_markers(dinfo, kICCMarker, 0xFFFF);
+ if (JPEG_HEADER_OK != jpeg_read_header(dinfo, true)) {
+ return false;
+ }
+ SkEncodedInfo::Color encodedColorType;
+ if (!decoderMgr.getEncodedColor(&encodedColorType)) {
+ return false; // Unable to interpret the color channels as colors.
+ }
+ if (colorType) {
+ *colorType = encodedColorType;
+ }
+ if (orientation) {
+ *orientation = get_exif_orientation(dinfo);
+ }
+ if (size) {
+ *size = {SkToS32(dinfo->image_width), SkToS32(dinfo->image_height)};
+ }
+ return true;
+}