/* Copyright (C) 2011 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
*/
#ifndef _ANDROID_UTILS_JPEG_COMPRESS_H
#define _ANDROID_UTILS_JPEG_COMPRESS_H

#include "android/utils/compiler.h"

ANDROID_BEGIN_HEADER

/*
 * Contains declaration of utility routines that compress an RGB bitmap into
 * a JPEG image.
 *
 * NOTE: This code uses a jpeglib library located in distrib/jpeg-6b. It's a
 * 3-rd party library that uses its own type definitions that are different from
 * the ones that are use elsewhere in the emulator code. For instance, in the
 * emulator built for Windows, sizeof(bool) = 1, while in the jpeglib sizeof(bool) = 4.
 * So, to simplify dealing with these issues, all the code that uses jpeglib should
 * be compiled separately, and should include only headers that are used to compile
 * jpeglib.
 */


/* Declares descriptor for a JPEG compression. */
typedef struct AJPEGDesc AJPEGDesc;

/* Creates a descriptor that will be used for compression.
 * Param:
 *  header_size - Number of bytes to allocate for a custom header that should
 *      preceed the actual JPEG buffer. This is useful when sending JPEG
 *      somewhere else along with some extra data about the compressed image.
 *  cunk_size - Number of bytes to increment the compressed buffer with each time
 *      compressor requests more memory.
 * Return:
 *  Initialized compression descriptor.
 */
extern AJPEGDesc* jpeg_compressor_create(int header_size, int chunk_size);

/* Destroys compressor descriptor.
 * Param:
 *  dsc - Compressin descriptor, obtained with jpeg_compressor_create.
 */
extern void jpeg_compressor_destroy(AJPEGDesc* dsc);

/* Returns compressed data size.
 * Param:
 *  dsc - Compression descriptor, obtained with jpeg_compressor_create.
 * Return:
 *  Compressed data size.
 */
extern int jpeg_compressor_get_jpeg_size(const AJPEGDesc* dsc);

/* Returns compressed buffer.
 * Param:
 *  dsc - Compression descriptor, obtained with jpeg_compressor_create.
 * Return:
 *  Compressed buffer. NOTE: if 'header_size' parameter passed to the jpeg_compressor_create
 *  for this descriptor was not zero, this routine returns a pointer to the custom
 *  header. Compressed data follows immediately after that header.
 */
extern void* jpeg_compressor_get_buffer(const AJPEGDesc* dsc);

/* Returns size of the custom header placed before the compressed data.
 * Param:
 *  dsc - Compression descriptor, obtained with jpeg_compressor_create.
 * Return:
 *  Size of the custom header placed before the compressed data.
 */
extern int jpeg_compressor_get_header_size(const AJPEGDesc* dsc);

/* Compresses a framebuffer region into JPEG image.
 * Param:
 *  dsc - Compression descriptor, obtained with jpeg_compressor_create.
 *  x, y, w, h - Coordinates and sizes of framebuffer region to compress.
 *  num_lines - Number of lines in the framebuffer (true height).
 *  bpp - Number of bytes per pixel in the framebuffer.
 *  bpl - Number of bytes per line in the framebuffer.
 *  fb - Beginning of the framebuffer.
 *  jpeg_quality JPEG compression quality. A number from 1 to 100. Note that
 *      value 10 provides pretty decent image for the purpose of multi-touch
 *      emulation.
 *  ydir - Indicates direction in which lines are arranged in the framebuffer. If
 *      this value is negative, lines are arranged in bottom-up format (i.e. the
 *      bottom line is at the beginning of the buffer).
 */
extern void jpeg_compressor_compress_fb(AJPEGDesc* dsc,
                                        int x, int y, int w, int h,
                                        int num_lines,
                                        int bpp, int bpl,
                                        const uint8_t* fb,
                                        int jpeg_quality,
                                        int ydir);

ANDROID_END_HEADER

#endif  /* _ANDROID_UTILS_JPEG_COMPRESS_H */
