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)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 sk_empty_output_buffer(j_compress_ptr cinfo)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 sk_term_destination(j_compress_ptr cinfo)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 skjpeg_destination_mgr(SkWStream * stream)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 skjpeg_error_exit(j_common_ptr cinfo)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