Home | History | Annotate | Download | only in images
      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 "SkJPEGWriteUtility.h"
     10 
     11 ///////////////////////////////////////////////////////////////////////////////
     12 
     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 
     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 
     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 
     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 
     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     longjmp(error->fJmpBuf, -1);
     64 }
     65