16f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 The Android Open Source Project 36f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 66f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com */ 76f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 9c1d0312b227328bee7240d1df4ceee55cf6e1858msarett#include "SkJPEGWriteUtility.h" 106f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 116f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com/////////////////////////////////////////////////////////////////////////////// 126f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 136f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.comstatic void sk_init_destination(j_compress_ptr cinfo) { 146f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 156f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 166f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com dest->next_output_byte = dest->fBuffer; 176f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize; 186f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com} 196f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 206f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.comstatic boolean sk_empty_output_buffer(j_compress_ptr cinfo) { 216f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 226f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 236f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com// if (!dest->fStream->write(dest->fBuffer, skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer)) 246f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com if (!dest->fStream->write(dest->fBuffer, 256f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com skjpeg_destination_mgr::kBufferSize)) { 266f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com ERREXIT(cinfo, JERR_FILE_WRITE); 276f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com return false; 286f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com } 296f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 306f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com dest->next_output_byte = dest->fBuffer; 316f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize; 326f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com return TRUE; 336f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com} 346f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 356f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.comstatic void sk_term_destination (j_compress_ptr cinfo) { 366f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 376f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 386f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com size_t size = skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer; 396f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com if (size > 0) { 406f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com if (!dest->fStream->write(dest->fBuffer, size)) { 416f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com ERREXIT(cinfo, JERR_FILE_WRITE); 426f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com return; 436f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com } 446f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com } 456f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com dest->fStream->flush(); 466f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com} 476f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 486f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.comskjpeg_destination_mgr::skjpeg_destination_mgr(SkWStream* stream) 496f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com : fStream(stream) { 506f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com this->init_destination = sk_init_destination; 516f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com this->empty_output_buffer = sk_empty_output_buffer; 526f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com this->term_destination = sk_term_destination; 536f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com} 546f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 556f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.comvoid skjpeg_error_exit(j_common_ptr cinfo) { 566f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com skjpeg_error_mgr* error = (skjpeg_error_mgr*)cinfo->err; 576f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 586f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com (*error->output_message) (cinfo); 596f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 606f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com /* Let the memory manager delete any temp files before we die */ 616f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com jpeg_destroy(cinfo); 626f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com 636f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com longjmp(error->fJmpBuf, -1); 646f59815b3dbd19efb8a29d0115deea9c88da8ae1reed@android.com} 65