/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkJpegUtility_MTK_DEFINED #define SkJpegUtility_MTK_DEFINED #include "include/mtk/SkImageDecoder.h" #include "include/private/base/SkTArray.h" #include #include extern "C" { // We need to include stdio.h before jpeg because jpeg does not include it, but uses FILE // See https://github.com/libjpeg-turbo/libjpeg-turbo/issues/17 #include // IWYU pragma: keep #include "jpeglib_alpha.h" } class SkStream; /* * MTK error-handling struct */ struct skjpeg_error_mgr_MTK : jpeg_error_mgr_ALPHA { class AutoPushJmpBuf { public: AutoPushJmpBuf(skjpeg_error_mgr_MTK* mgr) : fMgr(mgr) { fMgr->fJmpBufStack.push_back(&fJmpBuf); } ~AutoPushJmpBuf() { SkASSERT(fMgr->fJmpBufStack.back() == &fJmpBuf); fMgr->fJmpBufStack.pop_back(); } operator jmp_buf&() { return fJmpBuf; } private: skjpeg_error_mgr_MTK* const fMgr; jmp_buf fJmpBuf; }; SkSTArray<4, jmp_buf*> fJmpBufStack; }; /* * Error handling function */ void skjpeg_err_exit_MTK(j_common_ptr_ALPHA cinfo); /* * Source handling struct for that allows libjpeg to use our stream object */ struct skjpeg_source_mgr_MTK : jpeg_source_mgr_ALPHA { skjpeg_source_mgr_MTK(SkStream* stream, SkImageDecoder* decoder); skjpeg_source_mgr_MTK(SkStream* stream); SkStream* fStream; // unowned // Unowned pointer to the decoder, used to check if the decoding process // has been cancelled. SkImageDecoder* fDecoder; enum { // TODO (msarett): Experiment with different buffer sizes. // This size was chosen because it matches SkImageDecoder. kBufferSize = 1024 }; char fBuffer[kBufferSize]; }; #endif