• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
sk_init_destination(j_compress_ptr cinfo)13 static 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 
sk_empty_output_buffer(j_compress_ptr cinfo)20 static 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 
sk_term_destination(j_compress_ptr cinfo)35 static 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 
skjpeg_destination_mgr(SkWStream * stream)48 skjpeg_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 
skjpeg_error_exit(j_common_ptr cinfo)55 void 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