/*
 * Copyright 2021 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include <jni.h>

#include "include/core/SkPaint.h"
#include "include/core/SkShader.h"

namespace {

static jlong Paint_Create(JNIEnv* env, jobject) {
    return reinterpret_cast<jlong>(new SkPaint);
}

static void Paint_Release(JNIEnv* env, jobject, jlong native_paint) {
    delete reinterpret_cast<SkPaint*>(native_paint);
}

static void Paint_SetColor(JNIEnv* env, jobject, jlong native_paint,
                           float r, float g, float b, float a) {
    if (auto* paint = reinterpret_cast<SkPaint*>(native_paint)) {
        paint->setColor4f({r, g, b, a});
    }
}

static void Paint_SetStroke(JNIEnv* env, jobject, jlong native_paint, jboolean stroke) {
    if (auto* paint = reinterpret_cast<SkPaint*>(native_paint)) {
        paint->setStroke(stroke);
    }
}

static void Paint_SetStrokeWidth(JNIEnv* env, jobject, jlong native_paint, jfloat width) {
    if (auto* paint = reinterpret_cast<SkPaint*>(native_paint)) {
        paint->setStrokeWidth(width);
    }
}

static void Paint_SetShader(JNIEnv* env, jobject, jlong native_paint, jlong native_shader) {
    if (auto* paint = reinterpret_cast<SkPaint*>(native_paint)) {
        paint->setShader(sk_ref_sp(reinterpret_cast<SkShader*>(native_shader)));
    }
}

}  // namespace

int register_androidkit_Paint(JNIEnv* env) {
    static const JNINativeMethod methods[] = {
        {"nCreate"         , "()J"     , reinterpret_cast<void*>(Paint_Create)},
        {"nRelease"        , "(J)V"    , reinterpret_cast<void*>(Paint_Release)},
        {"nSetColor"       , "(JFFFF)V", reinterpret_cast<void*>(Paint_SetColor)},
        {"nSetStroke"      , "(JZ)V"   , reinterpret_cast<void*>(Paint_SetStroke)},
        {"nSetStrokeWidth" , "(JF)V"   , reinterpret_cast<void*>(Paint_SetStrokeWidth)},
        {"nSetShader"      , "(JJ)V"   , reinterpret_cast<void*>(Paint_SetShader)},
    };

    const auto clazz = env->FindClass("org/skia/androidkit/Paint");
    return clazz
        ? env->RegisterNatives(clazz, methods, SK_ARRAY_COUNT(methods))
        : JNI_ERR;
}
