1/*
2 * Copyright 2010 The Android Open Source Project
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
9#include "src/images/SkJPEGWriteUtility.h"
10
11///////////////////////////////////////////////////////////////////////////////
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);
27 return FALSE;
28 }
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
55void skjpeg_error_exit(j_common_ptr cinfo) {
56 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
63 if (error->fJmpBufStack.empty()) {
64 SK_ABORT("JPEG error with no jmp_buf set.");
65 }
66 longjmp(*error->fJmpBufStack.back(), -1);
67}
68