1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2010 The Android Open Source Project 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker #include "src/encode/SkJPEGWriteUtility.h" 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/codec/SkJpegPriv.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include <csetjmp> 15*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker extern "C" { 18*c8dee2aaSAndroid Build Coastguard Worker #include "jerror.h" // NO_G3_REWRITE 19*c8dee2aaSAndroid Build Coastguard Worker #include "jpeglib.h" // NO_G3_REWRITE 20*c8dee2aaSAndroid Build Coastguard Worker } 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 23*c8dee2aaSAndroid Build Coastguard Worker sk_init_destination(j_compress_ptr cinfo)24*c8dee2aaSAndroid Build Coastguard Workerstatic void sk_init_destination(j_compress_ptr cinfo) { 25*c8dee2aaSAndroid Build Coastguard Worker skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker dest->next_output_byte = dest->fBuffer; 28*c8dee2aaSAndroid Build Coastguard Worker dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize; 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker sk_empty_output_buffer(j_compress_ptr cinfo)31*c8dee2aaSAndroid Build Coastguard Workerstatic boolean sk_empty_output_buffer(j_compress_ptr cinfo) { 32*c8dee2aaSAndroid Build Coastguard Worker skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker // if (!dest->fStream->write(dest->fBuffer, skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer)) 35*c8dee2aaSAndroid Build Coastguard Worker if (!dest->fStream->write(dest->fBuffer, 36*c8dee2aaSAndroid Build Coastguard Worker skjpeg_destination_mgr::kBufferSize)) { 37*c8dee2aaSAndroid Build Coastguard Worker ERREXIT(cinfo, JERR_FILE_WRITE); 38*c8dee2aaSAndroid Build Coastguard Worker return FALSE; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker dest->next_output_byte = dest->fBuffer; 42*c8dee2aaSAndroid Build Coastguard Worker dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize; 43*c8dee2aaSAndroid Build Coastguard Worker return TRUE; 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker sk_term_destination(j_compress_ptr cinfo)46*c8dee2aaSAndroid Build Coastguard Workerstatic void sk_term_destination (j_compress_ptr cinfo) { 47*c8dee2aaSAndroid Build Coastguard Worker skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker size_t size = skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer; 50*c8dee2aaSAndroid Build Coastguard Worker if (size > 0) { 51*c8dee2aaSAndroid Build Coastguard Worker if (!dest->fStream->write(dest->fBuffer, size)) { 52*c8dee2aaSAndroid Build Coastguard Worker ERREXIT(cinfo, JERR_FILE_WRITE); 53*c8dee2aaSAndroid Build Coastguard Worker return; 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker dest->fStream->flush(); 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker skjpeg_destination_mgr(SkWStream * stream)60*c8dee2aaSAndroid Build Coastguard Workerskjpeg_destination_mgr::skjpeg_destination_mgr(SkWStream* stream) : fStream(stream) { 61*c8dee2aaSAndroid Build Coastguard Worker this->init_destination = sk_init_destination; 62*c8dee2aaSAndroid Build Coastguard Worker this->empty_output_buffer = sk_empty_output_buffer; 63*c8dee2aaSAndroid Build Coastguard Worker this->term_destination = sk_term_destination; 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker skjpeg_error_exit(j_common_ptr cinfo)66*c8dee2aaSAndroid Build Coastguard Workervoid skjpeg_error_exit(j_common_ptr cinfo) { 67*c8dee2aaSAndroid Build Coastguard Worker skjpeg_error_mgr* error = static_cast<skjpeg_error_mgr*>(cinfo->err); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker (*error->output_message)(cinfo); 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker /* Let the memory manager delete any temp files before we die */ 72*c8dee2aaSAndroid Build Coastguard Worker jpeg_destroy(cinfo); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker if (error->fStack[0] == nullptr) { 75*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("JPEG error with no jmp_buf set."); 76*c8dee2aaSAndroid Build Coastguard Worker } 77*c8dee2aaSAndroid Build Coastguard Worker longjmp(*error->fStack[0], -1); 78*c8dee2aaSAndroid Build Coastguard Worker } 79