/**
 *  libcaca       Java bindings for libcaca
 *  Copyright (c) 2009 Adrien Grand <jpountz@dinauz.org>
 *
 *  This library is free software. It comes without any warranty, to
 *  the extent permitted by applicable law. You can redistribute it
 *  and/or modify it under the terms of the Do What the Fuck You Want
 *  to Public License, Version 2, as published by Sam Hocevar. See
 *  http://www.wtfpl.net/ for more details.
 */

#include "org_zoy_caca_Dither.h"
#include "caca_java_common.h"

#include "caca.h"

JNIEXPORT jlong JNICALL
Java_org_zoy_caca_Dither_createDither(JNIEnv *env, jclass cls, jint bpp, jint w, jint h,
                                      jint pitch, jint rmask, jint gmask, jint bmask, jint amask)
{
  caca_dither_t *dither = caca_create_dither(bpp, w, h, pitch, rmask, gmask, bmask, amask);

  if(dither == NULL) {
    THROW_EX("Cannot create a new Dither");
    return 0;
  }

  return (jlong)dither;
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherPalette(JNIEnv *env, jclass vls, jlong ptr, jintArray red,
                                          jintArray green, jintArray blue, jintArray alpha)
{
  jint *relems, *gelems, *belems, *aelems;

  relems = (*env)->GetIntArrayElements(env, red, 0);
  gelems = (*env)->GetIntArrayElements(env, green, 0);
  belems = (*env)->GetIntArrayElements(env, blue, 0);
  aelems = (*env)->GetIntArrayElements(env, alpha, 0);
  caca_set_dither_palette((caca_dither_t *)ptr, relems, gelems, belems, aelems);
  (*env)->ReleaseIntArrayElements(env, red, relems, 0);
  (*env)->ReleaseIntArrayElements(env, green, gelems, 0);
  (*env)->ReleaseIntArrayElements(env, blue, belems, 0);
  (*env)->ReleaseIntArrayElements(env, alpha, aelems, 0);
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherBrightness(JNIEnv *env, jclass cls, jlong ptr, jfloat v)
{
  caca_set_dither_brightness((caca_dither_t *)ptr, v);
}

JNIEXPORT jfloat JNICALL
Java_org_zoy_caca_Dither_getDitherBrightness(JNIEnv *env, jclass cls, jlong ptr)
{
  return caca_get_dither_brightness((caca_dither_t *)ptr);
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherGamma(JNIEnv *env, jclass cls, jlong ptr, jfloat v)
{
  caca_set_dither_gamma((caca_dither_t *)ptr, v);
}

JNIEXPORT jfloat JNICALL
Java_org_zoy_caca_Dither_getDitherGamma(JNIEnv *env, jclass cls, jlong ptr)
{
  return caca_get_dither_gamma((caca_dither_t *)ptr);
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherContrast(JNIEnv *env, jclass cls, jlong ptr, jfloat v)
{
  caca_set_dither_contrast((caca_dither_t *)ptr, v);
}

JNIEXPORT jfloat JNICALL
Java_org_zoy_caca_Dither_getDitherContrast(JNIEnv *env, jclass cls, jlong ptr)
{
  return caca_get_dither_contrast((caca_dither_t *)ptr);
}

JNIEXPORT jobjectArray JNICALL
Java_org_zoy_caca_Dither_getDitherAntiAliasingList(JNIEnv *env, jclass cls, jlong ptr)
{
  const char *const *antialias_list = caca_get_dither_antialias_list((caca_dither_t *)ptr);
  return caca_java_to_string_array(env, antialias_list);
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherAntiAliasing(JNIEnv *env, jclass cls, jlong ptr, jstring aa)
{
  const char *aa_chars = (*env)->GetStringUTFChars(env, aa, 0);
  caca_set_dither_antialias((caca_dither_t *)ptr, aa_chars);
  (*env)->ReleaseStringUTFChars(env, aa, aa_chars);
}

JNIEXPORT jstring JNICALL
Java_org_zoy_caca_Dither_getDitherAntiAliasing(JNIEnv *env, jclass cls, jlong ptr)
{
  return (*env)->NewStringUTF(env, caca_get_dither_antialias((caca_dither_t *)ptr));
}

JNIEXPORT jobjectArray
JNICALL Java_org_zoy_caca_Dither_getDitherColorList(JNIEnv *env, jclass cls, jlong ptr)
{
  const char *const *color_list = caca_get_dither_color_list((caca_dither_t *)ptr);
  return caca_java_to_string_array(env, color_list);
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherColor(JNIEnv *env, jclass cls, jlong ptr, jstring color)
{
  const char *color_chars = (*env)->GetStringUTFChars(env, color, 0);
  caca_set_dither_color((caca_dither_t *)ptr, color_chars);
  (*env)->ReleaseStringUTFChars(env, color, color_chars);
}

JNIEXPORT jstring JNICALL
Java_org_zoy_caca_Dither_getDitherColor(JNIEnv *env, jclass cls, jlong ptr)
{
  return (*env)->NewStringUTF(env, caca_get_dither_color((caca_dither_t *)ptr));
}

JNIEXPORT jobjectArray JNICALL
Java_org_zoy_caca_Dither_getDitherCharsetList(JNIEnv *env, jclass cls, jlong ptr)
{
  const char *const *color_list = caca_get_dither_color_list((caca_dither_t *)ptr);
  return caca_java_to_string_array(env, color_list);
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherCharset(JNIEnv *env, jclass cls, jlong ptr, jstring charset)
{
  const char *charset_chars = (*env)->GetStringUTFChars(env, charset, 0);
  caca_set_dither_charset((caca_dither_t *)ptr, charset_chars);
  (*env)->ReleaseStringUTFChars(env, charset, charset_chars);
}

JNIEXPORT jstring JNICALL
Java_org_zoy_caca_Dither_getDitherCharset(JNIEnv *env, jclass cls, jlong ptr)
{
  return (*env)->NewStringUTF(env, caca_get_dither_charset((caca_dither_t *)ptr));
}

JNIEXPORT jobjectArray JNICALL
Java_org_zoy_caca_Dither_getDitherAlgorithmList(JNIEnv *env, jclass cls, jlong ptr)
{
  const char *const *algorithm_list = caca_get_dither_algorithm_list((caca_dither_t *)ptr);
  return caca_java_to_string_array(env, algorithm_list);
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_setDitherAlgorithm(JNIEnv *env, jclass cls, jlong ptr, jstring algorithm)
{
  const char *algorithm_chars = (*env)->GetStringUTFChars(env, algorithm, 0);
  caca_set_dither_algorithm((caca_dither_t *)ptr, algorithm_chars);
  (*env)->ReleaseStringUTFChars(env, algorithm, algorithm_chars);
}

JNIEXPORT jstring JNICALL
Java_org_zoy_caca_Dither_getDitherAlgorithm(JNIEnv *env, jclass cls, jlong ptr)
{
  return (*env)->NewStringUTF(env, caca_get_dither_algorithm((caca_dither_t *)ptr));
}

JNIEXPORT void JNICALL
Java_org_zoy_caca_Dither_freeDither(JNIEnv *env, jclass cls, jlong ptr)
{
  caca_free_dither((caca_dither_t *)ptr);
}