blob: 70401c039117dfb20ec13d96ed82ed17bc5eba35 [file] [log] [blame]
msarette16b04a2015-04-15 07:32:19 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkJpegDecoderMgr.h"
msarettc1d03122016-03-25 08:58:55 -07009
10#include "SkJpegUtility.h"
msarette16b04a2015-04-15 07:32:19 -070011
12/*
13 * Print information, warning, and error messages
14 */
15static void print_message(const j_common_ptr info, const char caller[]) {
16 char buffer[JMSG_LENGTH_MAX];
17 info->err->format_message(info, buffer);
18 SkCodecPrintf("libjpeg error %d <%s> from %s\n", info->err->msg_code, buffer, caller);
19}
20
21/*
msarett6dfe9ac2015-11-10 11:22:12 -080022 * Reporting function for error and warning messages.
msarette16b04a2015-04-15 07:32:19 -070023 */
msarette16b04a2015-04-15 07:32:19 -070024static void output_message(j_common_ptr info) {
25 print_message(info, "output_message");
26}
27
msarette16b04a2015-04-15 07:32:19 -070028bool JpegDecoderMgr::returnFalse(const char caller[]) {
29 print_message((j_common_ptr) &fDInfo, caller);
30 return false;
31}
32
33SkCodec::Result JpegDecoderMgr::returnFailure(const char caller[], SkCodec::Result result) {
34 print_message((j_common_ptr) &fDInfo, caller);
35 return result;
36}
37
msarettac6c7502016-04-25 09:30:24 -070038bool JpegDecoderMgr::getEncodedColor(SkEncodedInfo::Color* outColor) {
msarette16b04a2015-04-15 07:32:19 -070039 switch (fDInfo.jpeg_color_space) {
msarette16b04a2015-04-15 07:32:19 -070040 case JCS_GRAYSCALE:
msarettac6c7502016-04-25 09:30:24 -070041 *outColor = SkEncodedInfo::kGray_Color;
42 return true;
msarettc30c4182016-04-20 11:53:35 -070043 case JCS_YCbCr:
msarettac6c7502016-04-25 09:30:24 -070044 *outColor = SkEncodedInfo::kYUV_Color;
45 return true;
msarettc30c4182016-04-20 11:53:35 -070046 case JCS_RGB:
msarettac6c7502016-04-25 09:30:24 -070047 *outColor = SkEncodedInfo::kRGB_Color;
48 return true;
msarettc30c4182016-04-20 11:53:35 -070049 case JCS_YCCK:
msarettac6c7502016-04-25 09:30:24 -070050 *outColor = SkEncodedInfo::kYCCK_Color;
51 return true;
msarettc30c4182016-04-20 11:53:35 -070052 case JCS_CMYK:
msarettac6c7502016-04-25 09:30:24 -070053 *outColor = SkEncodedInfo::kInvertedCMYK_Color;
54 return true;
msarette16b04a2015-04-15 07:32:19 -070055 default:
msarettac6c7502016-04-25 09:30:24 -070056 return false;
msarette16b04a2015-04-15 07:32:19 -070057 }
58}
59
60JpegDecoderMgr::JpegDecoderMgr(SkStream* stream)
61 : fSrcMgr(stream)
62 , fInit(false)
63{
64 // Error manager must be set before any calls to libjeg in order to handle failures
msarettfbccb592015-09-01 06:43:41 -070065 fDInfo.err = jpeg_std_error(&fErrorMgr);
msarette16b04a2015-04-15 07:32:19 -070066 fErrorMgr.error_exit = skjpeg_err_exit;
67}
68
69void JpegDecoderMgr::init() {
70 jpeg_create_decompress(&fDInfo);
71 fInit = true;
72 fDInfo.src = &fSrcMgr;
msarette16b04a2015-04-15 07:32:19 -070073 fDInfo.err->output_message = &output_message;
74}
75
76JpegDecoderMgr::~JpegDecoderMgr() {
77 if (fInit) {
78 jpeg_destroy_decompress(&fDInfo);
79 }
80}
81
82jmp_buf& JpegDecoderMgr::getJmpBuf() {
83 return fErrorMgr.fJmpBuf;
84}
85
86jpeg_decompress_struct* JpegDecoderMgr::dinfo() {
87 return &fDInfo;
88}