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