#include <jni.h>
#include <android/log.h>
#include <android/bitmap.h>

#define  LOG_TAG    "lib_morefun"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

typedef struct
{
    uint8_t alpha;
    uint8_t red;
    uint8_t green;
    uint8_t blue;
} argb;


JNIEXPORT void JNICALL Java_com_morefun_SysFont_convertToRGBA(JNIEnv* env, jclass clazz, jobject buffer, jint length)
{
	void* pixels = env->GetDirectBufferAddress(buffer);
	unsigned char * p_argb = (unsigned char *)pixels;
	unsigned char a;
	for (int i = 0; i < length; i+=4)
	{
		a = p_argb[i];
		p_argb[i  ] = p_argb[i+1];
		p_argb[i+1] = p_argb[i+2];
		p_argb[i+2] = p_argb[i+3];
		p_argb[i+3] = a;
	}
}

JNIEXPORT void JNICALL Java_com_morefun_SysFont_copyPixelsToBufferRGBA(JNIEnv* env, jclass clazz, jobject bitmap, jobject buffer)
{
    AndroidBitmapInfo  info_bitmap;
    int                ret;
    void*              pixelscolor;

    if ((ret = AndroidBitmap_getInfo(env, bitmap, &info_bitmap)) < 0) {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return;
    }
    if (info_bitmap.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
        LOGE("Bitmap format is not RGBA_8888 !");
        return;
    }

    if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixelscolor)) < 0) {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
    }
    {
        for (int y=0; y<info_bitmap.height; y++) {
            argb * line = (argb *) pixelscolor;
            for (int x=0; x<info_bitmap.width; x++) {
                //grayline[x] = 0.3 * line[x].red + 0.59 * line[x].green + 0.11*line[x].blue;
            }
            pixelscolor = (char *)pixelscolor + info_bitmap.stride;
        }
    }
    AndroidBitmap_unlockPixels(env, bitmap);
}