/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
#include <X11/X.h>
#include <X11/Xlib.h>
#include "swt.h"
#include "structs.h"

typedef struct XVisualInfo_FID_CACHE {
	int cached;
	jclass clazz;
	jfieldID visual, visualid, screen, depth, cclass, red_mask, green_mask, blue_mask, colormap_size, bits_per_rgb;
} XVisualInfo_FID_CACHE;
typedef XVisualInfo_FID_CACHE *PXVisualInfo_FID_CACHE;

XVisualInfo_FID_CACHE XVisualInfoFc;

void cacheXVisualInfoFids(JNIEnv *env, jobject lpObject, PXVisualInfo_FID_CACHE lpCache)
{
	if (lpCache->cached) return;
	lpCache->clazz = (*env)->GetObjectClass(env, lpObject);
	lpCache->visual = (*env)->GetFieldID(env, lpCache->clazz, "visual", "I");
	lpCache->visualid = (*env)->GetFieldID(env, lpCache->clazz, "visualid", "I");
	lpCache->screen = (*env)->GetFieldID(env, lpCache->clazz, "screen", "I");
	lpCache->depth = (*env)->GetFieldID(env, lpCache->clazz, "depth", "I");
	lpCache->cclass = (*env)->GetFieldID(env, lpCache->clazz, "cclass", "I");
	lpCache->red_mask = (*env)->GetFieldID(env, lpCache->clazz, "red_mask", "I");
	lpCache->green_mask = (*env)->GetFieldID(env, lpCache->clazz, "green_mask", "I");
	lpCache->blue_mask = (*env)->GetFieldID(env, lpCache->clazz, "blue_mask", "I");
	lpCache->colormap_size = (*env)->GetFieldID(env, lpCache->clazz, "colormap_size", "I");
	lpCache->bits_per_rgb = (*env)->GetFieldID(env, lpCache->clazz, "bits_per_rgb", "I");
	lpCache->cached = 1;
}

XVisualInfo *getXVisualInfoFields(JNIEnv *env, jobject lpObject, XVisualInfo *lpStruct)
{
	PXVisualInfo_FID_CACHE lpCache = &XVisualInfoFc;
	if (!lpCache->cached) cacheXVisualInfoFids(env, lpObject, lpCache);
	lpStruct->visual = (Visual *)(*env)->GetIntField(env, lpObject, lpCache->visual);
	lpStruct->visualid = (*env)->GetIntField(env, lpObject, lpCache->visualid);
	lpStruct->screen = (*env)->GetIntField(env, lpObject, lpCache->screen);
	lpStruct->depth = (*env)->GetIntField(env, lpObject, lpCache->depth);
	lpStruct->class = (*env)->GetIntField(env, lpObject, lpCache->cclass);
	lpStruct->red_mask = (*env)->GetIntField(env, lpObject, lpCache->red_mask);
	lpStruct->green_mask = (*env)->GetIntField(env, lpObject, lpCache->green_mask);
	lpStruct->blue_mask = (*env)->GetIntField(env, lpObject, lpCache->blue_mask);
	lpStruct->colormap_size = (*env)->GetIntField(env, lpObject, lpCache->colormap_size);
	lpStruct->bits_per_rgb = (*env)->GetIntField(env, lpObject, lpCache->bits_per_rgb);
	return lpStruct;
}

void setXVisualInfoFields(JNIEnv *env, jobject lpObject, XVisualInfo *lpStruct)
{
	PXVisualInfo_FID_CACHE lpCache = &XVisualInfoFc;
	if (!lpCache->cached) cacheXVisualInfoFids(env, lpObject, lpCache);
	(*env)->SetIntField(env, lpObject, lpCache->visual, (jint)lpStruct->visual);
	(*env)->SetIntField(env, lpObject, lpCache->visualid, (jint)lpStruct->visualid);
	(*env)->SetIntField(env, lpObject, lpCache->screen, (jint)lpStruct->screen);
	(*env)->SetIntField(env, lpObject, lpCache->depth, (jint)lpStruct->depth);
	(*env)->SetIntField(env, lpObject, lpCache->cclass, (jint)lpStruct->class);
	(*env)->SetIntField(env, lpObject, lpCache->red_mask, (jint)lpStruct->red_mask);
	(*env)->SetIntField(env, lpObject, lpCache->green_mask, (jint)lpStruct->green_mask);
	(*env)->SetIntField(env, lpObject, lpCache->blue_mask, (jint)lpStruct->blue_mask);
	(*env)->SetIntField(env, lpObject, lpCache->colormap_size, (jint)lpStruct->colormap_size);
	(*env)->SetIntField(env, lpObject, lpCache->bits_per_rgb, (jint)lpStruct->bits_per_rgb);
}
