diff mupdf-source/thirdparty/freeglut/src/android/fg_runtime_android.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/freeglut/src/android/fg_runtime_android.c	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,169 @@
+/*
+ * fg_runtime_android.c
+ *
+ * Android runtime
+ *
+ * Copyright (C) 2012  Sylvain Beucler
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/* Parts taken from Android NDK's 'native-activity' sample: */
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <jni.h>
+#include <android/log.h>
+#include <android/asset_manager.h>
+#include <android/native_window.h>
+#include "android/native_app_glue/android_native_app_glue.h"
+#include "android/fg_main_android.h"
+
+#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "FreeGLUT-jnicb", __VA_ARGS__))
+#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "FreeGLUT-jnicb", __VA_ARGS__))
+
+/* Cf. fg_main_android.c */
+extern int32_t handle_input(struct android_app* app, AInputEvent* event);
+extern void handle_cmd(struct android_app* app, int32_t cmd);
+
+extern int main(int argc, char* argv[]);
+
+/** NativeActivity Callbacks **/
+/* Caution: they are called in the native_activity thread, not the
+   FreeGLUT thread. Use android_app_write_cmd. */
+
+/* Could be used instead of onNativeWindowRedrawNeeded */
+/* Deals with status bar presence */
+static void onContentRectChanged(ANativeActivity* activity, const ARect* rect) {
+  LOGI("onContentRectChanged: l=%d,t=%d,r=%d,b=%d", rect->left, rect->top, rect->right, rect->bottom);
+}
+
+/* Bug: not called during a resize in android-9, only once on startup :/ */
+static void onNativeWindowResized(ANativeActivity* activity, ANativeWindow* window) {
+  LOGI("onNativeWindowResized: %p\n", (void*)activity);
+}
+
+/* Called after a resize, compensate broken onNativeWindowResized */
+static void onNativeWindowRedrawNeeded(ANativeActivity* activity, ANativeWindow* window) {
+  LOGI("onNativeWindowRedrawNeeded: %p\n", (void*)activity);
+  struct android_app* app = (struct android_app*)activity->instance;
+  android_app_write_cmd(app, APP_CMD_WINDOW_RESIZED);
+}
+
+/**
+ * Extract all .apk assets to the application directory so they can be
+ * accessed using accessed.
+ * TODO: parse directories recursively
+ */
+static void extract_assets(struct android_app* app) {
+  /* Get usable JNI context */
+  JNIEnv* env = app->activity->env;
+  JavaVM* vm = app->activity->vm;
+  (*vm)->AttachCurrentThread(vm, &env, NULL);
+  
+  {
+    /* Get a handle on our calling NativeActivity class */
+    jclass activityClass = (*env)->GetObjectClass(env, app->activity->clazz);
+    
+    /* Get path to cache dir (/data/data/org.myapp/cache) */
+    jmethodID getCacheDir = (*env)->GetMethodID(env, activityClass, "getCacheDir", "()Ljava/io/File;");
+    jobject file = (*env)->CallObjectMethod(env, app->activity->clazz, getCacheDir);
+    jclass fileClass = (*env)->FindClass(env, "java/io/File");
+    jmethodID getAbsolutePath = (*env)->GetMethodID(env, fileClass, "getAbsolutePath", "()Ljava/lang/String;");
+    jstring jpath = (jstring)(*env)->CallObjectMethod(env, file, getAbsolutePath);
+    const char* app_dir = (*env)->GetStringUTFChars(env, jpath, NULL);
+    
+    /* chdir in the application cache directory */
+    LOGI("app_dir: %s", app_dir);
+    chdir(app_dir);
+    (*env)->ReleaseStringUTFChars(env, jpath, app_dir);
+    
+    /* Pre-extract assets, to avoid Android-specific file opening */
+    {
+      AAssetManager* mgr = app->activity->assetManager;
+      AAssetDir* assetDir = AAssetManager_openDir(mgr, "");
+      const char* filename = (const char*)NULL;
+      while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) {
+	AAsset* asset = AAssetManager_open(mgr, filename, AASSET_MODE_STREAMING);
+	char buf[BUFSIZ];
+	int nb_read = 0;
+	FILE* out = fopen(filename, "w");
+	while ((nb_read = AAsset_read(asset, buf, BUFSIZ)) > 0)
+	  fwrite(buf, nb_read, 1, out);
+	fclose(out);
+	AAsset_close(asset);
+      }
+      AAssetDir_close(assetDir);
+    }
+  }
+
+  (*vm)->DetachCurrentThread(vm);
+}
+
+/**
+ * This is the main entry point of a native application that is using
+ * android_native_app_glue.  It runs in its own thread, with its own
+ * event loop for receiving input events and doing other things.
+ */
+void android_main(struct android_app* app) {
+  LOGI("android_main savedState=%p", app->savedState);
+
+  /* Register window resize callback */
+  app->activity->callbacks->onNativeWindowResized = onNativeWindowResized;
+  app->activity->callbacks->onContentRectChanged = onContentRectChanged;
+  app->activity->callbacks->onNativeWindowRedrawNeeded = onNativeWindowRedrawNeeded;
+  
+  app->onAppCmd = handle_cmd;
+  app->onInputEvent = handle_input;
+
+  extract_assets(app);
+
+  /* Call user's main */
+  {
+    char progname[5] = "self";
+    char* argv[] = {progname, NULL};
+    fgDisplay.pDisplay.app = app;
+    main(1, argv);
+    /* FreeGLUT will exit() by itself if
+       GLUT_ACTION_ON_WINDOW_CLOSE == GLUT_ACTION_EXIT */
+  }
+
+  LOGI("android_main: end");
+
+  /* Let NativeActivity restart us */
+  /* Users may want to forcibly exit() in their main() anyway because
+     NativeActivity doesn't dlclose() us, so all statically-assigned
+     variables keep their old values on restart.. */
+}