/*
 * void setThreshold(int threshold)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_setThreshold(JNIEnv *env, jobject obj, jint threshold) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingThresholdKey, Integer, threshold);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * void nativeSetRasterDisplay(int display)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_nativeSetRasterDisplay(JNIEnv *env, jobject obj, jint display) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingVisualizeRasterKey, Integer, display);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * void setResampleResolution(float resolution)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_setResampleResolution(JNIEnv *env, jobject obj, jfloat resolution) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingResampleResolutionKey, Real, resolution);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * void nativeSetMode(int mode)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_nativeSetMode(JNIEnv *env, jobject obj, jint mode) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingModeKey, Integer, mode);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * int nativeGetType()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ai_Gradient_nativeGetType(JNIEnv *env, jobject obj) {
	try {
		AIGradientHandle gradient = gEngine->getGradientHandle(env, obj);
		short type = 0;
		sAIGradient->GetGradientType(gradient, &type);
		return type;
	} EXCEPTION_CONVERT(env);
	return 0;
}
/*
 * void setMinStrokeLength(float minLength)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_setMinStrokeLength(JNIEnv *env, jobject obj, jfloat minLength) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingMinStrokeLengthKey, Real, minLength);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * int getOptions()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ui_MenuItem_getOptions(JNIEnv *env, jobject obj) {
	try {
		AIMenuItemHandle item = gEngine->getMenuItemHandle(env, obj);
		long options = 0;
		sAIMenu->GetMenuItemOptions(item, &options);
		return options;
	} EXCEPTION_CONVERT(env);
	return 0;
}
/*
 * boolean isChecked()
 */
JNIEXPORT jboolean JNICALL Java_com_scriptographer_ui_MenuItem_isChecked(JNIEnv *env, jobject obj) {
	try {
		AIMenuItemHandle item = gEngine->getMenuItemHandle(env, obj);
		ASBoolean checked = false;
		sAIMenu->IsItemChecked(item, &checked);
		return checked;
	} EXCEPTION_CONVERT(env);
	return false;
}
/*
 * int nativeCreate()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ai_Dictionary_nativeCreate(
		JNIEnv *env, jclass obj) {
	try {
		AIDictionaryRef dictionary = NULL;
		sAIDictionary->CreateDictionary(&dictionary);
		return (jint) dictionary;
	} EXCEPTION_CONVERT(env);
	return 0;
}
/*
 * void setLivePaint(boolean livePaint)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_setLivePaint(JNIEnv *env, jobject obj, jboolean livePaint) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingLivePaintKey, Boolean, livePaint);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * com.scriptographer.ai.Point getPoint()
 */
JNIEXPORT jobject JNICALL Java_com_scriptographer_ai_PointText_getPoint(JNIEnv *env, jobject obj) {
	try {
		AIArtHandle text = gEngine->getArtHandle(env, obj);
		AIRealPoint anchor;
		if (!sAITextFrame->GetPointTextAnchor(text, &anchor))
			return gEngine->convertPoint(env, kArtboardCoordinates, &anchor);		
	} EXCEPTION_CONVERT(env);
	return NULL;
}
/*
 * void setMinArea(int minArea)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_setMinArea(JNIEnv *env, jobject obj, jint minArea) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingMinimumAreaKey, Integer, minArea);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * void setCornerAngle(float angle)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_setCornerAngle(JNIEnv *env, jobject obj, jfloat angle) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingCornerAngleKey, Real, angle);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * void setPathTightness(float tightness)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_setPathTightness(JNIEnv *env, jobject obj, jfloat tightness) {
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_SET_OPTION(kTracingPathTightnessKey, Real, tightness);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * void update()
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Tracing_update(JNIEnv *env, jobject obj) {
	try {
#if kPluginInterfaceVersion >= kAI12
		AIArtHandle art = gEngine->getArtHandle(env, obj, true);
		sAITracing->Update(art);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
}
/*
 * int nativeCreate()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ai_Gradient_nativeCreate(JNIEnv *env, jclass cls) {
	try {
		// Make sure we're switching to the right doc (gCreationDoc)
		Document_activate();
		AIGradientHandle gradient = NULL;
		sAIGradient->NewGradient(&gradient);
		return (jint) gradient;
	} EXCEPTION_CONVERT(env);
	return 0;
}
/*
 * void setEnabled(boolean enabled)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ui_MenuItem_setEnabled(JNIEnv *env, jobject obj, jboolean enabled) {
	try {
		AIMenuItemHandle item = gEngine->getMenuItemHandle(env, obj);
		if (enabled) {
			sAIMenu->EnableItem(item);
		} else {
			sAIMenu->DisableItem(item);
		}
	} EXCEPTION_CONVERT(env);
}
/*
 * int nativeGetRasterDisplay()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ai_Tracing_nativeGetRasterDisplay(JNIEnv *env, jobject obj) {
	ASInt32 display = 0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingVisualizeRasterKey, Integer, &display);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return display;
}
/*
 * int nativeCreateLiveEffectParameters()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ai_Dictionary_nativeCreateLiveEffectParameters(
		JNIEnv *env, jclass cls) {
	try {
		AILiveEffectParameters parameters = NULL;
		// AI SDK: "The dictionary created by this function supports Undo operations,
		// which the generic one does not."
		sAILiveEffect->CreateLiveEffectParameters(&parameters);
		return (jint) parameters;
	} EXCEPTION_CONVERT(env);
	return 0;
}
/*
 * boolean getResample()
 */
JNIEXPORT jboolean JNICALL Java_com_scriptographer_ai_Tracing_getResample(JNIEnv *env, jobject obj) {
	ASBoolean value = false;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingResampleKey, Boolean, &value);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return value;
}
/*
 * float getMinStrokeLength()
 */
JNIEXPORT jfloat JNICALL Java_com_scriptographer_ai_Tracing_getMinStrokeLength(JNIEnv *env, jobject obj) {
	ASReal minLength = 0.0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingMinStrokeLengthKey, Real, &minLength);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return minLength;
}
/*
 * int getMinArea()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ai_Tracing_getMinArea(JNIEnv *env, jobject obj) {
	ASInt32 minArea = 0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingMinimumAreaKey, Integer, &minArea);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return minArea;
}
/*
 * float getCornerAngle()
 */
JNIEXPORT jfloat JNICALL Java_com_scriptographer_ai_Tracing_getCornerAngle(JNIEnv *env, jobject obj) {
	ASReal angle = 0.0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingCornerAngleKey, Real, &angle);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return angle;
}
/*
 * float getPathTightness()
 */
JNIEXPORT jfloat JNICALL Java_com_scriptographer_ai_Tracing_getPathTightness(JNIEnv *env, jobject obj) {
	ASReal tightness = 0.0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingPathTightnessKey, Real, &tightness);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return tightness;
}
/*
 * java.lang.Object nativeGet(int docHandle, int index)
 */
JNIEXPORT jobject JNICALL Java_com_scriptographer_ai_LayerList_nativeGet__II(JNIEnv *env, jclass cls, jint docHandle, jint index) {
	jobject layerObj = NULL;
	try {
		Document_activate((AIDocumentHandle) docHandle);
		AILayerHandle layer = NULL;
		sAILayer->GetNthLayer(index, &layer);
		if (layer != NULL)
			layerObj = gEngine->wrapLayerHandle(env, layer, (AIDocumentHandle) docHandle);
	} EXCEPTION_CONVERT(env);
	return layerObj;
}
/*
 * boolean getStrokes()
 */
JNIEXPORT jboolean JNICALL Java_com_scriptographer_ai_Tracing_getStrokes(JNIEnv *env, jobject obj) {
	ASBoolean strokes = false;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingStrokesKey, Boolean, &strokes);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return strokes;
}
/*
 * boolean getLivePaint()
 */
JNIEXPORT jboolean JNICALL Java_com_scriptographer_ai_Tracing_getLivePaint(JNIEnv *env, jobject obj) {
	ASBoolean livePaint = 0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingLivePaintKey, Boolean, &livePaint);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return livePaint;
}
/*
 * float getMaxStrokeWeight()
 */
JNIEXPORT jfloat JNICALL Java_com_scriptographer_ai_Tracing_getMaxStrokeWeight(JNIEnv *env, jobject obj) {
	ASReal maxWeight = 0.0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingMaxStrokeWeightKey, Real, &maxWeight);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return maxWeight;
}
/*
 * void nativeAbort(int handle)
 */
JNIEXPORT void JNICALL Java_com_scriptographer_ai_Timer_nativeAbort(
		JNIEnv *env, jobject obj, jint handle) {
	try {
#ifdef WIN_ENV
		KillTimer(NULL, (UINT_PTR) handle);
#endif // WIN_ENV
#ifdef MAC_ENV
		RemoveEventLoopTimer((EventLoopTimerRef) handle);
#endif // MAC_ENV
	} EXCEPTION_CONVERT(env);
}
/*
 * int getMaxColors()
 */
JNIEXPORT jint JNICALL Java_com_scriptographer_ai_Tracing_getMaxColors(JNIEnv *env, jobject obj) {
	ASInt32 maxColors = 0;
	try {
#if kPluginInterfaceVersion >= kAI12
		TRACING_GET_OPTION(kTracingMaxColorsKey, Integer, &maxColors);
#else
		TRACING_EXCEPTION
#endif
	} EXCEPTION_CONVERT(env);
	return maxColors;
}