blob: 29994ba1df1c70f4ebd63140fe82d81b30374009 [file] [log] [blame]
reed@android.com6f598152010-01-21 15:34:19 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2010 The Android Open Source Project
reed@android.com6f598152010-01-21 15:34:19 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com6f598152010-01-21 15:34:19 +00006 */
7
Derek Sollenbergerd68c41d2017-03-22 16:19:49 +00008
msarettc1d03122016-03-25 08:58:55 -07009#include "SkJPEGWriteUtility.h"
reed@android.com6f598152010-01-21 15:34:19 +000010
reed@android.com6f598152010-01-21 15:34:19 +000011///////////////////////////////////////////////////////////////////////////////
12
13static void sk_init_destination(j_compress_ptr cinfo) {
14 skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest;
15
16 dest->next_output_byte = dest->fBuffer;
17 dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize;
18}
19
20static boolean sk_empty_output_buffer(j_compress_ptr cinfo) {
21 skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest;
22
23// if (!dest->fStream->write(dest->fBuffer, skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer))
24 if (!dest->fStream->write(dest->fBuffer,
25 skjpeg_destination_mgr::kBufferSize)) {
26 ERREXIT(cinfo, JERR_FILE_WRITE);
Mike Reed46ee3f72019-01-02 00:00:59 -050027 return FALSE;
reed@android.com6f598152010-01-21 15:34:19 +000028 }
29
30 dest->next_output_byte = dest->fBuffer;
31 dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize;
32 return TRUE;
33}
34
35static void sk_term_destination (j_compress_ptr cinfo) {
36 skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest;
37
38 size_t size = skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer;
39 if (size > 0) {
40 if (!dest->fStream->write(dest->fBuffer, size)) {
41 ERREXIT(cinfo, JERR_FILE_WRITE);
42 return;
43 }
44 }
45 dest->fStream->flush();
46}
47
48skjpeg_destination_mgr::skjpeg_destination_mgr(SkWStream* stream)
49 : fStream(stream) {
50 this->init_destination = sk_init_destination;
51 this->empty_output_buffer = sk_empty_output_buffer;
52 this->term_destination = sk_term_destination;
53}
54
Derek Sollenbergerd68c41d2017-03-22 16:19:49 +000055void skjpeg_error_exit(j_common_ptr cinfo) {
reed@android.com6f598152010-01-21 15:34:19 +000056 skjpeg_error_mgr* error = (skjpeg_error_mgr*)cinfo->err;
57
58 (*error->output_message) (cinfo);
59
60 /* Let the memory manager delete any temp files before we die */
61 jpeg_destroy(cinfo);
62
Chris Dalton3e794592017-12-01 13:11:09 -070063 if (error->fJmpBufStack.empty()) {
64 SK_ABORT("JPEG error with no jmp_buf set.");
65 }
66 longjmp(*error->fJmpBufStack.back(), -1);
reed@android.com6f598152010-01-21 15:34:19 +000067}