H3Error CreateGeoPolygon()

in src/main/c/h3-java/src/jniapi.c [91:141]


H3Error CreateGeoPolygon(JNIEnv *env, jdoubleArray verts, jintArray holeSizes,
                         jdoubleArray holeVerts, GeoPolygon *polygon) {
    // This is the number of doubles, so convert to number of verts
    polygon->geoloop.numVerts = (**env).GetArrayLength(env, verts) / 2;
    polygon->geoloop.verts = (**env).GetDoubleArrayElements(env, verts, 0);
    if (polygon->geoloop.verts != NULL) {
        polygon->numHoles = (**env).GetArrayLength(env, holeSizes);

        polygon->holes = calloc(sizeof(GeoPolygon), polygon->numHoles);
        if (polygon->holes == NULL) {
            ThrowOutOfMemoryError(env);
            return E_MEMORY_ALLOC;
        }

        jint *holeSizesElements =
            (**env).GetIntArrayElements(env, holeSizes, 0);
        if (holeSizesElements == NULL) {
            free(polygon->holes);
            ThrowOutOfMemoryError(env);
            return E_MEMORY_ALLOC;
        }

        jdouble *holeVertsElements =
            (**env).GetDoubleArrayElements(env, holeVerts, 0);
        if (holeVertsElements == NULL) {
            free(polygon->holes);
            (**env).ReleaseIntArrayElements(env, holeSizes, holeSizesElements,
                                            0);
            ThrowOutOfMemoryError(env);
            return E_MEMORY_ALLOC;
        }

        size_t offset = 0;
        for (int i = 0; i < polygon->numHoles; i++) {
            // This is the number of doubles, so convert to number of verts
            polygon->holes[i].numVerts = holeSizesElements[i] / 2;
            polygon->holes[i].verts = holeVertsElements + offset;
            offset += holeSizesElements[i];
        }

        (**env).ReleaseIntArrayElements(env, holeSizes, holeSizesElements, 0);
        // holeVertsElements is not released here because it is still being
        // pointed to by polygon->holes[*].verts. It will be released in
        // DestroyGeoPolygon.

        return E_SUCCESS;
    } else {
        ThrowOutOfMemoryError(env);
        return E_MEMORY_ALLOC;
    }
}