mirror of
https://github.com/IllusionMan1212/ndk-odin.git
synced 2026-10-23 18:12:31 +00:00
WIP
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
import "core:sys/unix"
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
// NOTE: As far as I know and have tested, pthread from sys/unix SHOULD work fine on android.
|
||||
// Android doesn't support thread cancellation so those procs need to be commented out when compiling the native shared lib.
|
||||
// Odin's threading library has been tested with Cat & Onion and it seems to work just fine there.
|
||||
|
||||
AppCmd :: enum c.int32_t {
|
||||
/**
|
||||
* Command from main thread: the AInputQueue has changed. Upon processing
|
||||
* this command, android_app->inputQueue will be updated to the new queue
|
||||
* (or NULL).
|
||||
*/
|
||||
INPUT_CHANGED,
|
||||
|
||||
/**
|
||||
* Command from main thread: a new ANativeWindow is ready for use. Upon
|
||||
* receiving this command, android_app->window will contain the new window
|
||||
* surface.
|
||||
*/
|
||||
INIT_WINDOW,
|
||||
|
||||
/**
|
||||
* Command from main thread: the existing ANativeWindow needs to be
|
||||
* terminated. Upon receiving this command, android_app->window still
|
||||
* contains the existing window; after calling android_app_exec_cmd
|
||||
* it will be set to NULL.
|
||||
*/
|
||||
TERM_WINDOW,
|
||||
|
||||
/**
|
||||
* Command from main thread: the current ANativeWindow has been resized.
|
||||
* Please redraw with its new size.
|
||||
*/
|
||||
WINDOW_RESIZED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the system needs that the current ANativeWindow
|
||||
* be redrawn. You should redraw the window before handing this to
|
||||
* android_app_exec_cmd() in order to avoid transient drawing glitches.
|
||||
*/
|
||||
WINDOW_REDRAW_NEEDED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the content area of the window has changed,
|
||||
* such as from the soft input window being shown or hidden. You can
|
||||
* find the new content rect in android_app::contentRect.
|
||||
*/
|
||||
CONTENT_RECT_CHANGED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity window has gained
|
||||
* input focus.
|
||||
*/
|
||||
GAINED_FOCUS,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity window has lost
|
||||
* input focus.
|
||||
*/
|
||||
LOST_FOCUS,
|
||||
|
||||
/**
|
||||
* Command from main thread: the current device configuration has changed.
|
||||
*/
|
||||
CONFIG_CHANGED,
|
||||
|
||||
/**
|
||||
* Command from main thread: the system is running low on memory.
|
||||
* Try to reduce your memory use.
|
||||
*/
|
||||
LOW_MEMORY,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been started.
|
||||
*/
|
||||
START,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been resumed.
|
||||
*/
|
||||
RESUME,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app should generate a new saved state
|
||||
* for itself, to restore from later if needed. If you have saved state,
|
||||
* allocate it with malloc and place it in android_app.savedState with
|
||||
* the size in android_app.savedStateSize. The will be freed for you
|
||||
* later.
|
||||
*/
|
||||
SAVE_STATE,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been paused.
|
||||
*/
|
||||
PAUSE,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity has been stopped.
|
||||
*/
|
||||
STOP,
|
||||
|
||||
/**
|
||||
* Command from main thread: the app's activity is being destroyed,
|
||||
* and waiting for the app thread to clean up and exit before proceeding.
|
||||
*/
|
||||
DESTROY,
|
||||
}
|
||||
|
||||
android_poll_source :: struct {
|
||||
// The identifier of this source. May be LOOPER_ID_MAIN or
|
||||
// LOOPER_ID_INPUT.
|
||||
id: c.int32_t,
|
||||
|
||||
// The android_app this ident is associated with.
|
||||
app: ^android_app,
|
||||
|
||||
// Function to call to perform the standard processing of data from
|
||||
// this source.
|
||||
//void (*process)(struct android_app* app, struct android_poll_source* source),
|
||||
process: #type proc "c" (app: ^android_app, source: ^android_poll_source),
|
||||
}
|
||||
|
||||
android_app :: struct {
|
||||
// The application can place a pointer to its own state object
|
||||
// here if it likes.
|
||||
userData: rawptr,
|
||||
|
||||
// Fill this in with the function to process main app commands (APP_CMD_*)
|
||||
onAppCmd: #type proc "c" (app: ^android_app, cmd: AppCmd),
|
||||
|
||||
// Fill this in with the function to process input events. At this point
|
||||
// the event has already been pre-dispatched, and it will be finished upon
|
||||
// return. Return 1 if you have handled the event, 0 for any default
|
||||
// dispatching.
|
||||
onInputEvent: #type proc "c" (app: ^android_app, event: ^AInputEvent) -> c.int32_t,
|
||||
|
||||
// The ANativeActivity object instance that this app is running in.
|
||||
activity: ^ANativeActivity,
|
||||
|
||||
// The current configuration the app is running in.
|
||||
config: ^AConfiguration,
|
||||
|
||||
// This is the last instance's saved state, as provided at creation time.
|
||||
// It is NULL if there was no state. You can use this as you need, the
|
||||
// memory will remain around until you call android_app_exec_cmd() for
|
||||
// APP_CMD_RESUME, at which point it will be freed and savedState set to NULL.
|
||||
// These variables should only be changed when processing a APP_CMD_SAVE_STATE,
|
||||
// at which point they will be initialized to NULL and you can malloc your
|
||||
// state and place the information here. In that case the memory will be
|
||||
// freed for you later.
|
||||
savedState: rawptr,
|
||||
savedStateSize: c.size_t,
|
||||
|
||||
// The ALooper associated with the app's thread.
|
||||
looper: ^ALooper,
|
||||
|
||||
// When non-NULL, this is the input queue from which the app will
|
||||
// receive user input events.
|
||||
inputQueue: ^AInputQueue,
|
||||
|
||||
// When non-NULL, this is the window surface that the app can draw in.
|
||||
window: ^ANativeWindow,
|
||||
|
||||
// Current content rectangle of the window, this is the area where the
|
||||
// window's content should be placed to be seen by the user.
|
||||
contentRect: ARect,
|
||||
|
||||
// Current state of the app's activity. May be either APP_CMD_START,
|
||||
// APP_CMD_RESUME, APP_CMD_PAUSE, or APP_CMD_STOP, see below.
|
||||
activityState: c.int,
|
||||
|
||||
// This is non-zero when the application's NativeActivity is being
|
||||
// destroyed and waiting for the app thread to complete.
|
||||
destroyRequested: c.int,
|
||||
|
||||
// -------------------------------------------------
|
||||
// Below are "private" implementation of the glue code.
|
||||
|
||||
mutex: unix.pthread_mutex_t,
|
||||
cond: unix.pthread_cond_t,
|
||||
|
||||
msgread: c.int,
|
||||
msgwrite: c.int,
|
||||
|
||||
thread: unix.pthread_t,
|
||||
|
||||
cmdPollSource: android_poll_source,
|
||||
inputPollSource: android_poll_source,
|
||||
|
||||
running: c.int,
|
||||
stateSaved: c.int,
|
||||
destroyed: c.int,
|
||||
redrawNeeded: c.int,
|
||||
pendingInputQueue: ^AInputQueue,
|
||||
pendingWindow: ^ANativeWindow,
|
||||
pendingContentRect: ARect,
|
||||
}
|
||||
|
||||
foreign android {
|
||||
app_dummy :: proc() ---
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/** Available access modes for opening assets with {@link AAssetManager_open} */
|
||||
AssetOpenMode :: enum c.int {
|
||||
/** No specific information about how data will be accessed. **/
|
||||
UNKNOWN = 0,
|
||||
/** Read chunks, and seek forward and backward. */
|
||||
RANDOM = 1,
|
||||
/** Read sequentially, with an occasional forward seek. */
|
||||
STREAMING = 2,
|
||||
/** Caller plans to ask for a read-only buffer with all data. */
|
||||
BUFFER = 3
|
||||
}
|
||||
|
||||
// Same as sys/linux but this is i32 instead of i16
|
||||
Seek_Whence :: enum i32 {
|
||||
SET = 0,
|
||||
CUR = 1,
|
||||
END = 2,
|
||||
DATA = 3,
|
||||
HOLE = 4,
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link AAssetManager} provides access to an application's raw assets by
|
||||
* creating {@link AAsset} objects.
|
||||
*
|
||||
* AAssetManager is a wrapper to the low-level native implementation
|
||||
* of the java {@link AAssetManager}, a pointer can be obtained using
|
||||
* AAssetManager_fromJava().
|
||||
*
|
||||
* The asset hierarchy may be examined like a filesystem, using
|
||||
* {@link AAssetDir} objects to peruse a single directory.
|
||||
*
|
||||
* A native {@link AAssetManager} pointer may be shared across multiple threads.
|
||||
*/
|
||||
AAssetManager :: struct{}
|
||||
|
||||
/**
|
||||
* {@link AAssetDir} provides access to a chunk of the asset hierarchy as if
|
||||
* it were a single directory. The contents are populated by the
|
||||
* {@link AAssetManager}.
|
||||
*
|
||||
* The list of files will be sorted in ascending order by ASCII value.
|
||||
*/
|
||||
AAssetDir :: struct{}
|
||||
|
||||
/**
|
||||
* {@link AAsset} provides access to a read-only asset.
|
||||
*
|
||||
* {@link AAsset} objects are NOT thread-safe, and should not be shared across
|
||||
* threads.
|
||||
*/
|
||||
AAsset :: struct{}
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Open an asset.
|
||||
*
|
||||
* The object returned here should be freed by calling AAsset_close().
|
||||
*/
|
||||
AAssetManager_open :: proc(mgr: ^AAssetManager, filename: cstring, mode: AssetOpenMode) -> ^AAsset ---
|
||||
|
||||
/**
|
||||
* Iterate over the files in an asset directory. A NULL string is returned
|
||||
* when all the file names have been returned.
|
||||
*
|
||||
* The returned file name is suitable for passing to AAssetManager_open().
|
||||
*
|
||||
* The string returned here is owned by the AssetDir implementation and is not
|
||||
* guaranteed to remain valid if any other calls are made on this AAssetDir
|
||||
* instance.
|
||||
*/
|
||||
AAssetDir_getNextFileName :: proc(assetDir: ^AAssetDir) -> cstring ---
|
||||
|
||||
/**
|
||||
* Reset the iteration state of AAssetDir_getNextFileName() to the beginning.
|
||||
*/
|
||||
AAssetDir_rewind :: proc(assetDir: ^AAssetDir) ---
|
||||
|
||||
/**
|
||||
* Close an opened AAssetDir, freeing any related resources.
|
||||
*/
|
||||
AAssetDir_close :: proc(assetDir: ^AAssetDir) ---
|
||||
|
||||
/**
|
||||
* Attempt to read 'count' bytes of data from the current offset.
|
||||
*
|
||||
* Returns the number of bytes read, zero on EOF, or < 0 on error.
|
||||
*/
|
||||
AAsset_read :: proc(asset: ^AAsset, buf: rawptr, count: uint) -> i32 ---
|
||||
|
||||
/**
|
||||
* Seek to the specified offset within the asset data. 'whence' uses the
|
||||
* same constants as lseek()/fseek().
|
||||
*
|
||||
* Returns the new position on success, or (off_t) -1 on error.
|
||||
*/
|
||||
// TODO: should we just not bind these functions since their 64-bit counterparts are available?
|
||||
// Because according to https://android.googlesource.com/platform/bionic/+/main/docs/32-bit-abi.md
|
||||
// and the __RENAME_IF_FILE_OFFSET64() macro these functions are replaced with the 64-bit versions at
|
||||
// runtime anyway (at least for 32-bit Android).
|
||||
// off_t is replaced with off64_t too.
|
||||
// I think all Android API version <21 should explicitly be unsupported both by Odin and the bindings here since
|
||||
// this opens a can of worms that I do not like.
|
||||
AAsset_seek :: proc(asset: ^AAsset, offset: off_t, whence: Seek_Whence) -> off_t ---
|
||||
|
||||
/**
|
||||
* Seek to the specified offset within the asset data. 'whence' uses the
|
||||
* same constants as lseek()/fseek().
|
||||
*
|
||||
* Uses 64-bit data type for large files as opposed to the 32-bit type used
|
||||
* by AAsset_seek.
|
||||
*
|
||||
* Returns the new position on success, or (off64_t) -1 on error.
|
||||
*/
|
||||
AAsset_seek64 :: proc(asset: ^AAsset, offset: off64_t, whence: Seek_Whence) -> off64_t ---
|
||||
|
||||
/**
|
||||
* Close the asset, freeing all associated resources.
|
||||
*/
|
||||
AAsset_close :: proc(asset: ^AAsset) ---
|
||||
|
||||
/**
|
||||
* Get a pointer to a buffer holding the entire contents of the assset.
|
||||
*
|
||||
* Returns NULL on failure.
|
||||
*/
|
||||
AAsset_getBuffer :: proc(asset: ^AAsset) -> rawptr ---
|
||||
|
||||
/**
|
||||
* Report the total size of the asset data.
|
||||
*/
|
||||
AAsset_getLength :: proc(asset: ^AAsset) -> off_t ---
|
||||
|
||||
/**
|
||||
* Report the total size of the asset data. Reports the size using a 64-bit
|
||||
* number insted of 32-bit as AAsset_getLength.
|
||||
*/
|
||||
AAsset_getLength64 :: proc(asset: ^AAsset) -> off64_t ---
|
||||
|
||||
/**
|
||||
* Report the total amount of asset data that can be read from the current position.
|
||||
*/
|
||||
AAsset_getRemainingLength :: proc(asset: ^AAsset) -> off_t ---
|
||||
|
||||
/**
|
||||
* Report the total amount of asset data that can be read from the current position.
|
||||
*
|
||||
* Uses a 64-bit number instead of a 32-bit number as AAsset_getRemainingLength does.
|
||||
*/
|
||||
AAsset_getRemainingLength64 :: proc(asset: ^AAsset) -> off64_t ---
|
||||
|
||||
/**
|
||||
* Open a new file descriptor that can be used to read the asset data. If the
|
||||
* start or length cannot be represented by a 32-bit number, it will be
|
||||
* truncated. If the file is large, use AAsset_openFileDescriptor64 instead.
|
||||
*
|
||||
* Returns < 0 if direct fd access is not possible (for example, if the asset is
|
||||
* compressed).
|
||||
*/
|
||||
AAsset_openFileDescriptor :: proc(asset: ^AAsset, outStart: ^off_t, outLength: ^off_t) -> i32 ---
|
||||
|
||||
/**
|
||||
* Open a new file descriptor that can be used to read the asset data.
|
||||
*
|
||||
* Uses a 64-bit number for the offset and length instead of 32-bit instead of
|
||||
* as AAsset_openFileDescriptor does.
|
||||
*
|
||||
* Returns < 0 if direct fd access is not possible (for example, if the asset is
|
||||
* compressed).
|
||||
*/
|
||||
AAsset_openFileDescriptor64 :: proc(asset: ^AAsset, outStart: ^off64_t, outLength: ^off64_t) -> i32 ---
|
||||
|
||||
/**
|
||||
* Returns whether this asset's internal buffer is allocated in ordinary RAM (i.e. not
|
||||
* mmapped).
|
||||
*/
|
||||
AAsset_isAllocated :: proc(asset: ^AAsset) -> i32 ---
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Given a Dalvik AssetManager object, obtain the corresponding native AAssetManager
|
||||
* object. Note that the caller is responsible for obtaining and holding a VM reference
|
||||
* to the jobject to prevent its being garbage collected while the native object is
|
||||
* in use.
|
||||
*/
|
||||
AAssetManager_fromJava :: proc(env: ^JNIEnv, assetManager: jobject) -> ^AAssetManager ---
|
||||
}
|
||||
+213
@@ -0,0 +1,213 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/** AndroidBitmap functions result code. */
|
||||
ABitmapResult :: enum i32 {
|
||||
SUCCESS = 0,
|
||||
BAD_PARAMETER = -1,
|
||||
JNI_EXCEPTION = -2,
|
||||
ALLOCATION_FAILED = -3,
|
||||
}
|
||||
|
||||
/** Bitmap pixel format. */
|
||||
AndroidBitmapFormat :: enum i32 {
|
||||
/** No format. */
|
||||
NONE = 0,
|
||||
/** Red: 8 bits, Green: 8 bits, Blue: 8 bits, Alpha: 8 bits. **/
|
||||
RGBA_8888 = 1,
|
||||
/** Red: 5 bits, Green: 6 bits, Blue: 5 bits. **/
|
||||
RGB_565 = 4,
|
||||
/** Deprecated in API level 13. Because of the poor quality of this configuration, it is advised to use ARGB_8888 instead. **/
|
||||
RGBA_4444 = 7,
|
||||
/** Alpha: 8 bits. */
|
||||
A_8 = 8,
|
||||
/** Each component is stored as a half float. **/
|
||||
RGBA_F16 = 9,
|
||||
/** Red: 10 bits, Green: 10 bits, Blue: 10 bits, Alpha: 2 bits. **/
|
||||
RGBA_1010102 = 10,
|
||||
}
|
||||
|
||||
/** Bitmap alpha format */
|
||||
AndroidBitmapFlagsAlpha :: enum {
|
||||
/** Pixel components are premultiplied by alpha. */
|
||||
PREMUL = 0,
|
||||
/** Pixels are opaque. */
|
||||
OPAQUE = 1,
|
||||
/** Pixel components are independent of alpha. */
|
||||
UNPREMUL = 2,
|
||||
/** Bit mask for BitmapInfo.flags to isolate the alpha. */
|
||||
MASK = 0x3,
|
||||
/** Shift for BitmapInfo.flags to isolate the alpha. */
|
||||
SHIFT = 0,
|
||||
}
|
||||
|
||||
AndroidBitmapFlags :: enum {
|
||||
/** If this bit is set in BitmapInfo.flags, the Bitmap uses the
|
||||
* HARDWARE Config, and its {@link AHardwareBuffer} can be retrieved via
|
||||
* {@link AndroidBitmap_getHardwareBuffer}.
|
||||
*/
|
||||
IS_HARDWARE = 1 << 31,
|
||||
}
|
||||
|
||||
// Note: these values match android.graphics.Bitmap#compressFormat.
|
||||
|
||||
/**
|
||||
* Specifies the formats that can be compressed to with
|
||||
* {@link AndroidBitmap_compress}.
|
||||
*/
|
||||
AndroidBitmapCompressFormat :: enum i32 {
|
||||
/**
|
||||
* Compress to the JPEG format. quality of 0 means
|
||||
* compress for the smallest size. 100 means compress for max
|
||||
* visual quality.
|
||||
*/
|
||||
JPEG = 0,
|
||||
/**
|
||||
* Compress to the PNG format. PNG is lossless, so quality is
|
||||
* ignored.
|
||||
*/
|
||||
PNG = 1,
|
||||
/**
|
||||
* Compress to the WEBP lossy format. quality of 0 means
|
||||
* compress for the smallest size. 100 means compress for max
|
||||
* visual quality.
|
||||
*/
|
||||
WEBP_LOSSY = 3,
|
||||
/**
|
||||
* Compress to the WEBP lossless format. quality refers to how
|
||||
* much effort to put into compression. A value of 0 means to
|
||||
* compress quickly, resulting in a relatively large file size.
|
||||
* 100 means to spend more time compressing, resulting in a
|
||||
* smaller file.
|
||||
*/
|
||||
WEBP_LOSSLESS = 4,
|
||||
}
|
||||
|
||||
/** Bitmap info, see AndroidBitmap_getInfo(). */
|
||||
BitmapInfo :: struct {
|
||||
/** The bitmap width in pixels. */
|
||||
width: u32,
|
||||
/** The bitmap height in pixels. */
|
||||
height: u32,
|
||||
/** The number of byte per row. */
|
||||
stride: u32,
|
||||
/** The bitmap pixel format. See {@link AndroidBitmapFormat} */
|
||||
format: AndroidBitmapFormat,
|
||||
/** Bitfield containing information about the bitmap.
|
||||
*
|
||||
* <p>Two bits are used to encode alpha. Use {@link AndroidBitmapFlagsAlpha.MASK}
|
||||
* and {@link AndroidBitmapFlagsAlpha.SHIFT} to retrieve them.</p>
|
||||
*
|
||||
* <p>One bit is used to encode whether the Bitmap uses the HARDWARE Config. Use
|
||||
* {@link AndroidBitmapFlags.IS_HARDWARE} to know.</p>
|
||||
*
|
||||
* <p>These flags were introduced in API level 30.</p>
|
||||
*/
|
||||
flags: u32,
|
||||
}
|
||||
|
||||
/**
|
||||
* User-defined function for writing the output of compression.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param userContext Pointer to user-defined data passed to
|
||||
* {@link AndroidBitmap_compress}.
|
||||
* @param data Compressed data of |size| bytes to write.
|
||||
* @param size Length in bytes of data to write.
|
||||
* @return Whether the operation succeeded.
|
||||
*/
|
||||
AndroidBitmap_CompressWriteFunc :: #type proc "c" (userContext: rawptr, data: rawptr, size: uint) -> bool
|
||||
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Given a java bitmap object, fill out the {@link BitmapInfo} struct for it.
|
||||
* If the call fails, the info parameter will be ignored.
|
||||
*/
|
||||
AndroidBitmap_getInfo :: proc(env: ^JNIEnv, jbitmap: jobject, info: ^BitmapInfo) -> ABitmapResult ---
|
||||
|
||||
/**
|
||||
* Given a java bitmap object, return its {@link ADataSpace}.
|
||||
*
|
||||
* Note that {@link ADataSpace} only exposes a few values. This may return
|
||||
* {@link ADATASPACE_UNKNOWN}, even for Named ColorSpaces, if they have no
|
||||
* corresponding ADataSpace.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AndroidBitmap_getDataSpace :: proc(env: ^JNIEnv, jbitmap: jobject) -> ADataSpace ---
|
||||
|
||||
/**
|
||||
* Given a java bitmap object, attempt to lock the pixel address.
|
||||
* Locking will ensure that the memory for the pixels will not move
|
||||
* until the unlockPixels call, and ensure that, if the pixels had been
|
||||
* previously purged, they will have been restored.
|
||||
*
|
||||
* If this call succeeds, it must be balanced by a call to
|
||||
* AndroidBitmap_unlockPixels, after which time the address of the pixels should
|
||||
* no longer be used.
|
||||
*
|
||||
* If this succeeds, *addrPtr will be set to the pixel address. If the call
|
||||
* fails, addrPtr will be ignored.
|
||||
*/
|
||||
AndroidBitmap_lockPixels :: proc(env: ^JNIEnv, jbitmap: jobject, addrPtr: ^rawptr) -> ABitmapResult ---
|
||||
|
||||
/**
|
||||
* Call this to balance a successful call to AndroidBitmap_lockPixels.
|
||||
*/
|
||||
AndroidBitmap_unlockPixels :: proc(env: ^JNIEnv, jbitmap: jobject) -> ABitmapResult ---
|
||||
|
||||
/**
|
||||
* Compress |pixels| as described by |info|.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param info Description of the pixels to compress.
|
||||
* @param dataspace {@link ADataSpace} describing the color space of the
|
||||
* pixels.
|
||||
* @param pixels Pointer to pixels to compress.
|
||||
* @param format {@link AndroidBitmapCompressFormat} to compress to.
|
||||
* @param quality Hint to the compressor, 0-100. The value is interpreted
|
||||
* differently depending on the
|
||||
* {@link AndroidBitmapCompressFormat}.
|
||||
* @param userContext User-defined data which will be passed to the supplied
|
||||
* {@link AndroidBitmap_CompressWriteFunc} each time it is
|
||||
* called. May be null.
|
||||
* @param fn Function that writes the compressed data. Will be called each time
|
||||
* the compressor has compressed more data that is ready to be
|
||||
* written. May be called more than once for each call to this method.
|
||||
* May not be null.
|
||||
* @return AndroidBitmap functions result code.
|
||||
*/
|
||||
AndroidBitmap_compress :: proc(
|
||||
info: ^BitmapInfo,
|
||||
dataspace: ADataSpace,
|
||||
pixels: rawptr,
|
||||
format: AndroidBitmapCompressFormat,
|
||||
quality: i32,
|
||||
userContext: rawptr,
|
||||
fn: AndroidBitmap_CompressWriteFunc) -> ABitmapResult ---
|
||||
|
||||
/**
|
||||
* Retrieve the native object associated with a HARDWARE Bitmap.
|
||||
*
|
||||
* Client must not modify it while a Bitmap is wrapping it.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param env Handle to the JNI environment pointer.
|
||||
* @param bitmap Handle to an android.graphics.Bitmap.
|
||||
* @param outBuffer On success, is set to a pointer to the
|
||||
* {@link AHardwareBuffer} associated with bitmap. This acquires
|
||||
* a reference on the buffer, and the client must call
|
||||
* {@link AHardwareBuffer_release} when finished with it.
|
||||
* @return AndroidBitmap functions result code.
|
||||
* {@link ANDROID_BITMAP_RESULT_BAD_PARAMETER} if bitmap is not a
|
||||
* HARDWARE Bitmap.
|
||||
*/
|
||||
AndroidBitmap_getHardwareBuffer :: proc(env: ^JNIEnv, bitmap: jobject, outBuffer: ^^AHardwareBuffer) -> ABitmapResult ---
|
||||
}
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/**
|
||||
* Opaque type that provides access to an AChoreographer object.
|
||||
*
|
||||
* A pointer can be obtained using {@link AChoreographer_getInstance()}.
|
||||
*/
|
||||
AChoreographer :: struct{}
|
||||
|
||||
/**
|
||||
* The identifier of a frame timeline.
|
||||
*/
|
||||
AVsyncId :: i64
|
||||
|
||||
/**
|
||||
* Opaque type that provides access to an AChoreographerFrameCallbackData object, which contains
|
||||
* various methods to extract frame information.
|
||||
*/
|
||||
AChoreographerFrameCallbackData :: struct{}
|
||||
|
||||
/**
|
||||
* Prototype of the function that is called when a new frame is being rendered.
|
||||
* It's passed the time that the frame is being rendered as nanoseconds in the
|
||||
* CLOCK_MONOTONIC time base, as well as the data pointer provided by the
|
||||
* application that registered a callback. All callbacks that run as part of
|
||||
* rendering a frame will observe the same frame time, so it should be used
|
||||
* whenever events need to be synchronized (e.g. animations).
|
||||
*/
|
||||
AChoreographer_frameCallback :: #type proc "c" (frameTimeNanos: c.long, data: rawptr)
|
||||
|
||||
/**
|
||||
* Prototype of the function that is called when a new frame is being rendered.
|
||||
* It's passed the time that the frame is being rendered as nanoseconds in the
|
||||
* CLOCK_MONOTONIC time base, as well as the data pointer provided by the
|
||||
* application that registered a callback. All callbacks that run as part of
|
||||
* rendering a frame will observe the same frame time, so it should be used
|
||||
* whenever events need to be synchronized (e.g. animations).
|
||||
*/
|
||||
AChoreographer_frameCallback64 :: #type proc "c" (frameTimeNanos: i64, data: rawptr)
|
||||
|
||||
/**
|
||||
* Prototype of the function that is called when a new frame is being rendered.
|
||||
* It is called with \c callbackData describing multiple frame timelines, as well as the \c data
|
||||
* pointer provided by the application that registered a callback. The \c callbackData does not
|
||||
* outlive the callback.
|
||||
*/
|
||||
AChoreographer_vsyncCallback :: #type proc "c" (callbackData: ^AChoreographerFrameCallbackData, data: rawptr)
|
||||
|
||||
/**
|
||||
* Prototype of the function that is called when the display refresh rate
|
||||
* changes. It's passed the new vsync period in nanoseconds, as well as the data
|
||||
* pointer provided by the application that registered a callback.
|
||||
*/
|
||||
AChoreographer_refreshRateCallback :: #type proc "c" (vsyncPeriodNanos: i64, data: rawptr)
|
||||
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Get the AChoreographer instance for the current thread. This must be called
|
||||
* on an ALooper thread.
|
||||
*
|
||||
* Available since API level 24.
|
||||
*/
|
||||
AChoreographer_getInstance :: proc() -> ^AChoreographer ---
|
||||
|
||||
/**
|
||||
* Deprecated: Use AChoreographer_postFrameCallback64 instead.
|
||||
* Deprecated since API level 29
|
||||
*/
|
||||
@(deprecated="Use AChoreographer_postFrameCallback64 instead")
|
||||
AChoreographer_postFrameCallback :: proc(choreographer: ^AChoreographer, callback: AChoreographer_frameCallback, data: rawptr) ---
|
||||
|
||||
/**
|
||||
* Deprecated: Use AChoreographer_postFrameCallbackDelayed64 instead.
|
||||
* Deprecated since API level 29
|
||||
*/
|
||||
@(deprecated="Use AChoreographer_postFrameCallbackDelayed64 instead")
|
||||
AChoreographer_postFrameCallbackDelayed :: proc(choreographer: ^AChoreographer, callback: AChoreographer_frameCallback, data: rawptr, delayMillis: c.long) ---
|
||||
|
||||
/**
|
||||
* Post a callback to be run on the next frame. The data pointer provided will
|
||||
* be passed to the callback function when it's called.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
AChoreographer_postFrameCallback64 :: proc(choreographer: ^AChoreographer, callback: AChoreographer_frameCallback64, data: rawptr) ---
|
||||
|
||||
/**
|
||||
* Post a callback to be run on the frame following the specified delay. The
|
||||
* data pointer provided will be passed to the callback function when it's
|
||||
* called.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
AChoreographer_postFrameCallbackDelayed64 :: proc(choreographer: ^AChoreographer, callback: AChoreographer_frameCallback64, data: rawptr, delayMillis: u32) ---
|
||||
|
||||
/**
|
||||
* Posts a callback to be run on the next frame. The data pointer provided will
|
||||
* be passed to the callback function when it's called.
|
||||
*
|
||||
* Available since API level 33.
|
||||
*/
|
||||
AChoreographer_postVsyncCallback :: proc(choreographer: ^AChoreographer, callback: AChoreographer_vsyncCallback, data: rawptr) ---
|
||||
|
||||
/**
|
||||
* Registers a callback to be run when the display refresh rate changes. The
|
||||
* data pointer provided will be passed to the callback function when it's
|
||||
* called. The same callback may be registered multiple times, provided that a
|
||||
* different data pointer is provided each time.
|
||||
*
|
||||
* If an application registers a callback for this choreographer instance when
|
||||
* no new callbacks were previously registered, that callback is guaranteed to
|
||||
* be dispatched. However, if the callback and associated data pointer are
|
||||
* unregistered prior to running the callback, then the callback may be silently
|
||||
* dropped.
|
||||
*
|
||||
* This api is thread-safe. Any thread is allowed to register a new refresh
|
||||
* rate callback for the choreographer instance.
|
||||
*
|
||||
* Note that in API level 30, this api is not guaranteed to be atomic with
|
||||
* DisplayManager. That is, calling Display#getRefreshRate very soon after
|
||||
* a refresh rate callback is invoked may return a stale refresh rate. If any
|
||||
* Display properties would be required by this callback, then it is recommended
|
||||
* to listen directly to DisplayManager.DisplayListener#onDisplayChanged events
|
||||
* instead.
|
||||
*
|
||||
* As of API level 31, this api is guaranteed to have a consistent view with DisplayManager
|
||||
* Display#getRefreshRate is guaranteed to not return a stale refresh rate when invoked from this
|
||||
* callback.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AChoreographer_registerRefreshRateCallback :: proc(choreographer: ^AChoreographer, callback: AChoreographer_refreshRateCallback, data: rawptr) ---
|
||||
|
||||
/**
|
||||
* Unregisters a callback to be run when the display refresh rate changes, along
|
||||
* with the data pointer previously provided when registering the callback. The
|
||||
* callback is only unregistered when the data pointer matches one that was
|
||||
* previously registered.
|
||||
*
|
||||
* This api is thread-safe. Any thread is allowed to unregister an existing
|
||||
* refresh rate callback for the choreographer instance. When a refresh rate
|
||||
* callback and associated data pointer are unregistered, then there is a
|
||||
* guarantee that when the unregistration completes that that callback will not
|
||||
* be run with the data pointer passed.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AChoreographer_unregisterRefreshRateCallback :: proc(choreographer: ^AChoreographer, callback: AChoreographer_refreshRateCallback, data: rawptr) ---
|
||||
|
||||
/**
|
||||
* The time in nanoseconds at which the frame started being rendered.
|
||||
*
|
||||
* Note that this time should \b not be used to advance animation clocks.
|
||||
* Instead, see AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos().
|
||||
*/
|
||||
AChoreographerFrameCallbackData_getFrameTimeNanos :: proc(data: ^AChoreographerFrameCallbackData) -> i64 ---
|
||||
|
||||
/**
|
||||
* The number of possible frame timelines.
|
||||
*/
|
||||
AChoreographerFrameCallbackData_getFrameTimelinesLength :: proc(data: ^AChoreographerFrameCallbackData) -> uint ---
|
||||
|
||||
/**
|
||||
* Gets the index of the platform-preferred frame timeline.
|
||||
* The preferred frame timeline is the default
|
||||
* by which the platform scheduled the app, based on the device configuration.
|
||||
*/
|
||||
AChoreographerFrameCallbackData_getPreferredFrameTimelineIndex :: proc(data: ^AChoreographerFrameCallbackData) -> uint ---
|
||||
|
||||
/**
|
||||
* Gets the token used by the platform to identify the frame timeline at the given \c index.
|
||||
*
|
||||
* \param index index of a frame timeline, in \f( [0, FrameTimelinesLength) \f). See
|
||||
* AChoreographerFrameCallbackData_getFrameTimelinesLength()
|
||||
*/
|
||||
AChoreographerFrameCallbackData_getFrameTimelineVsyncId :: proc(data: ^AChoreographerFrameCallbackData, index: uint) -> AVsyncId ---
|
||||
|
||||
/**
|
||||
* Gets the time in nanoseconds at which the frame described at the given \c index is expected to
|
||||
* be presented. This time should be used to advance any animation clocks.
|
||||
*
|
||||
* \param index index of a frame timeline, in \f( [0, FrameTimelinesLength) \f). See
|
||||
* AChoreographerFrameCallbackData_getFrameTimelinesLength()
|
||||
*/
|
||||
AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos :: proc(data: ^AChoreographerFrameCallbackData, index: uint) -> i64 ---
|
||||
|
||||
/**
|
||||
* Gets the time in nanoseconds at which the frame described at the given \c index needs to be
|
||||
* ready by in order to be presented on time.
|
||||
*
|
||||
* \param index index of a frame timeline, in \f( [0, FrameTimelinesLength) \f). See
|
||||
* AChoreographerFrameCallbackData_getFrameTimelinesLength()
|
||||
*/
|
||||
AChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos :: proc(data: ^AChoreographerFrameCallbackData, index: uint) -> i64 ---
|
||||
}
|
||||
@@ -0,0 +1,713 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/** Orientation: not specified. */
|
||||
ORIENTATION_ANY :: 0x0000
|
||||
/**
|
||||
* Orientation: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#OrientationQualifier">port</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
ORIENTATION_PORT :: 0x0001
|
||||
/**
|
||||
* Orientation: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#OrientationQualifier">land</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
ORIENTATION_LAND :: 0x0002
|
||||
/** @deprecated Not currently supported or used. */
|
||||
ORIENTATION_SQUARE :: 0x0003
|
||||
|
||||
/** Touchscreen: not specified. */
|
||||
TOUCHSCREEN_ANY :: 0x0000
|
||||
/**
|
||||
* Touchscreen: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#TouchscreenQualifier">notouch</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
TOUCHSCREEN_NOTOUCH :: 0x0001
|
||||
/** @deprecated Not currently supported or used. */
|
||||
TOUCHSCREEN_STYLUS :: 0x0002
|
||||
/**
|
||||
* Touchscreen: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#TouchscreenQualifier">finger</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
TOUCHSCREEN_FINGER :: 0x0003
|
||||
|
||||
/** Density: default density. */
|
||||
DENSITY_DEFAULT :: 0
|
||||
/**
|
||||
* Density: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">ldpi</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
DENSITY_LOW :: 120
|
||||
/**
|
||||
* Density: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">mdpi</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
DENSITY_MEDIUM :: 160
|
||||
/**
|
||||
* Density: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">tvdpi</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
DENSITY_TV :: 213
|
||||
/**
|
||||
* Density: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">hdpi</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
DENSITY_HIGH :: 240
|
||||
/**
|
||||
* Density: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">xhdpi</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
DENSITY_XHIGH :: 320
|
||||
/**
|
||||
* Density: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">xxhdpi</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
DENSITY_XXHIGH :: 480
|
||||
/**
|
||||
* Density: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">xxxhdpi</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
DENSITY_XXXHIGH :: 640
|
||||
/** Density: any density. */
|
||||
DENSITY_ANY :: 0xfffe
|
||||
/** Density: no density specified. */
|
||||
DENSITY_NONE :: 0xffff
|
||||
|
||||
/** Keyboard: not specified. */
|
||||
KEYBOARD_ANY :: 0x0000
|
||||
/**
|
||||
* Keyboard: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ImeQualifier">nokeys</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
KEYBOARD_NOKEYS :: 0x0001
|
||||
/**
|
||||
* Keyboard: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ImeQualifier">qwerty</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
KEYBOARD_QWERTY :: 0x0002
|
||||
/**
|
||||
* Keyboard: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ImeQualifier">12key</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
KEYBOARD_12KEY :: 0x0003
|
||||
|
||||
/** Navigation: not specified. */
|
||||
NAVIGATION_ANY :: 0x0000
|
||||
/**
|
||||
* Navigation: value corresponding to the
|
||||
* <a href::"@/guide/topics/resources/providing-resources.html#NavigationQualifier">nonav</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
NAVIGATION_NONAV :: 0x0001
|
||||
/**
|
||||
* Navigation: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NavigationQualifier">dpad</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
NAVIGATION_DPAD :: 0x0002
|
||||
/**
|
||||
* Navigation: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NavigationQualifier">trackball</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
NAVIGATION_TRACKBALL :: 0x0003
|
||||
/**
|
||||
* Navigation: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NavigationQualifier">wheel</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
NAVIGATION_WHEEL :: 0x0004
|
||||
|
||||
/** Keyboard availability: not specified. */
|
||||
KEYSHIDDEN_ANY :: 0x0000
|
||||
/**
|
||||
* Keyboard availability: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#KeyboardAvailQualifier">keysexposed</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
KEYSHIDDEN_NO :: 0x0001
|
||||
/**
|
||||
* Keyboard availability: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#KeyboardAvailQualifier">keyshidden</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
KEYSHIDDEN_YES :: 0x0002
|
||||
/**
|
||||
* Keyboard availability: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#KeyboardAvailQualifier">keyssoft</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
KEYSHIDDEN_SOFT :: 0x0003
|
||||
|
||||
/** Navigation availability: not specified. */
|
||||
NAVHIDDEN_ANY :: 0x0000
|
||||
/**
|
||||
* Navigation availability: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NavAvailQualifier">navexposed</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
NAVHIDDEN_NO :: 0x0001
|
||||
/**
|
||||
* Navigation availability: value corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NavAvailQualifier">navhidden</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
NAVHIDDEN_YES :: 0x0002
|
||||
|
||||
/** Screen size: not specified. */
|
||||
SCREENSIZE_ANY :: 0x00
|
||||
/**
|
||||
* Screen size: value indicating the screen is at least
|
||||
* approximately 320x426 dp units corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ScreenSizeQualifier">small</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
SCREENSIZE_SMALL :: 0x01
|
||||
/**
|
||||
* Screen size: value indicating the screen is at least
|
||||
* approximately 320x470 dp units corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ScreenSizeQualifier">normal</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
SCREENSIZE_NORMAL :: 0x02
|
||||
/**
|
||||
* Screen size: value indicating the screen is at least
|
||||
* approximately 480x640 dp units corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ScreenSizeQualifier">large</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
SCREENSIZE_LARGE :: 0x03
|
||||
/**
|
||||
* Screen size: value indicating the screen is at least
|
||||
* approximately 720x960 dp units corresponding to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ScreenSizeQualifier">xlarge</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
SCREENSIZE_XLARGE :: 0x04
|
||||
|
||||
/** Screen layout: not specified. */
|
||||
SCREENLONG_ANY :: 0x00
|
||||
/**
|
||||
* Screen layout: value that corresponds to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ScreenAspectQualifier">notlong</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
SCREENLONG_NO :: 0x1
|
||||
/**
|
||||
* Screen layout: value that corresponds to the
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ScreenAspectQualifier">long</a>
|
||||
* resource qualifier.
|
||||
*/
|
||||
SCREENLONG_YES :: 0x2
|
||||
|
||||
SCREENROUND_ANY :: 0x00
|
||||
SCREENROUND_NO :: 0x1
|
||||
SCREENROUND_YES :: 0x2
|
||||
|
||||
/** Wide color gamut: not specified. */
|
||||
WIDE_COLOR_GAMUT_ANY :: 0x00
|
||||
/**
|
||||
* Wide color gamut: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#WideColorGamutQualifier">no
|
||||
* nowidecg</a> resource qualifier specified.
|
||||
*/
|
||||
WIDE_COLOR_GAMUT_NO :: 0x1
|
||||
/**
|
||||
* Wide color gamut: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#WideColorGamutQualifier">
|
||||
* widecg</a> resource qualifier specified.
|
||||
*/
|
||||
WIDE_COLOR_GAMUT_YES :: 0x2
|
||||
|
||||
/** HDR: not specified. */
|
||||
HDR_ANY :: 0x00
|
||||
/**
|
||||
* HDR: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#HDRQualifier">
|
||||
* lowdr</a> resource qualifier specified.
|
||||
*/
|
||||
HDR_NO :: 0x1
|
||||
/**
|
||||
* HDR: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#HDRQualifier">
|
||||
* highdr</a> resource qualifier specified.
|
||||
*/
|
||||
HDR_YES :: 0x2
|
||||
|
||||
/** UI mode: not specified. */
|
||||
UI_MODE_TYPE_ANY :: 0x00
|
||||
/**
|
||||
* UI mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">no
|
||||
* UI mode type</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_TYPE_NORMAL :: 0x01
|
||||
/**
|
||||
* UI mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">desk</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_TYPE_DESK :: 0x02
|
||||
/**
|
||||
* UI mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">car</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_TYPE_CAR :: 0x03
|
||||
/**
|
||||
* UI mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">television</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_TYPE_TELEVISION :: 0x04
|
||||
/**
|
||||
* UI mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">appliance</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_TYPE_APPLIANCE :: 0x05
|
||||
/**
|
||||
* UI mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">watch</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_TYPE_WATCH :: 0x06
|
||||
/**
|
||||
* UI mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">vr</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_TYPE_VR_HEADSET :: 0x07
|
||||
|
||||
/** UI night mode: not specified.*/
|
||||
UI_MODE_NIGHT_ANY :: 0x00
|
||||
/**
|
||||
* UI night mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NightQualifier">notnight</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_NIGHT_NO :: 0x1
|
||||
/**
|
||||
* UI night mode: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NightQualifier">night</a> resource qualifier specified.
|
||||
*/
|
||||
UI_MODE_NIGHT_YES :: 0x2
|
||||
|
||||
/** Screen width DPI: not specified. */
|
||||
SCREEN_WIDTH_DP_ANY :: 0x0000
|
||||
|
||||
/** Screen height DPI: not specified. */
|
||||
SCREEN_HEIGHT_DP_ANY :: 0x0000
|
||||
|
||||
/** Smallest screen width DPI: not specified.*/
|
||||
SMALLEST_SCREEN_WIDTH_DP_ANY :: 0x0000
|
||||
|
||||
/** Layout direction: not specified. */
|
||||
LAYOUTDIR_ANY :: 0x00
|
||||
/**
|
||||
* Layout direction: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#LayoutDirectionQualifier">ldltr</a> resource qualifier specified.
|
||||
*/
|
||||
LAYOUTDIR_LTR :: 0x01
|
||||
/**
|
||||
* Layout direction: value that corresponds to
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#LayoutDirectionQualifier">ldrtl</a> resource qualifier specified.
|
||||
*/
|
||||
LAYOUTDIR_RTL :: 0x02
|
||||
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#MccQualifier">mcc</a>
|
||||
* configuration.
|
||||
*/
|
||||
MCC :: 0x0001
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#MccQualifier">mnc</a>
|
||||
* configuration.
|
||||
*/
|
||||
MNC :: 0x0002
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#LocaleQualifier">locale</a>
|
||||
* configuration.
|
||||
*/
|
||||
LOCALE :: 0x0004
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#TouchscreenQualifier">touchscreen</a>
|
||||
* configuration.
|
||||
*/
|
||||
TOUCHSCREEN :: 0x0008
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ImeQualifier">keyboard</a>
|
||||
* configuration.
|
||||
*/
|
||||
KEYBOARD :: 0x0010
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#KeyboardAvailQualifier">keyboardHidden</a>
|
||||
* configuration.
|
||||
*/
|
||||
KEYBOARD_HIDDEN :: 0x0020
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#NavigationQualifier">navigation</a>
|
||||
* configuration.
|
||||
*/
|
||||
NAVIGATION :: 0x0040
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#OrientationQualifier">orientation</a>
|
||||
* configuration.
|
||||
*/
|
||||
ORIENTATION :: 0x0080
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#DensityQualifier">density</a>
|
||||
* configuration.
|
||||
*/
|
||||
DENSITY :: 0x0100
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#ScreenSizeQualifier">screen size</a>
|
||||
* configuration.
|
||||
*/
|
||||
SCREEN_SIZE :: 0x0200
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#VersionQualifier">platform version</a>
|
||||
* configuration.
|
||||
*/
|
||||
VERSION :: 0x0400
|
||||
/**
|
||||
* Bit mask for screen layout configuration.
|
||||
*/
|
||||
SCREEN_LAYOUT :: 0x0800
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#UiModeQualifier">ui mode</a>
|
||||
* configuration.
|
||||
*/
|
||||
UI_MODE :: 0x1000
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#SmallestScreenWidthQualifier">smallest screen width</a>
|
||||
* configuration.
|
||||
*/
|
||||
SMALLEST_SCREEN_SIZE :: 0x2000
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#LayoutDirectionQualifier">layout direction</a>
|
||||
* configuration.
|
||||
*/
|
||||
LAYOUTDIR :: 0x4000
|
||||
SCREEN_ROUND :: 0x8000
|
||||
/**
|
||||
* Bit mask for
|
||||
* <a href::"/guide/topics/resources/providing-resources.html#WideColorGamutQualifier">wide color gamut</a>
|
||||
* and <a href::"/guide/topics/resources/providing-resources.html#HDRQualifier">HDR</a> configurations.
|
||||
*/
|
||||
COLOR_MODE :: 0x10000
|
||||
/**
|
||||
* Constant used to to represent MNC (Mobile Network Code) zero.
|
||||
* 0 cannot be used since it is used to represent an undefined MNC.
|
||||
*/
|
||||
MNC_ZERO :: 0xffff
|
||||
|
||||
|
||||
/**
|
||||
* {@link AConfiguration} is an opaque type used to get and set
|
||||
* various subsystem configurations.
|
||||
*
|
||||
* A {@link AConfiguration} pointer can be obtained using:
|
||||
* - AConfiguration_new()
|
||||
* - AConfiguration_fromAssetManager()
|
||||
*/
|
||||
AConfiguration :: struct{}
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Create a new AConfiguration, initialized with no values set.
|
||||
*/
|
||||
AConfiguration_new :: proc() -> ^AConfiguration ---
|
||||
|
||||
/**
|
||||
* Free an AConfiguration that was previously created with
|
||||
* AConfiguration_new().
|
||||
*/
|
||||
AConfiguration_delete :: proc(config: ^AConfiguration) ---
|
||||
|
||||
/**
|
||||
* Create and return a new AConfiguration based on the current configuration in
|
||||
* use in the given {@link AAssetManager}.
|
||||
*/
|
||||
AConfiguration_fromAssetManager :: proc(out: ^AConfiguration, am: ^AAssetManager) ---
|
||||
|
||||
/**
|
||||
* Copy the contents of 'src' to 'dest'.
|
||||
*/
|
||||
AConfiguration_copy :: proc(dest: ^AConfiguration, src: ^AConfiguration) ---
|
||||
|
||||
/**
|
||||
* Return the current MCC set in the configuration. 0 if not set.
|
||||
*/
|
||||
AConfiguration_getMcc :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current MCC in the configuration. 0 to clear.
|
||||
*/
|
||||
AConfiguration_setMcc :: proc(config: ^AConfiguration, mcc: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current MNC set in the configuration. 0 if not set.
|
||||
*/
|
||||
AConfiguration_getMnc :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current MNC in the configuration. 0 to clear.
|
||||
*/
|
||||
AConfiguration_setMnc :: proc(config: ^AConfiguration, mnc: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current language code set in the configuration. The output will
|
||||
* be filled with an array of two characters. They are not 0-terminated. If
|
||||
* a language is not set, they will be 0.
|
||||
*/
|
||||
AConfiguration_getLanguage :: proc(config: ^AConfiguration, outLanguage: [^]byte) ---
|
||||
|
||||
/**
|
||||
* Set the current language code in the configuration, from the first two
|
||||
* characters in the string.
|
||||
*/
|
||||
AConfiguration_setLanguage :: proc(config: ^AConfiguration, language: cstring) ---
|
||||
|
||||
/**
|
||||
* Return the current country code set in the configuration. The output will
|
||||
* be filled with an array of two characters. They are not 0-terminated. If
|
||||
* a country is not set, they will be 0.
|
||||
*/
|
||||
AConfiguration_getCountry :: proc(config: ^AConfiguration, outCountry: [^]byte) ---
|
||||
|
||||
/**
|
||||
* Set the current country code in the configuration, from the first two
|
||||
* characters in the string.
|
||||
*/
|
||||
AConfiguration_setCountry :: proc(config: ^AConfiguration, country: cstring) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getOrientation :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current orientation in the configuration.
|
||||
*/
|
||||
AConfiguration_setOrientation :: proc(config: ^AConfiguration, orientation: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getTouchscreen :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current touchscreen in the configuration.
|
||||
*/
|
||||
AConfiguration_setTouchscreen :: proc(config: ^AConfiguration, touchscreen: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_DENSITY_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getDensity :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current density in the configuration.
|
||||
*/
|
||||
AConfiguration_setDensity :: proc(config: ^AConfiguration, density: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getKeyboard :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current keyboard in the configuration.
|
||||
*/
|
||||
AConfiguration_setKeyboard :: proc(config: ^AConfiguration, keyboard: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getNavigation :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current navigation in the configuration.
|
||||
*/
|
||||
AConfiguration_setNavigation :: proc(config: ^AConfiguration, navigation: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getKeysHidden :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current keys hidden in the configuration.
|
||||
*/
|
||||
AConfiguration_setKeysHidden :: proc(config: ^AConfiguration, keysHidden: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getNavHidden :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current nav hidden in the configuration.
|
||||
*/
|
||||
AConfiguration_setNavHidden :: proc(config: ^AConfiguration, navHidden: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current SDK (API) version set in the configuration.
|
||||
*/
|
||||
AConfiguration_getSdkVersion :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current SDK version in the configuration.
|
||||
*/
|
||||
AConfiguration_setSdkVersion :: proc(config: ^AConfiguration, sdkVersion: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getScreenSize :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current screen size in the configuration.
|
||||
*/
|
||||
AConfiguration_setScreenSize :: proc(config: ^AConfiguration, screenSize: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getScreenLong :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current screen long in the configuration.
|
||||
*/
|
||||
AConfiguration_setScreenLong :: proc(config: ^AConfiguration, screenLong: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_SCREENROUND_* set in the configuration.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AConfiguration_getScreenRound :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current screen round in the configuration.
|
||||
*/
|
||||
AConfiguration_setScreenRound :: proc(config: ^AConfiguration, screenRound: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getUiModeType :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current UI mode type in the configuration.
|
||||
*/
|
||||
AConfiguration_setUiModeType :: proc(config: ^AConfiguration, uiModeType: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
|
||||
*/
|
||||
AConfiguration_getUiModeNight :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the current UI mode night in the configuration.
|
||||
*/
|
||||
AConfiguration_setUiModeNight :: proc(config: ^AConfiguration, uiModeNight: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current configuration screen width in dp units, or
|
||||
* ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
|
||||
*/
|
||||
AConfiguration_getScreenWidthDp :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the configuration's current screen width in dp units.
|
||||
*/
|
||||
AConfiguration_setScreenWidthDp :: proc(config: ^AConfiguration, value: i32) ---
|
||||
|
||||
/**
|
||||
* Return the current configuration screen height in dp units, or
|
||||
* ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
|
||||
*/
|
||||
AConfiguration_getScreenHeightDp :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the configuration's current screen width in dp units.
|
||||
*/
|
||||
AConfiguration_setScreenHeightDp :: proc(config: ^AConfiguration, value: i32) ---
|
||||
|
||||
/**
|
||||
* Return the configuration's smallest screen width in dp units, or
|
||||
* ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
|
||||
*/
|
||||
AConfiguration_getSmallestScreenWidthDp :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the configuration's smallest screen width in dp units.
|
||||
*/
|
||||
AConfiguration_setSmallestScreenWidthDp :: proc(config: ^AConfiguration, value: i32) ---
|
||||
|
||||
/**
|
||||
* Return the configuration's layout direction, or
|
||||
* ACONFIGURATION_LAYOUTDIR_ANY if not set.
|
||||
*
|
||||
* Available since API level 17.
|
||||
*/
|
||||
AConfiguration_getLayoutDirection :: proc(config: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Set the configuration's layout direction.
|
||||
*
|
||||
* Available since API level 17.
|
||||
*/
|
||||
AConfiguration_setLayoutDirection :: proc(config: ^AConfiguration, value: i32) ---
|
||||
|
||||
/**
|
||||
* Perform a diff between two configurations. Returns a bit mask of
|
||||
* ACONFIGURATION_* constants, each bit set meaning that configuration element
|
||||
* is different between them.
|
||||
*/
|
||||
AConfiguration_diff :: proc(config1: ^AConfiguration, config2: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Determine whether 'base' is a valid configuration for use within the
|
||||
* environment 'requested'. Returns 0 if there are any values in 'base'
|
||||
* that conflict with 'requested'. Returns 1 if it does not conflict.
|
||||
*/
|
||||
AConfiguration_match :: proc(base: ^AConfiguration, requested: ^AConfiguration) -> i32 ---
|
||||
|
||||
/**
|
||||
* Determine whether the configuration in 'test' is better than the existing
|
||||
* configuration in 'base'. If 'requested' is non-NULL, this decision is based
|
||||
* on the overall configuration given there. If it is NULL, this decision is
|
||||
* simply based on which configuration is more specific. Returns non-0 if
|
||||
* 'test' is better than 'base'.
|
||||
*
|
||||
* This assumes you have already filtered the configurations with
|
||||
* AConfiguration_match().
|
||||
*/
|
||||
AConfiguration_isBetterThan :: proc(base: ^AConfiguration, test: ^AConfiguration, requested: ^AConfiguration) -> i32 ---
|
||||
}
|
||||
+527
@@ -0,0 +1,527 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
/**
|
||||
* ADataSpace.
|
||||
*/
|
||||
ADataSpace :: enum i32 {
|
||||
/**
|
||||
* Default-assumption data space, when not explicitly specified.
|
||||
*
|
||||
* It is safest to assume the buffer is an image with sRGB primaries and
|
||||
* encoding ranges, but the consumer and/or the producer of the data may
|
||||
* simply be using defaults. No automatic gamma transform should be
|
||||
* expected, except for a possible display gamma transform when drawn to a
|
||||
* screen.
|
||||
*/
|
||||
UNKNOWN = 0,
|
||||
|
||||
/**
|
||||
* Color-description aspects
|
||||
*
|
||||
* The following aspects define various characteristics of the color
|
||||
* specification. These represent bitfields, so that a data space value
|
||||
* can specify each of them independently.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Standard aspect
|
||||
*
|
||||
* Defines the chromaticity coordinates of the source primaries in terms of
|
||||
* the CIE 1931 definition of x and y specified in ISO 11664-1.
|
||||
*/
|
||||
STANDARD_MASK = 63 << 16,
|
||||
|
||||
/**
|
||||
* Chromacity coordinates are unknown or are determined by the application.
|
||||
* Implementations shall use the following suggested standards:
|
||||
*
|
||||
* All YCbCr formats: BT709 if size is 720p or larger (since most video
|
||||
* content is letterboxed this corresponds to width is
|
||||
* 1280 or greater, or height is 720 or greater).
|
||||
* BT601_625 if size is smaller than 720p or is JPEG.
|
||||
* All RGB formats: BT709.
|
||||
*
|
||||
* For all other formats standard is undefined, and implementations should use
|
||||
* an appropriate standard for the data represented.
|
||||
*/
|
||||
STANDARD_UNSPECIFIED = 0 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.300 0.600
|
||||
* blue 0.150 0.060
|
||||
* red 0.640 0.330
|
||||
* white (D65) 0.3127 0.3290
|
||||
*
|
||||
* Use the unadjusted KR = 0.2126, KB = 0.0722 luminance interpretation
|
||||
* for RGB conversion.
|
||||
*/
|
||||
STANDARD_BT709 = 1 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.290 0.600
|
||||
* blue 0.150 0.060
|
||||
* red 0.640 0.330
|
||||
* white (D65) 0.3127 0.3290
|
||||
*
|
||||
* KR = 0.299, KB = 0.114. This adjusts the luminance interpretation
|
||||
* for RGB conversion from the one purely determined by the primaries
|
||||
* to minimize the color shift into RGB space that uses BT.709
|
||||
* primaries.
|
||||
*/
|
||||
STANDARD_BT601_625 = 2 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.290 0.600
|
||||
* blue 0.150 0.060
|
||||
* red 0.640 0.330
|
||||
* white (D65) 0.3127 0.3290
|
||||
*
|
||||
* Use the unadjusted KR = 0.222, KB = 0.071 luminance interpretation
|
||||
* for RGB conversion.
|
||||
*/
|
||||
STANDARD_BT601_625_UNADJUSTED = 3 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.310 0.595
|
||||
* blue 0.155 0.070
|
||||
* red 0.630 0.340
|
||||
* white (D65) 0.3127 0.3290
|
||||
*
|
||||
* KR = 0.299, KB = 0.114. This adjusts the luminance interpretation
|
||||
* for RGB conversion from the one purely determined by the primaries
|
||||
* to minimize the color shift into RGB space that uses BT.709
|
||||
* primaries.
|
||||
*/
|
||||
STANDARD_BT601_525 = 4 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.310 0.595
|
||||
* blue 0.155 0.070
|
||||
* red 0.630 0.340
|
||||
* white (D65) 0.3127 0.3290
|
||||
*
|
||||
* Use the unadjusted KR = 0.212, KB = 0.087 luminance interpretation
|
||||
* for RGB conversion (as in SMPTE 240M).
|
||||
*/
|
||||
STANDARD_BT601_525_UNADJUSTED = 5 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.170 0.797
|
||||
* blue 0.131 0.046
|
||||
* red 0.708 0.292
|
||||
* white (D65) 0.3127 0.3290
|
||||
*
|
||||
* Use the unadjusted KR = 0.2627, KB = 0.0593 luminance interpretation
|
||||
* for RGB conversion.
|
||||
*/
|
||||
STANDARD_BT2020 = 6 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.170 0.797
|
||||
* blue 0.131 0.046
|
||||
* red 0.708 0.292
|
||||
* white (D65) 0.3127 0.3290
|
||||
*
|
||||
* Use the unadjusted KR = 0.2627, KB = 0.0593 luminance interpretation
|
||||
* for RGB conversion using the linear domain.
|
||||
*/
|
||||
STANDARD_BT2020_CONSTANT_LUMINANCE = 7 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.21 0.71
|
||||
* blue 0.14 0.08
|
||||
* red 0.67 0.33
|
||||
* white (C) 0.310 0.316
|
||||
*
|
||||
* Use the unadjusted KR = 0.30, KB = 0.11 luminance interpretation
|
||||
* for RGB conversion.
|
||||
*/
|
||||
STANDARD_BT470M = 8 << 16,
|
||||
|
||||
/**
|
||||
* Primaries: x y
|
||||
* green 0.243 0.692
|
||||
* blue 0.145 0.049
|
||||
* red 0.681 0.319
|
||||
* white (C) 0.310 0.316
|
||||
*
|
||||
* Use the unadjusted KR = 0.254, KB = 0.068 luminance interpretation
|
||||
* for RGB conversion.
|
||||
*/
|
||||
STANDARD_FILM = 9 << 16,
|
||||
|
||||
/**
|
||||
* SMPTE EG 432-1 and SMPTE RP 431-2. (DCI-P3)
|
||||
* Primaries: x y
|
||||
* green 0.265 0.690
|
||||
* blue 0.150 0.060
|
||||
* red 0.680 0.320
|
||||
* white (D65) 0.3127 0.3290
|
||||
*/
|
||||
STANDARD_DCI_P3 = 10 << 16,
|
||||
|
||||
/**
|
||||
* Adobe RGB
|
||||
* Primaries: x y
|
||||
* green 0.210 0.710
|
||||
* blue 0.150 0.060
|
||||
* red 0.640 0.330
|
||||
* white (D65) 0.3127 0.3290
|
||||
*/
|
||||
STANDARD_ADOBE_RGB = 11 << 16,
|
||||
|
||||
/**
|
||||
* Transfer aspect
|
||||
*
|
||||
* Transfer characteristics are the opto-electronic transfer characteristic
|
||||
* at the source as a function of linear optical intensity (luminance).
|
||||
*
|
||||
* For digital signals, E corresponds to the recorded value. Normally, the
|
||||
* transfer function is applied in RGB space to each of the R, G and B
|
||||
* components independently. This may result in color shift that can be
|
||||
* minized by applying the transfer function in Lab space only for the L
|
||||
* component. Implementation may apply the transfer function in RGB space
|
||||
* for all pixel formats if desired.
|
||||
*/
|
||||
TRANSFER_MASK = 31 << 22,
|
||||
|
||||
/**
|
||||
* Transfer characteristics are unknown or are determined by the
|
||||
* application.
|
||||
*
|
||||
* Implementations should use the following transfer functions:
|
||||
*
|
||||
* For YCbCr formats: use TRANSFER_SMPTE_170M
|
||||
* For RGB formats: use TRANSFER_SRGB
|
||||
*
|
||||
* For all other formats transfer function is undefined, and implementations
|
||||
* should use an appropriate standard for the data represented.
|
||||
*/
|
||||
TRANSFER_UNSPECIFIED = 0 << 22,
|
||||
|
||||
/**
|
||||
* Transfer characteristic curve:
|
||||
* E = L
|
||||
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_LINEAR = 1 << 22,
|
||||
|
||||
/**
|
||||
* Transfer characteristic curve:
|
||||
*
|
||||
* E = 1.055 * L^(1/2.4) - 0.055 for 0.0031308 <= L <= 1
|
||||
* = 12.92 * L for 0 <= L < 0.0031308
|
||||
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_SRGB = 2 << 22,
|
||||
|
||||
/**
|
||||
* BT.601 525, BT.601 625, BT.709, BT.2020
|
||||
*
|
||||
* Transfer characteristic curve:
|
||||
* E = 1.099 * L ^ 0.45 - 0.099 for 0.018 <= L <= 1
|
||||
* = 4.500 * L for 0 <= L < 0.018
|
||||
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_SMPTE_170M = 3 << 22,
|
||||
|
||||
/**
|
||||
* Assumed display gamma 2.2.
|
||||
*
|
||||
* Transfer characteristic curve:
|
||||
* E = L ^ (1/2.2)
|
||||
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_GAMMA2_2 = 4 << 22,
|
||||
|
||||
/**
|
||||
* display gamma 2.6.
|
||||
*
|
||||
* Transfer characteristic curve:
|
||||
* E = L ^ (1/2.6)
|
||||
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_GAMMA2_6 = 5 << 22,
|
||||
|
||||
/**
|
||||
* display gamma 2.8.
|
||||
*
|
||||
* Transfer characteristic curve:
|
||||
* E = L ^ (1/2.8)
|
||||
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_GAMMA2_8 = 6 << 22,
|
||||
|
||||
/**
|
||||
* SMPTE ST 2084 (Dolby Perceptual Quantizer)
|
||||
*
|
||||
* Transfer characteristic curve:
|
||||
* E = ((c1 + c2 * L^n) / (1 + c3 * L^n)) ^ m
|
||||
* c1 = c3 - c2 + 1 = 3424 / 4096 = 0.8359375
|
||||
* c2 = 32 * 2413 / 4096 = 18.8515625
|
||||
* c3 = 32 * 2392 / 4096 = 18.6875
|
||||
* m = 128 * 2523 / 4096 = 78.84375
|
||||
* n = 0.25 * 2610 / 4096 = 0.1593017578125
|
||||
* L - luminance of image 0 <= L <= 1 for HDR colorimetry.
|
||||
* L = 1 corresponds to 10000 cd/m2
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_ST2084 = 7 << 22,
|
||||
|
||||
/**
|
||||
* ARIB STD-B67 Hybrid Log Gamma
|
||||
*
|
||||
* Transfer characteristic curve:
|
||||
* E = r * L^0.5 for 0 <= L <= 1
|
||||
* = a * ln(L - b) + c for 1 < L
|
||||
* a = 0.17883277
|
||||
* b = 0.28466892
|
||||
* c = 0.55991073
|
||||
* r = 0.5
|
||||
* L - luminance of image 0 <= L for HDR colorimetry. L = 1 corresponds
|
||||
* to reference white level of 100 cd/m2
|
||||
* E - corresponding electrical signal
|
||||
*/
|
||||
TRANSFER_HLG = 8 << 22,
|
||||
|
||||
/**
|
||||
* Range aspect
|
||||
*
|
||||
* Defines the range of values corresponding to the unit range of 0-1.
|
||||
* This is defined for YCbCr only, but can be expanded to RGB space.
|
||||
*/
|
||||
RANGE_MASK = 7 << 27,
|
||||
|
||||
/**
|
||||
* Range is unknown or are determined by the application. Implementations
|
||||
* shall use the following suggested ranges:
|
||||
*
|
||||
* All YCbCr formats: limited range.
|
||||
* All RGB or RGBA formats (including RAW and Bayer): full range.
|
||||
* All Y formats: full range
|
||||
*
|
||||
* For all other formats range is undefined, and implementations should use
|
||||
* an appropriate range for the data represented.
|
||||
*/
|
||||
RANGE_UNSPECIFIED = 0 << 27,
|
||||
|
||||
/**
|
||||
* Full range uses all values for Y, Cb and Cr from
|
||||
* 0 to 2^b-1, where b is the bit depth of the color format.
|
||||
*/
|
||||
RANGE_FULL = 1 << 27,
|
||||
|
||||
/**
|
||||
* Limited range uses values 16/256*2^b to 235/256*2^b for Y, and
|
||||
* 1/16*2^b to 15/16*2^b for Cb, Cr, R, G and B, where b is the bit depth of
|
||||
* the color format.
|
||||
*
|
||||
* E.g. For 8-bit-depth formats:
|
||||
* Luma (Y) samples should range from 16 to 235, inclusive
|
||||
* Chroma (Cb, Cr) samples should range from 16 to 240, inclusive
|
||||
*
|
||||
* For 10-bit-depth formats:
|
||||
* Luma (Y) samples should range from 64 to 940, inclusive
|
||||
* Chroma (Cb, Cr) samples should range from 64 to 960, inclusive
|
||||
*/
|
||||
RANGE_LIMITED = 2 << 27,
|
||||
|
||||
/**
|
||||
* Extended range is used for scRGB. Intended for use with
|
||||
* floating point pixel formats. [0.0 - 1.0] is the standard
|
||||
* sRGB space. Values outside the range 0.0 - 1.0 can encode
|
||||
* color outside the sRGB gamut.
|
||||
* Used to blend / merge multiple dataspaces on a single display.
|
||||
*/
|
||||
RANGE_EXTENDED = 3 << 27,
|
||||
|
||||
/**
|
||||
* scRGB linear encoding:
|
||||
*
|
||||
* The red, green, and blue components are stored in extended sRGB space,
|
||||
* but are linear, not gamma-encoded.
|
||||
* The RGB primaries and the white point are the same as BT.709.
|
||||
*
|
||||
* The values are floating point.
|
||||
* A pixel value of 1.0, 1.0, 1.0 corresponds to sRGB white (D65) at 80 nits.
|
||||
* Values beyond the range [0.0 - 1.0] would correspond to other colors
|
||||
* spaces and/or HDR content.
|
||||
*/
|
||||
SCRGB_LINEAR = 406913024, // STANDARD_BT709 | TRANSFER_LINEAR | RANGE_EXTENDED
|
||||
|
||||
/**
|
||||
* sRGB gamma encoding:
|
||||
*
|
||||
* The red, green and blue components are stored in sRGB space, and
|
||||
* converted to linear space when read, using the SRGB transfer function
|
||||
* for each of the R, G and B components. When written, the inverse
|
||||
* transformation is performed.
|
||||
*
|
||||
* The alpha component, if present, is always stored in linear space and
|
||||
* is left unmodified when read or written.
|
||||
*
|
||||
* Use full range and BT.709 standard.
|
||||
*/
|
||||
SRGB = 142671872, // STANDARD_BT709 | TRANSFER_SRGB | RANGE_FULL
|
||||
|
||||
/**
|
||||
* scRGB:
|
||||
*
|
||||
* The red, green, and blue components are stored in extended sRGB space,
|
||||
* and gamma-encoded using the SRGB transfer function.
|
||||
* The RGB primaries and the white point are the same as BT.709.
|
||||
*
|
||||
* The values are floating point.
|
||||
* A pixel value of 1.0, 1.0, 1.0 corresponds to sRGB white (D65) at 80 nits.
|
||||
* Values beyond the range [0.0 - 1.0] would correspond to other colors
|
||||
* spaces and/or HDR content.
|
||||
*/
|
||||
SCRGB = 411107328, // STANDARD_BT709 | TRANSFER_SRGB | RANGE_EXTENDED
|
||||
|
||||
/**
|
||||
* Display P3
|
||||
*
|
||||
* Use same primaries and white-point as DCI-P3
|
||||
* but sRGB transfer function.
|
||||
*/
|
||||
DISPLAY_P3 = 143261696, // STANDARD_DCI_P3 | TRANSFER_SRGB | RANGE_FULL
|
||||
|
||||
/**
|
||||
* ITU-R Recommendation 2020 (BT.2020)
|
||||
*
|
||||
* Ultra High-definition television
|
||||
*
|
||||
* Use full range, SMPTE 2084 (PQ) transfer and BT2020 standard
|
||||
*/
|
||||
BT2020_PQ = 163971072, // STANDARD_BT2020 | TRANSFER_ST2084 | RANGE_FULL
|
||||
|
||||
/**
|
||||
* ITU-R Recommendation 2020 (BT.2020)
|
||||
*
|
||||
* Ultra High-definition television
|
||||
*
|
||||
* Use limited range, SMPTE 2084 (PQ) transfer and BT2020 standard
|
||||
*/
|
||||
BT2020_ITU_PQ = 298188800, // STANDARD_BT2020 | TRANSFER_ST2084 | RANGE_LIMITED
|
||||
|
||||
/**
|
||||
* Adobe RGB
|
||||
*
|
||||
* Use full range, gamma 2.2 transfer and Adobe RGB primaries
|
||||
* Note: Application is responsible for gamma encoding the data as
|
||||
* a 2.2 gamma encoding is not supported in HW.
|
||||
*/
|
||||
ADOBE_RGB = 151715840, // STANDARD_ADOBE_RGB | TRANSFER_GAMMA2_2 | RANGE_FULL
|
||||
|
||||
/**
|
||||
* JPEG File Interchange Format (JFIF)
|
||||
*
|
||||
* Same model as BT.601-625, but all values (Y, Cb, Cr) range from 0 to 255
|
||||
*
|
||||
* Use full range, SMPTE 170M transfer and BT.601_625 standard.
|
||||
*/
|
||||
JFIF = 146931712, // STANDARD_BT601_625 | TRANSFER_SMPTE_170M | RANGE_FULL
|
||||
|
||||
/**
|
||||
* ITU-R Recommendation 601 (BT.601) - 525-line
|
||||
*
|
||||
* Standard-definition television, 525 Lines (NTSC)
|
||||
*
|
||||
* Use limited range, SMPTE 170M transfer and BT.601_525 standard.
|
||||
*/
|
||||
BT601_625 = 281149440, // STANDARD_BT601_625 | TRANSFER_SMPTE_170M | RANGE_LIMITED
|
||||
|
||||
/**
|
||||
* ITU-R Recommendation 709 (BT.709)
|
||||
*
|
||||
* High-definition television
|
||||
*
|
||||
* Use limited range, SMPTE 170M transfer and BT.709 standard.
|
||||
*/
|
||||
BT601_525 = 281280512, // STANDARD_BT601_525 | TRANSFER_SMPTE_170M | RANGE_LIMITED
|
||||
|
||||
/**
|
||||
* ITU-R Recommendation 2020 (BT.2020)
|
||||
*
|
||||
* Ultra High-definition television
|
||||
*
|
||||
* Use full range, BT.709 transfer and BT2020 standard
|
||||
*/
|
||||
BT2020 = 147193856, // STANDARD_BT2020 | TRANSFER_SMPTE_170M | RANGE_FULL
|
||||
|
||||
/**
|
||||
* ITU-R Recommendation 709 (BT.709)
|
||||
*
|
||||
* High-definition television
|
||||
*
|
||||
* Use limited range, BT.709 transfer and BT.709 standard.
|
||||
*/
|
||||
BT709 = 281083904, // STANDARD_BT709 | TRANSFER_SMPTE_170M | RANGE_LIMITED
|
||||
|
||||
/**
|
||||
* SMPTE EG 432-1 and SMPTE RP 431-2.
|
||||
*
|
||||
* Digital Cinema DCI-P3
|
||||
*
|
||||
* Use full range, gamma 2.6 transfer and D65 DCI-P3 standard
|
||||
* Note: Application is responsible for gamma encoding the data as
|
||||
* a 2.6 gamma encoding is not supported in HW.
|
||||
*/
|
||||
DCI_P3 = 155844608, // STANDARD_DCI_P3 | TRANSFER_GAMMA2_6 | RANGE_FULL
|
||||
|
||||
/**
|
||||
* sRGB linear encoding:
|
||||
*
|
||||
* The red, green, and blue components are stored in sRGB space, but
|
||||
* are linear, not gamma-encoded.
|
||||
* The RGB primaries and the white point are the same as BT.709.
|
||||
*
|
||||
* The values are encoded using the full range ([0,255] for 8-bit) for all
|
||||
* components.
|
||||
*/
|
||||
SRGB_LINEAR = 138477568, // STANDARD_BT709 | TRANSFER_LINEAR | RANGE_FULL
|
||||
|
||||
/**
|
||||
* Hybrid Log Gamma encoding:
|
||||
*
|
||||
* Use full range, hybrid log gamma transfer and BT2020 standard.
|
||||
*/
|
||||
BT2020_HLG = 168165376, // STANDARD_BT2020 | TRANSFER_HLG | RANGE_FULL
|
||||
|
||||
/**
|
||||
* ITU Hybrid Log Gamma encoding:
|
||||
*
|
||||
* Use limited range, hybrid log gamma transfer and BT2020 standard.
|
||||
*/
|
||||
BT2020_ITU_HLG = 302383104, // STANDARD_BT2020 | TRANSFER_HLG | RANGE_LIMITED
|
||||
|
||||
/**
|
||||
* Depth:
|
||||
*
|
||||
* This value is valid with formats HAL_PIXEL_FORMAT_Y16 and HAL_PIXEL_FORMAT_BLOB.
|
||||
*/
|
||||
DEPTH = 4096,
|
||||
|
||||
/**
|
||||
* ISO 16684-1:2011(E) Dynamic Depth:
|
||||
*
|
||||
* Embedded depth metadata following the dynamic depth specification.
|
||||
*/
|
||||
DYNAMIC_DEPTH = 4098
|
||||
}
|
||||
|
||||
+161
@@ -0,0 +1,161 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Advanced dynamic library opening support. Most users will want to use
|
||||
* the standard [dlopen(3)](http://man7.org/linux/man-pages/man3/dlopen.3.html)
|
||||
* functionality in `<dlfcn.h>` instead.
|
||||
*/
|
||||
|
||||
/** Bitfield definitions for `android_dlextinfo::flags`. */
|
||||
DLextFlagsBits :: enum u64 {
|
||||
/**
|
||||
* When set, the `reserved_addr` and `reserved_size` fields must point to an
|
||||
* already-reserved region of address space which will be used to load the
|
||||
* library if it fits.
|
||||
*
|
||||
* If the reserved region is not large enough, loading will fail.
|
||||
*/
|
||||
RESERVED_ADDRESS = 0,
|
||||
|
||||
/**
|
||||
* Like `ANDROID_DLEXT_RESERVED_ADDRESS`, but if the reserved region is not large enough,
|
||||
* the linker will choose an available address instead.
|
||||
*/
|
||||
RESERVED_ADDRESS_HINT = 1,
|
||||
|
||||
/**
|
||||
* When set, write the GNU RELRO section of the mapped library to `relro_fd`
|
||||
* after relocation has been performed, to allow it to be reused by another
|
||||
* process loading the same library at the same address. This implies
|
||||
* `ANDROID_DLEXT_USE_RELRO`.
|
||||
*
|
||||
* This is mainly useful for the system WebView implementation.
|
||||
*/
|
||||
WRITE_RELRO = 2,
|
||||
|
||||
/**
|
||||
* When set, compare the GNU RELRO section of the mapped library to `relro_fd`
|
||||
* after relocation has been performed, and replace any relocated pages that
|
||||
* are identical with a version mapped from the file.
|
||||
*
|
||||
* This is mainly useful for the system WebView implementation.
|
||||
*/
|
||||
USE_RELRO = 3,
|
||||
|
||||
/**
|
||||
* Use `library_fd` instead of opening the file by name.
|
||||
* The filename parameter is still used to identify the library.
|
||||
*/
|
||||
USE_LIBRARY_FD = 4,
|
||||
|
||||
/**
|
||||
* If opening a library using `library_fd` read it starting at `library_fd_offset`.
|
||||
* This is mainly useful for loading a library stored within another file (such as uncompressed
|
||||
* inside a ZIP archive).
|
||||
* This flag is only valid when `ANDROID_DLEXT_USE_LIBRARY_FD` is set.
|
||||
*/
|
||||
USE_LIBRARY_FD_OFFSET = 5,
|
||||
|
||||
/**
|
||||
* When set, do not use `stat(2)` to check if the library has already been loaded.
|
||||
*
|
||||
* This flag allows forced loading of the library in the case when for some
|
||||
* reason multiple ELF files share the same filename (because the already-loaded
|
||||
* library has been removed and overwritten, for example).
|
||||
*
|
||||
* Note that if the library has the same `DT_SONAME` as an old one and some other
|
||||
* library has the soname in its `DT_NEEDED` list, the first one will be used to resolve any
|
||||
* dependencies.
|
||||
*/
|
||||
FORCE_LOAD = 6,
|
||||
|
||||
// Historically we had two other options for ART.
|
||||
// They were last available in Android P.
|
||||
// Reuse these bits last!
|
||||
// ANDROID_DLEXT_FORCE_FIXED_VADDR = 0x80
|
||||
// ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS = 0x100
|
||||
|
||||
/**
|
||||
* This flag used to load library in a different namespace. The namespace is
|
||||
* specified in `library_namespace`.
|
||||
*
|
||||
* This flag is for internal use only (since there is no NDK API for namespaces).
|
||||
*/
|
||||
USE_NAMESPACE = 9,
|
||||
|
||||
/**
|
||||
* Instructs dlopen to apply `ANDROID_DLEXT_RESERVED_ADDRESS`,
|
||||
* `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`, `ANDROID_DLEXT_WRITE_RELRO` and
|
||||
* `ANDROID_DLEXT_USE_RELRO` to any libraries loaded as dependencies of the
|
||||
* main library as well.
|
||||
*
|
||||
* This means that if the main library depends on one or more not-already-loaded libraries, they
|
||||
* will be loaded consecutively into the region starting at `reserved_addr`, and `reserved_size`
|
||||
* must be large enough to contain all of the libraries. The libraries will be loaded in the
|
||||
* deterministic order constructed from the DT_NEEDED entries, rather than the more secure random
|
||||
* order used by default.
|
||||
*
|
||||
* Each library's GNU RELRO sections will be written out to `relro_fd` in the same order they were
|
||||
* loaded. This will mean that the resulting file is dependent on which of the libraries were
|
||||
* already loaded, as only the newly loaded libraries will be included, not any already-loaded
|
||||
* dependencies. The caller should ensure that the set of libraries newly loaded is consistent
|
||||
* for this to be effective.
|
||||
*
|
||||
* This is mainly useful for the system WebView implementation.
|
||||
*/
|
||||
RESERVED_ADDRESS_RECURSIVE = 10,
|
||||
}
|
||||
|
||||
DLextFlags :: bit_set[DLextFlagsBits; u64]
|
||||
|
||||
AllDLextFlags :: DLextFlags{
|
||||
.RESERVED_ADDRESS,
|
||||
.RESERVED_ADDRESS_HINT,
|
||||
.WRITE_RELRO,
|
||||
.USE_RELRO,
|
||||
.USE_LIBRARY_FD,
|
||||
.USE_LIBRARY_FD_OFFSET,
|
||||
.FORCE_LOAD,
|
||||
.USE_NAMESPACE,
|
||||
.RESERVED_ADDRESS_RECURSIVE
|
||||
}
|
||||
|
||||
android_namespace_t :: struct{}
|
||||
|
||||
/** Used to pass Android-specific arguments to `android_dlopen_ext`. */
|
||||
android_dlextinfo :: struct {
|
||||
/** A bitmask of `ANDROID_DLEXT_` enum values. */
|
||||
flags: DLextFlags,
|
||||
|
||||
/** Used by `ANDROID_DLEXT_RESERVED_ADDRESS` and `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`. */
|
||||
reserved_addr: rawptr,
|
||||
/** Used by `ANDROID_DLEXT_RESERVED_ADDRESS` and `ANDROID_DLEXT_RESERVED_ADDRESS_HINT`. */
|
||||
reserved_size: uint,
|
||||
|
||||
/** Used by `ANDROID_DLEXT_WRITE_RELRO` and `ANDROID_DLEXT_USE_RELRO`. */
|
||||
relro_fd: i32,
|
||||
|
||||
/** Used by `ANDROID_DLEXT_USE_LIBRARY_FD`. */
|
||||
library_fd: i32,
|
||||
/** Used by `ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET` */
|
||||
library_fd_offset: off64_t,
|
||||
|
||||
/** Used by `ANDROID_DLEXT_USE_NAMESPACE`. */
|
||||
library_namespace: ^android_namespace_t,
|
||||
}
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Opens the given library. The `__filename` and `__flags` arguments are
|
||||
* the same as for [dlopen(3)](http://man7.org/linux/man-pages/man3/dlopen.3.html),
|
||||
* with the Android-specific flags supplied via the `flags` member of `__info`.
|
||||
*
|
||||
* Available since API level 21.
|
||||
*/
|
||||
android_dlopen_ext :: proc(__filename: cstring, __flags: i32, __info: ^android_dlextinfo) -> rawptr ---
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package android
|
||||
|
||||
// Apparently the app still needs to have a manifest, it also MUST use the nativeactivity activity.
|
||||
// Apparently the native code MUST be built as a shared library and then loaded by the JNI(?)
|
||||
// Good ref: https://github.com/xlab/android-go/blob/master/examples/build-android.sh
|
||||
// Even better ref: https://github.com/mmozeiko/android-native-example
|
||||
// Hmm, what if the Odin compiler itself has support for an Android target, it would build the shared lib, link everything,
|
||||
// package the app as an apk too. The minSdk level can be set using Odin's comptime defines, if any necessary define is missing
|
||||
// the compiler refuses to build, or maybe the compiler just silently reads the build.gradle file and search for the minSdk define??
|
||||
// that would require that Odin Android apps MUST have the android file structure with some required files.
|
||||
// Or maybe the Odin compiler will generate those files ??? so many possiblities and options.
|
||||
//
|
||||
// The above is a problem for later, let's just get a basic Odin Android app building and hopefully running.
|
||||
|
||||
// TODO: We need some sort of way to guard against calling __INTRODUCED_IN(30) procs in older
|
||||
// Android versions, preferably a way to have the compiler complain.
|
||||
// Maybe some sort of #config that the user has to define and maybe we can @disabled these procs
|
||||
// if the version isn't compatible.
|
||||
// @disabled doesn't work on procs with a return value, a simple when ANDROID_API >= 30 {} works but it's still
|
||||
// easily bypassable.
|
||||
+204
@@ -0,0 +1,204 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/*
|
||||
* Error checking for close(2).
|
||||
*
|
||||
* Mishandling of file descriptor ownership is a common source of errors that
|
||||
* can be extremely difficult to diagnose. Mistakes like the following can
|
||||
* result in seemingly 'impossible' failures showing up on other threads that
|
||||
* happened to try to open a file descriptor between the buggy code's close and
|
||||
* fclose:
|
||||
*
|
||||
* int print(int fd) {
|
||||
* int rc;
|
||||
* char buf[128];
|
||||
* while ((rc = read(fd, buf, sizeof(buf))) > 0) {
|
||||
* printf("%.*s", rc);
|
||||
* }
|
||||
* close(fd);
|
||||
* }
|
||||
*
|
||||
* int bug() {
|
||||
* FILE* f = fopen("foo", "r");
|
||||
* print(fileno(f));
|
||||
* fclose(f);
|
||||
* }
|
||||
*
|
||||
* To make it easier to find this class of bugs, bionic provides a method to
|
||||
* require that file descriptors are closed by their owners. File descriptors
|
||||
* can be associated with tags with which they must be closed. This allows
|
||||
* objects that conceptually own an fd (FILE*, unique_fd, etc.) to use their
|
||||
* own address at the tag, to enforce that closure of the fd must come as a
|
||||
* result of their own destruction (fclose, ~unique_fd, etc.)
|
||||
*
|
||||
* By default, a file descriptor's tag is 0, and close(fd) is equivalent to
|
||||
* closing fd with the tag 0.
|
||||
*/
|
||||
|
||||
/*
|
||||
* For improved diagnostics, the type of a file descriptors owner can be
|
||||
* encoded in the most significant byte of the owner tag. Values of 0 and 0xff
|
||||
* are ignored, which allows for raw pointers to be used as owner tags without
|
||||
* modification.
|
||||
*/
|
||||
android_fdsan_owner_type :: enum {
|
||||
/*
|
||||
* Generic Java or native owners.
|
||||
*
|
||||
* Generic Java objects always use 255 as their type, using identityHashCode
|
||||
* as the value of the tag, leaving bits 33-56 unset. Native pointers are sign
|
||||
* extended from 48-bits of virtual address space, and so can have the MSB
|
||||
* set to 255 as well. Use the value of bits 49-56 to distinguish between
|
||||
* these cases.
|
||||
*/
|
||||
GENERIC_00 = 0,
|
||||
GENERIC_FF = 255,
|
||||
|
||||
/* FILE* */
|
||||
FILE = 1,
|
||||
|
||||
/* DIR* */
|
||||
DIR = 2,
|
||||
|
||||
/* android::base::unique_fd */
|
||||
UNIQUE_FD = 3,
|
||||
|
||||
/* sqlite-owned file descriptors */
|
||||
SQLITE = 4,
|
||||
|
||||
/* java.io.FileInputStream */
|
||||
FILEINPUTSTREAM = 5,
|
||||
|
||||
/* java.io.FileOutputStream */
|
||||
FILEOUTPUTSTREAM = 6,
|
||||
|
||||
/* java.io.RandomAccessFile */
|
||||
RANDOMACCESSFILE = 7,
|
||||
|
||||
/* android.os.ParcelFileDescriptor */
|
||||
PARCELFILEDESCRIPTOR = 8,
|
||||
|
||||
/* ART FdFile */
|
||||
ART_FDFILE = 9,
|
||||
|
||||
/* java.net.DatagramSocketImpl */
|
||||
DATAGRAMSOCKETIMPL = 10,
|
||||
|
||||
/* java.net.SocketImpl */
|
||||
SOCKETIMPL = 11,
|
||||
|
||||
/* libziparchive's ZipArchive */
|
||||
ZIPARCHIVE = 12,
|
||||
|
||||
/* native_handle_t */
|
||||
NATIVE_HANDLE = 13,
|
||||
}
|
||||
|
||||
android_fdsan_error_level :: enum {
|
||||
// No errors.
|
||||
DISABLED,
|
||||
|
||||
// Warn once(ish) on error, and then downgrade to ANDROID_FDSAN_ERROR_LEVEL_DISABLED.
|
||||
WARN_ONCE,
|
||||
|
||||
// Warn always on error.
|
||||
WARN_ALWAYS,
|
||||
|
||||
// Abort on error.
|
||||
FATAL,
|
||||
}
|
||||
|
||||
foreign android {
|
||||
/*
|
||||
* Create an owner tag with the specified type and least significant 56 bits of tag.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
@(linkage="weak")
|
||||
android_fdsan_create_owner_tag :: proc(type: android_fdsan_owner_type, tag: u64) -> u64 ---
|
||||
|
||||
/*
|
||||
* Exchange a file descriptor's tag.
|
||||
*
|
||||
* Logs and aborts if the fd's tag does not match expected_tag.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
@(linkage="weak")
|
||||
android_fdsan_exchange_owner_tag :: proc(fd: i32, expected_tag: u64, new_tag: u64) ---
|
||||
|
||||
/*
|
||||
* Close a file descriptor with a tag, and resets the tag to 0.
|
||||
*
|
||||
* Logs and aborts if the tag is incorrect.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
@(linkage="weak")
|
||||
android_fdsan_close_with_tag :: proc(fd: i32, tag: u64) -> i32 ---
|
||||
|
||||
/*
|
||||
* Get a file descriptor's current owner tag.
|
||||
*
|
||||
* Returns 0 for untagged and invalid file descriptors.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
android_fdsan_get_owner_tag :: proc(fd: i32) -> u64 ---
|
||||
|
||||
/*
|
||||
* Get an owner tag's string representation.
|
||||
*
|
||||
* The return value points to memory with static lifetime, do not attempt to modify it.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
android_fdsan_get_tag_type :: proc(tag: u64) -> cstring ---
|
||||
|
||||
/*
|
||||
* Get an owner tag's value, with the type masked off.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
android_fdsan_get_tag_value :: proc(tag: u64) -> u64 ---
|
||||
|
||||
/*
|
||||
* Get the error level.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
@(linkage="weak")
|
||||
android_fdsan_get_error_level :: proc() -> android_fdsan_error_level ---
|
||||
|
||||
/*
|
||||
* Set the error level and return the previous state.
|
||||
*
|
||||
* Error checking is automatically disabled in the child of a fork, to maintain
|
||||
* compatibility with code that forks, closes all file descriptors, and then
|
||||
* execs.
|
||||
*
|
||||
* In cases such as the zygote, where the child has no intention of calling
|
||||
* exec, call this function to reenable fdsan checks.
|
||||
*
|
||||
* This function is not thread-safe and does not synchronize with checks of the
|
||||
* value, and so should probably only be called in single-threaded contexts
|
||||
* (e.g. postfork).
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
@(linkage="weak")
|
||||
android_fdsan_set_error_level :: proc(new_level: android_fdsan_error_level) -> android_fdsan_error_level ---
|
||||
|
||||
|
||||
/*
|
||||
* Set the error level to the global setting if available, or a default value.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
@(linkage="weak")
|
||||
android_fdsan_set_error_level_from_property :: proc(default_level: android_fdsan_error_level) -> android_fdsan_error_level ---
|
||||
}
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Returns a new java.io.FileDescriptor.
|
||||
*
|
||||
* The FileDescriptor created represents an invalid Unix file descriptor (represented by
|
||||
* a file descriptor value of -1).
|
||||
*
|
||||
* Callers of this method should be aware that it can fail, returning NULL with a pending Java
|
||||
* exception.
|
||||
*
|
||||
* Available since API level 31.
|
||||
*
|
||||
* \param env a pointer to the JNI Native Interface of the current thread.
|
||||
* \return a java.io.FileDescriptor on success, nullptr if insufficient heap memory is available.
|
||||
*/
|
||||
AFileDescriptor_create :: proc(env: ^JNIEnv) -> jobject ---
|
||||
|
||||
/**
|
||||
* Returns the Unix file descriptor represented by the given java.io.FileDescriptor.
|
||||
*
|
||||
* A return value of -1 indicates that \a fileDescriptor represents an invalid file descriptor.
|
||||
*
|
||||
* Aborts the program if \a fileDescriptor is not a java.io.FileDescriptor instance.
|
||||
*
|
||||
* Available since API level 31.
|
||||
*
|
||||
* \param env a pointer to the JNI Native Interface of the current thread.
|
||||
* \param fileDescriptor a java.io.FileDescriptor instance.
|
||||
* \return the Unix file descriptor wrapped by \a fileDescriptor.
|
||||
*/
|
||||
AFileDescriptor_getFd :: proc(env: ^JNIEnv, fileDescriptor: jobject) -> i32 ---
|
||||
|
||||
/**
|
||||
* Sets the Unix file descriptor represented by the given java.io.FileDescriptor.
|
||||
*
|
||||
* This function performs no validation of the Unix file descriptor argument, \a fd. Android uses
|
||||
* the value -1 to represent an invalid file descriptor, all other values are considered valid.
|
||||
* The validity of a file descriptor can be checked with FileDescriptor#valid().
|
||||
*
|
||||
* Aborts the program if \a fileDescriptor is not a java.io.FileDescriptor instance.
|
||||
*
|
||||
* Available since API level 31.
|
||||
*
|
||||
* \param env a pointer to the JNI Native Interface of the current thread.
|
||||
* \param fileDescriptor a java.io.FileDescriptor instance.
|
||||
* \param fd a Unix file descriptor that \a fileDescriptor will subsequently represent.
|
||||
*/
|
||||
AFileDescriptor_setFd :: proc(env: ^JNIEnv, fileDescriptor: jobject, fd: i32) ---
|
||||
}
|
||||
@@ -0,0 +1,249 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
FontWeight :: enum u16 {
|
||||
/** The minimum value fot the font weight value. */
|
||||
MIN = 0,
|
||||
|
||||
/** A font weight value for the thin weight. */
|
||||
THIN = 100,
|
||||
|
||||
/** A font weight value for the extra-light weight. */
|
||||
EXTRA_LIGHT = 200,
|
||||
|
||||
/** A font weight value for the light weight. */
|
||||
LIGHT = 300,
|
||||
|
||||
/** A font weight value for the normal weight. */
|
||||
NORMAL = 400,
|
||||
|
||||
/** A font weight value for the medium weight. */
|
||||
MEDIUM = 500,
|
||||
|
||||
/** A font weight value for the semi-bold weight. */
|
||||
SEMI_BOLD = 600,
|
||||
|
||||
/** A font weight value for the bold weight. */
|
||||
BOLD = 700,
|
||||
|
||||
/** A font weight value for the extra-bold weight. */
|
||||
EXTRA_BOLD = 800,
|
||||
|
||||
/** A font weight value for the black weight. */
|
||||
BLACK = 900,
|
||||
|
||||
/** The maximum value for the font weight value. */
|
||||
MAX = 1000
|
||||
}
|
||||
|
||||
/**
|
||||
* AFont provides information of the single font configuration.
|
||||
*/
|
||||
AFont :: struct{}
|
||||
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Close an AFont.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font returned by ASystemFontIterator_next or AFontMatchert_match.
|
||||
* Do nothing if NULL is passed.
|
||||
*/
|
||||
AFont_close :: proc(font: ^AFont) ---
|
||||
|
||||
/**
|
||||
* Return an absolute path to the current font file.
|
||||
*
|
||||
* Here is a list of font formats returned by this method:
|
||||
* <ul>
|
||||
* <li>OpenType</li>
|
||||
* <li>OpenType Font Collection</li>
|
||||
* <li>TrueType</li>
|
||||
* <li>TrueType Collection</li>
|
||||
* </ul>
|
||||
* The file extension could be one of *.otf, *.ttf, *.otc or *.ttc.
|
||||
*
|
||||
* The font file returned is guaranteed to be opend with O_RDONLY.
|
||||
* Note that the returned pointer is valid until AFont_close() is called for the given font.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \return a string of the font file path.
|
||||
*/
|
||||
AFont_getFontFilePath :: proc(font: ^AFont) -> cstring ---
|
||||
|
||||
/**
|
||||
* Return a weight value associated with the current font.
|
||||
*
|
||||
* The weight values are positive and less than or equal to 1000.
|
||||
* Here are pairs of the common names and their values.
|
||||
* <p>
|
||||
* <table>
|
||||
* <tr>
|
||||
* <th align="center">Value</th>
|
||||
* <th align="center">Name</th>
|
||||
* <th align="center">NDK Definition</th>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">100</td>
|
||||
* <td align="center">Thin</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_THIN}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">200</td>
|
||||
* <td align="center">Extra Light (Ultra Light)</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_EXTRA_LIGHT}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">300</td>
|
||||
* <td align="center">Light</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_LIGHT}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">400</td>
|
||||
* <td align="center">Normal (Regular)</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_NORMAL}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">500</td>
|
||||
* <td align="center">Medium</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_MEDIUM}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">600</td>
|
||||
* <td align="center">Semi Bold (Demi Bold)</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_SEMI_BOLD}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">700</td>
|
||||
* <td align="center">Bold</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_BOLD}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">800</td>
|
||||
* <td align="center">Extra Bold (Ultra Bold)</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_EXTRA_BOLD}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td align="center">900</td>
|
||||
* <td align="center">Black (Heavy)</td>
|
||||
* <td align="center">{@link AFONT_WEIGHT_BLACK}</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
* </p>
|
||||
* Note that the weight value may fall in between above values, e.g. 250 weight.
|
||||
*
|
||||
* For more information about font weight, read [OpenType usWeightClass](https://docs.microsoft.com/en-us/typography/opentype/spec/os2#usweightclass)
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \return a positive integer less than or equal to {@link AFONT_WEIGHT_MAX} is returned.
|
||||
*/
|
||||
AFont_getWeight :: proc(font: ^AFont) -> FontWeight ---
|
||||
|
||||
/**
|
||||
* Return true if the current font is italic, otherwise returns false.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \return true if italic, otherwise false.
|
||||
*/
|
||||
AFont_isItalic :: proc(font: ^AFont) -> bool ---
|
||||
|
||||
/**
|
||||
* Return a IETF BCP47 compliant language tag associated with the current font.
|
||||
*
|
||||
* For information about IETF BCP47, read [Locale.forLanguageTag(java.lang.String)](https://developer.android.com/reference/java/util/Locale.html#forLanguageTag(java.lang.String)")
|
||||
*
|
||||
* Note that the returned pointer is valid until AFont_close() is called.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \return a IETF BCP47 compliant language tag or nullptr if not available.
|
||||
*/
|
||||
AFont_getLocale :: proc(font: ^AFont) -> cstring ---
|
||||
|
||||
/**
|
||||
* Return a font collection index value associated with the current font.
|
||||
*
|
||||
* In case the target font file is a font collection (e.g. .ttc or .otc), this
|
||||
* returns a non-negative value as an font offset in the collection. This
|
||||
* always returns 0 if the target font file is a regular font.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \return a font collection index.
|
||||
*/
|
||||
AFont_getCollectionIndex :: proc(font: ^AFont) -> uint ---
|
||||
|
||||
/**
|
||||
* Return a count of font variation settings associated with the current font
|
||||
*
|
||||
* The font variation settings are provided as multiple tag-values pairs.
|
||||
*
|
||||
* For example, bold italic font may have following font variation settings:
|
||||
* 'wght' 700, 'slnt' -12
|
||||
* In this case, AFont_getAxisCount returns 2 and AFont_getAxisTag
|
||||
* and AFont_getAxisValue will return following values.
|
||||
* \code{.cpp}
|
||||
* AFont* font = ASystemFontIterator_next(ite)
|
||||
*
|
||||
* // Returns the number of axes
|
||||
* AFont_getAxisCount(font) // Returns 2
|
||||
*
|
||||
* // Returns the tag-value pair for the first axis.
|
||||
* AFont_getAxisTag(font, 0) // Returns 'wght'(0x77676874)
|
||||
* AFont_getAxisValue(font, 0) // Returns 700.0
|
||||
*
|
||||
* // Returns the tag-value pair for the second axis.
|
||||
* AFont_getAxisTag(font, 1) // Returns 'slnt'(0x736c6e74)
|
||||
* AFont_getAxisValue(font, 1) // Returns -12.0
|
||||
* \endcode
|
||||
*
|
||||
* For more information about font variation settings, read [Font Variations Table](https://docs.microsoft.com/en-us/typography/opentype/spec/fvar)
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \return a number of font variation settings.
|
||||
*/
|
||||
AFont_getAxisCount :: proc(font: ^AFont) -> uint ---
|
||||
|
||||
|
||||
/**
|
||||
* Return an OpenType axis tag associated with the current font.
|
||||
*
|
||||
* See AFont_getAxisCount for more details.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \param axisIndex an index to the font variation settings. Passing value larger than or
|
||||
* equal to {@link AFont_getAxisCount} is not allowed.
|
||||
* \return an OpenType axis tag value for the given font variation setting.
|
||||
*/
|
||||
AFont_getAxisTag :: proc(font: ^AFont, axisIndex: u32) -> u32 ---
|
||||
|
||||
/**
|
||||
* Return an OpenType axis value associated with the current font.
|
||||
*
|
||||
* See AFont_getAxisCount for more details.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param font a font object. Passing NULL is not allowed.
|
||||
* \param axisIndex an index to the font variation settings. Passing value larger than or
|
||||
* equal to {@link AFont_getAxisCount} is not allowed.
|
||||
* \return a float value for the given font variation setting.
|
||||
*/
|
||||
AFont_getAxisValue :: proc(font: ^AFont, axisIndex: u32) -> f32 ---
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/**
|
||||
* @file font_matcher.h
|
||||
* @brief Provides the font matching logic with various inputs.
|
||||
*
|
||||
* You can use this class for deciding what font is to be used for drawing text.
|
||||
*
|
||||
* A matcher is created from text style, locales and UI compatibility. The match function for
|
||||
* matcher object can be called multiple times until close function is called.
|
||||
*
|
||||
* Even if no font can render the given text, the match function will return a non-null result for
|
||||
* drawing Tofu character.
|
||||
*
|
||||
* Examples:
|
||||
* \code{.cpp}
|
||||
* // Simple font query for the ASCII character.
|
||||
* std::vector<uint16_t> text = { 'A' };
|
||||
* AFontMatcher* matcher = AFontMatcher_create("sans-serif");
|
||||
* AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
|
||||
* // runLength will be 1 and the font will points a valid font file.
|
||||
* AFontMatcher_destroy(matcher);
|
||||
*
|
||||
* // Querying font for CJK characters
|
||||
* std::vector<uint16_t> text = { 0x9AA8 };
|
||||
* AFontMatcher* matcher = AFontMatcher_create("sans-serif");
|
||||
* AFontMatcher_setLocales(matcher, "zh-CN,ja-JP");
|
||||
* AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
|
||||
* // runLength will be 1 and the font will points a Simplified Chinese font.
|
||||
* AFontMatcher_setLocales(matcher, "ja-JP,zh-CN");
|
||||
* AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
|
||||
* // runLength will be 1 and the font will points a Japanese font.
|
||||
* AFontMatcher_destroy(matcher);
|
||||
*
|
||||
* // Querying font for text/color emoji
|
||||
* std::vector<uint16_t> text = { 0xD83D, 0xDC68, 0x200D, 0x2764, 0xFE0F, 0x200D, 0xD83D, 0xDC68 };
|
||||
* AFontMatcher* matcher = AFontMatcher_create("sans-serif");
|
||||
* AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
|
||||
* // runLength will be 8 and the font will points a color emoji font.
|
||||
* AFontMatcher_destroy(matcher);
|
||||
*
|
||||
* // Mixture of multiple script of characters.
|
||||
* // 0x05D0 is a Hebrew character and 0x0E01 is a Thai character.
|
||||
* std::vector<uint16_t> text = { 0x05D0, 0x0E01 };
|
||||
* AFontMatcher* matcher = AFontMatcher_create("sans-serif");
|
||||
* AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
|
||||
* // runLength will be 1 and the font will points a Hebrew font.
|
||||
* AFontMatcher_destroy(matcher);
|
||||
* \endcode
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
|
||||
FamilyVariant :: enum u32 {
|
||||
/** A family variant value for the system default variant. */
|
||||
DEFAULT = 0,
|
||||
|
||||
/**
|
||||
* A family variant value for the compact font family variant.
|
||||
*
|
||||
* The compact font family has Latin-based vertical metrics.
|
||||
*/
|
||||
COMPACT = 1,
|
||||
|
||||
/**
|
||||
* A family variant value for the elegant font family variant.
|
||||
*
|
||||
* The elegant font family may have larger vertical metrics than Latin font.
|
||||
*/
|
||||
ELEGANT = 2,
|
||||
};
|
||||
|
||||
/**
|
||||
* AFontMatcher performs match operation on given parameters and available font files.
|
||||
* This matcher is not a thread-safe object. Do not pass this matcher to other threads.
|
||||
*/
|
||||
AFontMatcher :: struct{}
|
||||
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Creates a new AFontMatcher object.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
AFontMatcher_create :: proc() -> ^AFontMatcher ---
|
||||
|
||||
/**
|
||||
* Destroy the matcher object.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param matcher a matcher object. Passing NULL is not allowed.
|
||||
*/
|
||||
AFontMatcher_destroy :: proc(matcher: ^AFontMatcher) ---
|
||||
|
||||
/**
|
||||
* Set font style to matcher.
|
||||
*
|
||||
* If this function is not called, the matcher performs with {@link AFONT_WEIGHT_NORMAL}
|
||||
* with non-italic style.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param matcher a matcher object. Passing NULL is not allowed.
|
||||
* \param weight a font weight value. Only from 0 to 1000 value is valid
|
||||
* \param italic true if italic, otherwise false.
|
||||
*/
|
||||
AFontMatcher_setStyle :: proc(matcher: ^AFontMatcher, weight: FontWeight, italic: bool) ---
|
||||
|
||||
/**
|
||||
* Set font locales to matcher.
|
||||
*
|
||||
* If this function is not called, the matcher performs with empty locale list.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param matcher a matcher object. Passing NULL is not allowed.
|
||||
* \param languageTags a null character terminated comma separated IETF BCP47 compliant language
|
||||
* tags.
|
||||
*/
|
||||
AFontMatcher_setLocales :: proc(matcher: ^AFontMatcher, languageTags: cstring) ---
|
||||
|
||||
/**
|
||||
* Set family variant to matcher.
|
||||
*
|
||||
* If this function is not called, the matcher performs with {@link AFAMILY_VARIANT_DEFAULT}.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param matcher a matcher object. Passing NULL is not allowed.
|
||||
* \param familyVariant Must be one of {@link AFAMILY_VARIANT_DEFAULT},
|
||||
* {@link AFAMILY_VARIANT_COMPACT} or {@link AFAMILY_VARIANT_ELEGANT} is valid.
|
||||
*/
|
||||
AFontMatcher_setFamilyVariant :: proc(matcher: ^AFontMatcher, familyVariant: FamilyVariant) ---
|
||||
|
||||
/**
|
||||
* Performs the matching from the generic font family for the text and select one font.
|
||||
*
|
||||
* For more information about generic font families, read [W3C spec](https://www.w3.org/TR/css-fonts-4/#generic-font-families)
|
||||
*
|
||||
* Even if no font can render the given text, this function will return a non-null result for
|
||||
* drawing Tofu character.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \param matcher a matcher object. Passing NULL is not allowed.
|
||||
* \param familyName a null character terminated font family name
|
||||
* \param text a UTF-16 encoded text buffer to be rendered. Do not pass empty string.
|
||||
* \param textLength a length of the given text buffer. This must not be zero.
|
||||
* \param runLengthOut if not null, the font run length will be filled.
|
||||
* \return a font to be used for given text and params. You need to release the returned font by
|
||||
* AFont_close when it is no longer needed.
|
||||
*/
|
||||
AFontMatcher_match :: proc(matcher: ^AFontMatcher, familyName: cstring, text: [^]u16, textLength: u32, runLengthOut: ^u32) -> ^AFont ---
|
||||
}
|
||||
@@ -0,0 +1,578 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/**
|
||||
* @file hardware_buffer.h
|
||||
* @brief API for native hardware buffers.
|
||||
*/
|
||||
/**
|
||||
* @defgroup AHardwareBuffer Native Hardware Buffer
|
||||
*
|
||||
* AHardwareBuffer objects represent chunks of memory that can be
|
||||
* accessed by various hardware components in the system. It can be
|
||||
* easily converted to the Java counterpart
|
||||
* android.hardware.HardwareBuffer and passed between processes using
|
||||
* Binder. All operations involving AHardwareBuffer and HardwareBuffer
|
||||
* are zero-copy, i.e., passing AHardwareBuffer to another process
|
||||
* creates a shared view of the same region of memory.
|
||||
*
|
||||
* AHardwareBuffers can be bound to EGL/OpenGL and Vulkan primitives.
|
||||
* For EGL, use the extension function eglGetNativeClientBufferANDROID
|
||||
* to obtain an EGLClientBuffer and pass it directly to
|
||||
* eglCreateImageKHR. Refer to the EGL extensions
|
||||
* EGL_ANDROID_get_native_client_buffer and
|
||||
* EGL_ANDROID_image_native_buffer for more information. In Vulkan,
|
||||
* the contents of the AHardwareBuffer can be accessed as external
|
||||
* memory. See the VK_ANDROID_external_memory_android_hardware_buffer
|
||||
* extension for details.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Buffer pixel formats.
|
||||
*/
|
||||
AHardwareBuffer_Format :: enum u32 {
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R8G8B8A8_UNORM
|
||||
* OpenGL ES: GL_RGBA8
|
||||
*/
|
||||
R8G8B8A8_UNORM = 1,
|
||||
|
||||
/**
|
||||
* 32 bits per pixel, 8 bits per channel format where alpha values are
|
||||
* ignored (always opaque).
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R8G8B8A8_UNORM
|
||||
* OpenGL ES: GL_RGB8
|
||||
*/
|
||||
R8G8B8X8_UNORM = 2,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R8G8B8_UNORM
|
||||
* OpenGL ES: GL_RGB8
|
||||
*/
|
||||
R8G8B8_UNORM = 3,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16
|
||||
* OpenGL ES: GL_RGB565
|
||||
*/
|
||||
R5G6B5_UNORM = 4,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT
|
||||
* OpenGL ES: GL_RGBA16F
|
||||
*/
|
||||
R16G16B16A16_FLOAT = 0x16,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_A2B10G10R10_UNORM_PACK32
|
||||
* OpenGL ES: GL_RGB10_A2
|
||||
*/
|
||||
R10G10B10A2_UNORM = 0x2b,
|
||||
|
||||
/**
|
||||
* Opaque binary blob format.
|
||||
* Must have height 1 and one layer, with width equal to the buffer
|
||||
* size in bytes. Corresponds to Vulkan buffers and OpenGL buffer
|
||||
* objects. Can be bound to the latter using GL_EXT_external_buffer.
|
||||
*/
|
||||
BLOB = 0x21,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_D16_UNORM
|
||||
* OpenGL ES: GL_DEPTH_COMPONENT16
|
||||
*/
|
||||
D16_UNORM = 0x30,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_X8_D24_UNORM_PACK32
|
||||
* OpenGL ES: GL_DEPTH_COMPONENT24
|
||||
*/
|
||||
D24_UNORM = 0x31,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_D24_UNORM_S8_UINT
|
||||
* OpenGL ES: GL_DEPTH24_STENCIL8
|
||||
*/
|
||||
D24_UNORM_S8_UINT = 0x32,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_D32_SFLOAT
|
||||
* OpenGL ES: GL_DEPTH_COMPONENT32F
|
||||
*/
|
||||
D32_FLOAT = 0x33,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_D32_SFLOAT_S8_UINT
|
||||
* OpenGL ES: GL_DEPTH32F_STENCIL8
|
||||
*/
|
||||
D32_FLOAT_S8_UINT = 0x34,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_S8_UINT
|
||||
* OpenGL ES: GL_STENCIL_INDEX8
|
||||
*/
|
||||
S8_UINT = 0x35,
|
||||
|
||||
/**
|
||||
* YUV 420 888 format.
|
||||
* Must have an even width and height. Can be accessed in OpenGL
|
||||
* shaders through an external sampler. Does not support mip-maps
|
||||
* cube-maps or multi-layered textures.
|
||||
*/
|
||||
Y8Cb8Cr8_420 = 0x23,
|
||||
|
||||
/**
|
||||
* YUV P010 format.
|
||||
* Must have an even width and height. Can be accessed in OpenGL
|
||||
* shaders through an external sampler. Does not support mip-maps
|
||||
* cube-maps or multi-layered textures.
|
||||
*/
|
||||
YCbCr_P010 = 0x36,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R8_UNORM
|
||||
* OpenGL ES: GR_GL_R8
|
||||
*/
|
||||
R8_UNORM = 0x38,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R16_UINT
|
||||
* OpenGL ES: GL_R16UI
|
||||
*/
|
||||
R16_UINT = 0x39,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R16G16_UINT
|
||||
* OpenGL ES: GL_RG16UI
|
||||
*/
|
||||
R16G16_UINT = 0x3a,
|
||||
|
||||
/**
|
||||
* Corresponding formats:
|
||||
* Vulkan: VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16
|
||||
* OpenGL ES: N/A
|
||||
*/
|
||||
R10G10B10A10_UNORM = 0x3b,
|
||||
}
|
||||
|
||||
/**
|
||||
* Buffer usage flags, specifying how the buffer will be accessed.
|
||||
*/
|
||||
AHardwareBuffer_UsageFlags :: enum u64 {
|
||||
/**
|
||||
* The buffer will never be locked for direct CPU reads using the
|
||||
* AHardwareBuffer_lock() function. Note that reading the buffer
|
||||
* using OpenGL or Vulkan functions or memory mappings is still
|
||||
* allowed.
|
||||
*/
|
||||
CPU_READ_NEVER = 0,
|
||||
/**
|
||||
* The buffer will sometimes be locked for direct CPU reads using
|
||||
* the AHardwareBuffer_lock() function. Note that reading the
|
||||
* buffer using OpenGL or Vulkan functions or memory mappings
|
||||
* does not require the presence of this flag.
|
||||
*/
|
||||
CPU_READ_RARELY = 2,
|
||||
/**
|
||||
* The buffer will often be locked for direct CPU reads using
|
||||
* the AHardwareBuffer_lock() function. Note that reading the
|
||||
* buffer using OpenGL or Vulkan functions or memory mappings
|
||||
* does not require the presence of this flag.
|
||||
*/
|
||||
CPU_READ_OFTEN = 3,
|
||||
|
||||
/** CPU read value mask. */
|
||||
CPU_READ_MASK = 0xF,
|
||||
/**
|
||||
* The buffer will never be locked for direct CPU writes using the
|
||||
* AHardwareBuffer_lock() function. Note that writing the buffer
|
||||
* using OpenGL or Vulkan functions or memory mappings is still
|
||||
* allowed.
|
||||
*/
|
||||
CPU_WRITE_NEVER = 0 << 4,
|
||||
/**
|
||||
* The buffer will sometimes be locked for direct CPU writes using
|
||||
* the AHardwareBuffer_lock() function. Note that writing the
|
||||
* buffer using OpenGL or Vulkan functions or memory mappings
|
||||
* does not require the presence of this flag.
|
||||
*/
|
||||
CPU_WRITE_RARELY = 2 << 4,
|
||||
/**
|
||||
* The buffer will often be locked for direct CPU writes using
|
||||
* the AHardwareBuffer_lock() function. Note that writing the
|
||||
* buffer using OpenGL or Vulkan functions or memory mappings
|
||||
* does not require the presence of this flag.
|
||||
*/
|
||||
CPU_WRITE_OFTEN = 3 << 4,
|
||||
/** CPU write value mask. */
|
||||
CPU_WRITE_MASK = 0xF << 4,
|
||||
/** The buffer will be read from by the GPU as a texture. */
|
||||
GPU_SAMPLED_IMAGE = 1 << 8,
|
||||
/** The buffer will be written to by the GPU as a framebuffer attachment.*/
|
||||
GPU_FRAMEBUFFER = 1 << 9,
|
||||
/**
|
||||
* The buffer will be written to by the GPU as a framebuffer
|
||||
* attachment.
|
||||
*
|
||||
* Note that the name of this flag is somewhat misleading: it does
|
||||
* not imply that the buffer contains a color format. A buffer with
|
||||
* depth or stencil format that will be used as a framebuffer
|
||||
* attachment should also have this flag. Use the equivalent flag
|
||||
* AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER to avoid this confusion.
|
||||
*/
|
||||
GPU_COLOR_OUTPUT = GPU_FRAMEBUFFER,
|
||||
/**
|
||||
* The buffer will be used as a composer HAL overlay layer.
|
||||
*
|
||||
* This flag is currently only needed when using ASurfaceTransaction_setBuffer
|
||||
* to set a buffer. In all other cases, the framework adds this flag
|
||||
* internally to buffers that could be presented in a composer overlay.
|
||||
* ASurfaceTransaction_setBuffer is special because it uses buffers allocated
|
||||
* directly through AHardwareBuffer_allocate instead of buffers allocated
|
||||
* by the framework.
|
||||
*/
|
||||
COMPOSER_OVERLAY = 1 << 11,
|
||||
/**
|
||||
* The buffer is protected from direct CPU access or being read by
|
||||
* non-secure hardware, such as video encoders.
|
||||
*
|
||||
* This flag is incompatible with CPU read and write flags. It is
|
||||
* mainly used when handling DRM video. Refer to the EGL extension
|
||||
* EGL_EXT_protected_content and GL extension
|
||||
* GL_EXT_protected_textures for more information on how these
|
||||
* buffers are expected to behave.
|
||||
*/
|
||||
PROTECTED_CONTENT = 1 << 14,
|
||||
/** The buffer will be read by a hardware video encoder. */
|
||||
VIDEO_ENCODE = 1 << 16,
|
||||
/**
|
||||
* The buffer will be used for direct writes from sensors.
|
||||
* When this flag is present, the format must be AHARDWAREBUFFER_FORMAT_BLOB.
|
||||
*/
|
||||
SENSOR_DIRECT_DATA = 1 << 23,
|
||||
/**
|
||||
* The buffer will be used as a shader storage or uniform buffer object.
|
||||
* When this flag is present, the format must be AHARDWAREBUFFER_FORMAT_BLOB.
|
||||
*/
|
||||
GPU_DATA_BUFFER = 1 << 24,
|
||||
/**
|
||||
* The buffer will be used as a cube map texture.
|
||||
* When this flag is present, the buffer must have a layer count
|
||||
* that is a multiple of 6. Note that buffers with this flag must be
|
||||
* bound to OpenGL textures using the extension
|
||||
* GL_EXT_EGL_image_storage instead of GL_KHR_EGL_image.
|
||||
*/
|
||||
GPU_CUBE_MAP = 1 << 25,
|
||||
/**
|
||||
* The buffer contains a complete mipmap hierarchy.
|
||||
* Note that buffers with this flag must be bound to OpenGL textures using
|
||||
* the extension GL_EXT_EGL_image_storage instead of GL_KHR_EGL_image.
|
||||
*/
|
||||
GPU_MIPMAP_COMPLETE = 1 << 26,
|
||||
|
||||
/**
|
||||
* Usage: The buffer is used for front-buffer rendering. When
|
||||
* front-buffering rendering is specified, different usages may adjust their
|
||||
* behavior as a result. For example, when used as GPU_COLOR_OUTPUT the buffer
|
||||
* will behave similar to a single-buffered window. When used with
|
||||
* COMPOSER_OVERLAY, the system will try to prioritize the buffer receiving
|
||||
* an overlay plane & avoid caching it in intermediate composition buffers.
|
||||
*/
|
||||
FRONT_BUFFER = 1 << 32,
|
||||
|
||||
VENDOR_0 = 1 << 28,
|
||||
VENDOR_1 = 1 << 29,
|
||||
VENDOR_2 = 1 << 30,
|
||||
VENDOR_3 = 1 << 31,
|
||||
VENDOR_4 = 1 << 48,
|
||||
VENDOR_5 = 1 << 49,
|
||||
VENDOR_6 = 1 << 50,
|
||||
VENDOR_7 = 1 << 51,
|
||||
VENDOR_8 = 1 << 52,
|
||||
VENDOR_9 = 1 << 53,
|
||||
VENDOR_10 = 1 << 54,
|
||||
VENDOR_11 = 1 << 55,
|
||||
VENDOR_12 = 1 << 56,
|
||||
VENDOR_13 = 1 << 57,
|
||||
VENDOR_14 = 1 << 58,
|
||||
VENDOR_15 = 1 << 59,
|
||||
VENDOR_16 = 1 << 60,
|
||||
VENDOR_17 = 1 << 61,
|
||||
VENDOR_18 = 1 << 62,
|
||||
VENDOR_19 = 1 << 63,
|
||||
}
|
||||
|
||||
/**
|
||||
* Buffer description. Used for allocating new buffers and querying
|
||||
* parameters of existing ones.
|
||||
*/
|
||||
AHardwareBuffer_Desc :: struct {
|
||||
width: u32, ///< Width in pixels.
|
||||
height: u32, ///< Height in pixels.
|
||||
/**
|
||||
* Number of images in an image array. AHardwareBuffers with one
|
||||
* layer correspond to regular 2D textures. AHardwareBuffers with
|
||||
* more than layer correspond to texture arrays. If the layer count
|
||||
* is a multiple of 6 and the usage flag
|
||||
* AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP is present, the buffer is
|
||||
* a cube map or a cube map array.
|
||||
*/
|
||||
layers: u32,
|
||||
format: AHardwareBuffer_Format, ///< One of AHardwareBuffer_Format.
|
||||
usage: AHardwareBuffer_UsageFlags, ///< Combination of AHardwareBuffer_UsageFlags.
|
||||
stride: u32, ///< Row stride in pixels, ignored for AHardwareBuffer_allocate()
|
||||
rfu0: u32, ///< Initialize to zero, reserved for future use.
|
||||
rfu1: u64, ///< Initialize to zero, reserved for future use.
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds data for a single image plane.
|
||||
*/
|
||||
AHardwareBuffer_Plane :: struct {
|
||||
data: rawptr, ///< Points to first byte in plane
|
||||
pixelStride: u32, ///< Distance in bytes from the color channel of one pixel to the next
|
||||
rowStride: u32, ///< Distance in bytes from the first value of one row of the image to
|
||||
/// the first value of the next row.
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds all image planes that contain the pixel data.
|
||||
*/
|
||||
AHardwareBuffer_Planes :: struct {
|
||||
planeCount: u32, ///< Number of distinct planes
|
||||
planes: [4]AHardwareBuffer_Plane, ///< Array of image planes
|
||||
}
|
||||
|
||||
/**
|
||||
* Opaque handle for a native hardware buffer.
|
||||
*/
|
||||
AHardwareBuffer :: struct{}
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Allocates a buffer that matches the passed AHardwareBuffer_Desc.
|
||||
*
|
||||
* If allocation succeeds, the buffer can be used according to the
|
||||
* usage flags specified in its description. If a buffer is used in ways
|
||||
* not compatible with its usage flags, the results are undefined and
|
||||
* may include program termination.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*
|
||||
* \return 0 on success, or an error number of the allocation fails for
|
||||
* any reason. The returned buffer has a reference count of 1.
|
||||
*/
|
||||
AHardwareBuffer_allocate :: proc(desc: ^AHardwareBuffer_Desc, outBuffer: ^^AHardwareBuffer) -> i32 ---
|
||||
/**
|
||||
* Acquire a reference on the given AHardwareBuffer object.
|
||||
*
|
||||
* This prevents the object from being deleted until the last reference
|
||||
* is removed.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*/
|
||||
AHardwareBuffer_acquire :: proc(buffer: ^AHardwareBuffer) ---
|
||||
|
||||
/**
|
||||
* Remove a reference that was previously acquired with
|
||||
* AHardwareBuffer_acquire() or AHardwareBuffer_allocate().
|
||||
*
|
||||
* Available since API level 26.
|
||||
*/
|
||||
AHardwareBuffer_release :: proc(buffer: ^AHardwareBuffer) ---
|
||||
|
||||
/**
|
||||
* Return a description of the AHardwareBuffer in the passed
|
||||
* AHardwareBuffer_Desc struct.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*/
|
||||
AHardwareBuffer_describe :: proc(buffer: ^AHardwareBuffer, outDesc: ^AHardwareBuffer_Desc) ---
|
||||
|
||||
/**
|
||||
* Lock the AHardwareBuffer for direct CPU access.
|
||||
*
|
||||
* This function can lock the buffer for either reading or writing.
|
||||
* It may block if the hardware needs to finish rendering, if CPU caches
|
||||
* need to be synchronized, or possibly for other implementation-
|
||||
* specific reasons.
|
||||
*
|
||||
* The passed AHardwareBuffer must have one layer, otherwise the call
|
||||
* will fail.
|
||||
*
|
||||
* If \a fence is not negative, it specifies a fence file descriptor on
|
||||
* which to wait before locking the buffer. If it's negative, the caller
|
||||
* is responsible for ensuring that writes to the buffer have completed
|
||||
* before calling this function. Using this parameter is more efficient
|
||||
* than waiting on the fence and then calling this function.
|
||||
*
|
||||
* The \a usage parameter may only specify AHARDWAREBUFFER_USAGE_CPU_*.
|
||||
* If set, then outVirtualAddress is filled with the address of the
|
||||
* buffer in virtual memory. The flags must also be compatible with
|
||||
* usage flags specified at buffer creation: if a read flag is passed,
|
||||
* the buffer must have been created with
|
||||
* AHARDWAREBUFFER_USAGE_CPU_READ_RARELY or
|
||||
* AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN. If a write flag is passed, it
|
||||
* must have been created with AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY or
|
||||
* AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN.
|
||||
*
|
||||
* If \a rect is not NULL, the caller promises to modify only data in
|
||||
* the area specified by rect. If rect is NULL, the caller may modify
|
||||
* the contents of the entire buffer. The content of the buffer outside
|
||||
* of the specified rect is NOT modified by this call.
|
||||
*
|
||||
* It is legal for several different threads to lock a buffer for read
|
||||
* access none of the threads are blocked.
|
||||
*
|
||||
* Locking a buffer simultaneously for write or read/write is undefined,
|
||||
* but will neither terminate the process nor block the caller.
|
||||
* AHardwareBuffer_lock may return an error or leave the buffer's
|
||||
* content in an indeterminate state.
|
||||
*
|
||||
* If the buffer has AHARDWAREBUFFER_FORMAT_BLOB, it is legal lock it
|
||||
* for reading and writing in multiple threads and/or processes
|
||||
* simultaneously, and the contents of the buffer behave like shared
|
||||
* memory.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*
|
||||
* \return 0 on success. -EINVAL if \a buffer is NULL, the usage flags
|
||||
* are not a combination of AHARDWAREBUFFER_USAGE_CPU_*, or the buffer
|
||||
* has more than one layer. Error number if the lock fails for any other
|
||||
* reason.
|
||||
*/
|
||||
AHardwareBuffer_lock :: proc(buffer: ^AHardwareBuffer, usage: AHardwareBuffer_UsageFlags, fence: i32, rect: ^ARect, outVirtualAddress: ^rawptr) -> i32 ---
|
||||
|
||||
/**
|
||||
* Unlock the AHardwareBuffer from direct CPU access.
|
||||
*
|
||||
* Must be called after all changes to the buffer are completed by the
|
||||
* caller. If \a fence is NULL, the function will block until all work
|
||||
* is completed. Otherwise, \a fence will be set either to a valid file
|
||||
* descriptor or to -1. The file descriptor will become signaled once
|
||||
* the unlocking is complete and buffer contents are updated.
|
||||
* The caller is responsible for closing the file descriptor once it's
|
||||
* no longer needed. The value -1 indicates that unlocking has already
|
||||
* completed before the function returned and no further operations are
|
||||
* necessary.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*
|
||||
* \return 0 on success. -EINVAL if \a buffer is NULL. Error number if
|
||||
* the unlock fails for any reason.
|
||||
*/
|
||||
AHardwareBuffer_unlock :: proc(buffer: ^AHardwareBuffer, fence: ^i32) -> i32 ---
|
||||
|
||||
/**
|
||||
* Send the AHardwareBuffer to an AF_UNIX socket.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*
|
||||
* \return 0 on success, -EINVAL if \a buffer is NULL, or an error
|
||||
* number if the operation fails for any reason.
|
||||
*/
|
||||
AHardwareBuffer_sendHandleToUnixSocket :: proc(buffer: ^AHardwareBuffer, socketFd: i32) -> i32 ---
|
||||
|
||||
/**
|
||||
* Receive an AHardwareBuffer from an AF_UNIX socket.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*
|
||||
* \return 0 on success, -EINVAL if \a outBuffer is NULL, or an error
|
||||
* number if the operation fails for any reason.
|
||||
*/
|
||||
AHardwareBuffer_recvHandleFromUnixSocket :: proc(socketFd: i32, outBuffer: ^^AHardwareBuffer) -> i32 ---
|
||||
|
||||
/**
|
||||
* Lock a potentially multi-planar AHardwareBuffer for direct CPU access.
|
||||
*
|
||||
* This function is similar to AHardwareBuffer_lock, but can lock multi-planar
|
||||
* formats. The locked planes are returned in the \a outPlanes argument. Note,
|
||||
* that multi-planar should not be confused with multi-layer images, which this
|
||||
* locking function does not support.
|
||||
*
|
||||
* YUV formats are always represented by three separate planes of data, one for
|
||||
* each color plane. The order of planes in the array is guaranteed such that
|
||||
* plane #0 is always Y, plane #1 is always U (Cb), and plane #2 is always V
|
||||
* (Cr). All other formats are represented by a single plane.
|
||||
*
|
||||
* Additional information always accompanies the buffers, describing the row
|
||||
* stride and the pixel stride for each plane.
|
||||
*
|
||||
* In case the buffer cannot be locked, \a outPlanes will contain zero planes.
|
||||
*
|
||||
* See the AHardwareBuffer_lock documentation for all other locking semantics.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \return 0 on success. -EINVAL if \a buffer is NULL, the usage flags
|
||||
* are not a combination of AHARDWAREBUFFER_USAGE_CPU_*, or the buffer
|
||||
* has more than one layer. Error number if the lock fails for any other
|
||||
* reason.
|
||||
*/
|
||||
AHardwareBuffer_lockPlanes :: proc(buffer: ^AHardwareBuffer, usage: AHardwareBuffer_UsageFlags, fence: i32, rect: ^ARect, outPlanes: ^AHardwareBuffer_Planes) -> i32 ---
|
||||
|
||||
/**
|
||||
* Test whether the given format and usage flag combination is
|
||||
* allocatable.
|
||||
*
|
||||
* If this function returns true, it means that a buffer with the given
|
||||
* description can be allocated on this implementation, unless resource
|
||||
* exhaustion occurs. If this function returns false, it means that the
|
||||
* allocation of the given description will never succeed.
|
||||
*
|
||||
* The return value of this function may depend on all fields in the
|
||||
* description, except stride, which is always ignored. For example,
|
||||
* some implementations have implementation-defined limits on texture
|
||||
* size and layer count.
|
||||
*
|
||||
* Available since API level 29.
|
||||
*
|
||||
* \return 1 if the format and usage flag combination is allocatable,
|
||||
* 0 otherwise.
|
||||
*/
|
||||
AHardwareBuffer_isSupported :: proc(desc: ^AHardwareBuffer_Desc) -> i32 ---
|
||||
|
||||
/**
|
||||
* Lock an AHardwareBuffer for direct CPU access.
|
||||
*
|
||||
* This function is the same as the above lock function, but passes back
|
||||
* additional information about the bytes per pixel and the bytes per stride
|
||||
* of the locked buffer. If the bytes per pixel or bytes per stride are unknown
|
||||
* or variable, or if the underlying mapper implementation does not support returning
|
||||
* additional information, then this call will fail with INVALID_OPERATION
|
||||
*
|
||||
* Available since API level 29.
|
||||
*/
|
||||
AHardwareBuffer_lockAndGetInfo :: proc(buffer: ^AHardwareBuffer, usage: AHardwareBuffer_UsageFlags, fence: i32, rect: ^ARect, outVirtualAddress: ^rawptr, outBytesPerPixel: ^i32, outBytesPerStride: ^i32) -> i32 ---
|
||||
|
||||
|
||||
/**
|
||||
* Get the system wide unique id for an AHardwareBuffer.
|
||||
*
|
||||
* Available since API level 31.
|
||||
*
|
||||
* \return 0 on success, -EINVAL if \a buffer or \a outId is NULL, or an error number if the
|
||||
* operation fails for any reason.
|
||||
*/
|
||||
AHardwareBuffer_getId :: proc(buffer: ^AHardwareBuffer, outId: ^u64) -> i32 ---
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Return the AHardwareBuffer wrapped by a Java HardwareBuffer object.
|
||||
*
|
||||
* This method does not acquire any additional reference to the AHardwareBuffer
|
||||
* that is returned. To keep the AHardwareBuffer alive after the Java
|
||||
* HardwareBuffer object is closed, explicitly or by the garbage collector, be
|
||||
* sure to use AHardwareBuffer_acquire() to acquire an additional reference.
|
||||
*
|
||||
* Available since API level 26.
|
||||
*/
|
||||
AHardwareBuffer_fromHardwareBuffer :: proc(env: ^JNIEnv, hardwareBufferObj: jobject) -> ^AHardwareBuffer ---
|
||||
|
||||
/**
|
||||
* Return a new Java HardwareBuffer object that wraps the passed native
|
||||
* AHardwareBuffer object. The Java HardwareBuffer will acquire a reference to
|
||||
* the internal buffer and manage its lifetime. For example:
|
||||
*
|
||||
* <pre><code>
|
||||
* AHardwareBuffer* buffer
|
||||
* AHardwareBuffer_allocate(..., &buffer) // `buffer` has reference count 1
|
||||
* jobject java_result = AHardwareBuffer_toHardwareBuffer(buffer) // `buffer` has reference count 2.
|
||||
* AHardwareBuffer_release(buffer) // `buffer` has reference count 1
|
||||
* return result // The underlying buffer is kept alive by `java_result` and
|
||||
* // will be set to 0 when it is closed on the Java side with
|
||||
* // HardwareBuffer::close().
|
||||
* </code></pre>
|
||||
*
|
||||
* Available since API level 26.
|
||||
*/
|
||||
AHardwareBuffer_toHardwareBuffer :: proc(env: ^JNIEnv, hardwareBuffer: ^AHardwareBuffer) -> jobject ---
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
/**
|
||||
* These structures are used to define the display's capabilities for HDR content.
|
||||
* They can be used to better tone map content to user's display.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HDR metadata standards that are supported by Android.
|
||||
*/
|
||||
AHdrMetadataType :: enum u32 {
|
||||
HDR10_SMPTE2086 = 1,
|
||||
HDR10_CTA861_3 = 2,
|
||||
HDR10PLUS_SEI = 3,
|
||||
}
|
||||
|
||||
/**
|
||||
* Color is defined in CIE XYZ coordinates.
|
||||
*/
|
||||
AColor_xy :: struct {
|
||||
x: f32,
|
||||
y: f32,
|
||||
}
|
||||
|
||||
/**
|
||||
* SMPTE ST 2086 "Mastering Display Color Volume" static metadata
|
||||
*/
|
||||
AHdrMetadata_smpte2086 :: struct {
|
||||
displayPrimaryRed: AColor_xy,
|
||||
displayPrimaryGreen: AColor_xy,
|
||||
displayPrimaryBlue: AColor_xy,
|
||||
whitePoint: AColor_xy,
|
||||
maxLuminance: f32,
|
||||
minLuminance: f32,
|
||||
}
|
||||
|
||||
/**
|
||||
* CTA 861.3 "HDR Static Metadata Extension" static metadata
|
||||
*/
|
||||
AHdrMetadata_cta861_3 :: struct {
|
||||
maxContentLightLevel: f32,
|
||||
maxFrameAverageLightLevel: f32,
|
||||
}
|
||||
|
||||
@@ -0,0 +1,992 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/**
|
||||
* @defgroup ImageDecoder Android Image Decoder
|
||||
*
|
||||
* Functions for converting encoded images into RGBA pixels.
|
||||
*
|
||||
* Similar to the Java counterpart android.graphics.ImageDecoder, it can be used
|
||||
* to decode images in the following formats:
|
||||
* - JPEG
|
||||
* - PNG
|
||||
* - GIF
|
||||
* - WebP
|
||||
* - BMP
|
||||
* - ICO
|
||||
* - WBMP
|
||||
* - HEIF
|
||||
* - Digital negatives (via the DNG SDK)
|
||||
* <p>It has similar options for scaling, cropping, and choosing the output format.
|
||||
* Unlike the Java API, which can create an android.graphics.Bitmap or
|
||||
* android.graphics.drawable.Drawable object, AImageDecoder decodes directly
|
||||
* into memory provided by the client. For more information, see the
|
||||
* <a href="https://developer.android.com/ndk/guides/image-decoder">Image decoder</a>
|
||||
* developer guide.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* {@link AImageDecoder} functions result code.
|
||||
*
|
||||
* Introduced in API 30.
|
||||
*
|
||||
* Many functions will return this to indicate success
|
||||
* ({@link ANDROID_IMAGE_DECODER_SUCCESS}) or the reason for the failure. On
|
||||
* failure, any out-parameters should be considered uninitialized, except where
|
||||
* specified. Use {@link AImageDecoder_resultToString} for a readable
|
||||
* version of the result code.
|
||||
*/
|
||||
AImageDecoderResult :: enum i32 {
|
||||
/**
|
||||
* Decoding was successful and complete.
|
||||
*/
|
||||
SUCCESS = 0,
|
||||
/**
|
||||
* The input is incomplete.
|
||||
*/
|
||||
INCOMPLETE = -1,
|
||||
/**
|
||||
* The input contained an error after decoding some lines.
|
||||
*/
|
||||
ERROR = -2,
|
||||
/**
|
||||
* Could not convert. For example, attempting to decode an image with
|
||||
* alpha to an opaque format.
|
||||
*/
|
||||
INVALID_CONVERSION = -3,
|
||||
/**
|
||||
* The scale is invalid. It may have overflowed, or it may be incompatible
|
||||
* with the current alpha setting.
|
||||
*/
|
||||
INVALID_SCALE = -4,
|
||||
/**
|
||||
* Some other parameter is invalid.
|
||||
*/
|
||||
BAD_PARAMETER = -5,
|
||||
/**
|
||||
* Input was invalid before decoding any pixels.
|
||||
*/
|
||||
INVALID_INPUT = -6,
|
||||
/**
|
||||
* A seek was required and it failed.
|
||||
*/
|
||||
SEEK_ERROR = -7,
|
||||
/**
|
||||
* Some other error. For example, an internal allocation failed.
|
||||
*/
|
||||
INTERNAL_ERROR = -8,
|
||||
/**
|
||||
* AImageDecoder did not recognize the format.
|
||||
*/
|
||||
UNSUPPORTED_FORMAT = -9,
|
||||
/**
|
||||
* The animation has reached the end.
|
||||
*/
|
||||
FINISHED = -10,
|
||||
/**
|
||||
* This method cannot be called while the AImageDecoder is in its current
|
||||
* state. For example, various setters (like {@link AImageDecoder_setTargetSize})
|
||||
* can only be called while the AImageDecoder is set to decode the first
|
||||
* frame of an animation. This ensures that any blending and/or restoring
|
||||
* prior frames works correctly.
|
||||
*/
|
||||
INVALID_STATE = -11,
|
||||
}
|
||||
|
||||
AImageDecoderRepeatCount :: enum i32 {
|
||||
/**
|
||||
* Reported by {@link AImageDecoder_getRepeatCount} if the
|
||||
* animation should repeat forever.
|
||||
*
|
||||
* Introduced in API 31
|
||||
*/
|
||||
INFINITE = max(i32),
|
||||
}
|
||||
|
||||
/**
|
||||
* How a frame is “disposed” before showing the next one.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* This, along with other information in AImageDecoderFrameInfo,
|
||||
* can be useful for determining whether a frame is independent, but
|
||||
* the decoder handles disposing of frames, so a simple
|
||||
* sequential client does not need this.
|
||||
*/
|
||||
AImageDecoderFrameDisposalOp :: enum i32 {
|
||||
/// No disposal. The following frame will be drawn directly
|
||||
/// on top of this one.
|
||||
NONE = 1,
|
||||
/// The frame’s rectangle is cleared to transparent (by AImageDecoder)
|
||||
/// before decoding the next frame.
|
||||
BACKGROUND = 2,
|
||||
/// The frame’s rectangle is reverted to the prior frame before decoding
|
||||
/// the next frame. This is handled by AImageDecoder, unless
|
||||
/// {@link AImageDecoder_setInternallyHandleDisposePrevious} is set to false.
|
||||
PREVIOUS = 3,
|
||||
}
|
||||
|
||||
/**
|
||||
* How a frame is blended with the previous frame.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* This, along with other information in AImageDecoderFrameInfo,
|
||||
* can be useful for determining whether a frame is independent, but
|
||||
* the decoder handles blending frames, so a simple
|
||||
* sequential client does not need this.
|
||||
*/
|
||||
AImageDecoderBlendOp :: enum i32 {
|
||||
/// This frame replaces existing content. This corresponds
|
||||
/// to webp’s “do not blend”.
|
||||
SRC = 1,
|
||||
/// This frame blends with the previous frame.
|
||||
SRC_OVER = 2,
|
||||
}
|
||||
|
||||
ResultOrRepeatCount :: union {
|
||||
AImageDecoderResult,
|
||||
AImageDecoderRepeatCount,
|
||||
i32,
|
||||
}
|
||||
|
||||
ResultOrFrameDuration :: union {
|
||||
AImageDecoderResult,
|
||||
i64,
|
||||
}
|
||||
|
||||
ResultOrFrameDisposalOp :: union {
|
||||
AImageDecoderResult,
|
||||
AImageDecoderFrameDisposalOp,
|
||||
}
|
||||
|
||||
ResultOrBlendOp :: union {
|
||||
AImageDecoderResult,
|
||||
AImageDecoderBlendOp,
|
||||
}
|
||||
|
||||
/**
|
||||
* Opaque handle for decoding images.
|
||||
*
|
||||
* Introduced in API 30
|
||||
*
|
||||
* Create using one of the following:
|
||||
* - {@link AImageDecoder_createFromAAsset}
|
||||
* - {@link AImageDecoder_createFromFd}
|
||||
* - {@link AImageDecoder_createFromBuffer}
|
||||
*
|
||||
* After creation, {@link AImageDecoder_getHeaderInfo} can be used to retrieve
|
||||
* information about the encoded image. Other functions, like
|
||||
* {@link AImageDecoder_setTargetSize}, can be used to specify how to decode, and
|
||||
* {@link AImageDecoder_decodeImage} will decode into client provided memory.
|
||||
*
|
||||
* {@link AImageDecoder} objects are NOT thread-safe, and should not be shared across
|
||||
* threads.
|
||||
*/
|
||||
AImageDecoder :: struct{}
|
||||
|
||||
/**
|
||||
* Opaque handle for representing information about the encoded image.
|
||||
*
|
||||
* Introduced in API 30
|
||||
*
|
||||
* Retrieved using {@link AImageDecoder_getHeaderInfo} and passed to methods
|
||||
* like {@link AImageDecoderHeaderInfo_getWidth} and
|
||||
* {@link AImageDecoderHeaderInfo_getHeight}.
|
||||
*/
|
||||
AImageDecoderHeaderInfo :: struct{}
|
||||
|
||||
/**
|
||||
* Opaque handle to animation information about a single frame.
|
||||
*
|
||||
* Introduced in API 31
|
||||
*
|
||||
* The duration (retrieved with {@link AImageDecoderFrameInfo_getDuration}) is
|
||||
* necessary for clients to display the animation at the proper speed. The other
|
||||
* information is helpful for a client that wants to determine what frames are
|
||||
* independent (or what frames they depend on), but is unnecessary for
|
||||
* a simple client that wants to sequentially display all frames.
|
||||
*/
|
||||
AImageDecoderFrameInfo :: struct{}
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Return a constant string value representing the error code.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* Pass the return value from an {@link AImageDecoder} method (e.g.
|
||||
* {@link AImageDecoder_decodeImage}) for a text string representing the error
|
||||
* code.
|
||||
*
|
||||
* Errors:
|
||||
* - Returns null for a value out of range.
|
||||
*/
|
||||
AImageDecoder_resultToString :: proc(result: AImageDecoderResult) -> cstring ---
|
||||
|
||||
/**
|
||||
* Create a new {@link AImageDecoder} from an {@link AAsset}.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param asset {@link AAsset} containing encoded image data. Client is still
|
||||
* responsible for calling {@link AAsset_close} on it, which may be
|
||||
* done after deleting the returned {@link AImageDecoder}.
|
||||
* @param outDecoder On success (i.e. return value is
|
||||
* {@link ANDROID_IMAGE_DECODER_SUCCESS}), this will be set to
|
||||
* a newly created {@link AImageDecoder}. Caller is
|
||||
* responsible for calling {@link AImageDecoder_delete} on it.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_INCOMPLETE}: The asset was truncated before
|
||||
* reading the image header.
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: One of the parameters is
|
||||
* null.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_INPUT}: There is an error in the
|
||||
* header.
|
||||
* - {@link ANDROID_IMAGE_DECODER_SEEK_ERROR}: The asset failed to seek.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INTERNAL_ERROR}: Some other error, like a
|
||||
* failure to allocate memory.
|
||||
* - {@link ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT}: The format is not
|
||||
* supported.
|
||||
*/
|
||||
AImageDecoder_createFromAAsset :: proc(asset: ^AAsset, outDecoder: ^^AImageDecoder) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Create a new {@link AImageDecoder} from a file descriptor.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param fd Seekable, readable, open file descriptor for encoded data.
|
||||
* Client is still responsible for closing it, which may be done
|
||||
* after deleting the returned {@link AImageDecoder}.
|
||||
* @param outDecoder On success (i.e. return value is
|
||||
* {@link ANDROID_IMAGE_DECODER_SUCCESS}), this will be set to
|
||||
* a newly created {@link AImageDecoder}. Caller is
|
||||
* responsible for calling {@link AImageDecoder_delete} on it.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_INCOMPLETE}: The file was truncated before
|
||||
* reading the image header.
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The {@link AImageDecoder} is
|
||||
* null, or |fd| does not represent a valid, seekable file descriptor.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_INPUT}: There is an error in the
|
||||
* header.
|
||||
* - {@link ANDROID_IMAGE_DECODER_SEEK_ERROR}: The descriptor failed to seek.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INTERNAL_ERROR}: Some other error, like a
|
||||
* failure to allocate memory.
|
||||
* - {@link ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT}: The format is not
|
||||
* supported.
|
||||
*/
|
||||
AImageDecoder_createFromFd :: proc(fd: i32, outDecoder: ^^AImageDecoder) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Create a new AImageDecoder from a buffer.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param buffer Pointer to encoded data. Must be valid for the entire time
|
||||
* the {@link AImageDecoder} is used.
|
||||
* @param length Byte length of buffer.
|
||||
* @param outDecoder On success (i.e. return value is
|
||||
* {@link ANDROID_IMAGE_DECODER_SUCCESS}), this will be set to
|
||||
* a newly created {@link AImageDecoder}. Caller is
|
||||
* responsible for calling {@link AImageDecoder_delete} on it.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_INCOMPLETE}: The encoded image was truncated before
|
||||
* reading the image header.
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: One of the parameters is
|
||||
* invalid.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_INPUT}: There is an error in the
|
||||
* header.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INTERNAL_ERROR}: Some other error, like a
|
||||
* failure to allocate memory.
|
||||
* - {@link ANDROID_IMAGE_DECODER_UNSUPPORTED_FORMAT}: The format is not
|
||||
* supported.
|
||||
*/
|
||||
AImageDecoder_createFromBuffer :: proc(buffer: rawptr, length: uint, outDecoder: ^^AImageDecoder) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Delete the AImageDecoder.
|
||||
* @param decoder {@link AImageDecoder} object created with one of AImageDecoder_createFrom...
|
||||
* functions.
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AImageDecoder_delete :: proc(decoder: ^AImageDecoder) ---
|
||||
|
||||
/**
|
||||
* Choose the desired output format.
|
||||
*
|
||||
* If the encoded image represents an animation, this must be called while on
|
||||
* the first frame (e.g. before calling {@link AImageDecoder_advanceFrame} or
|
||||
* after calling {@link AImageDecoder_rewind}).
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param format {@link AndroidBitmapFormat} to use for the output.
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure. On failure, the
|
||||
* {@link AImageDecoder} uses the format it was already planning
|
||||
* to use (either its default or a previously successful setting
|
||||
* from this function).
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The
|
||||
* {@link AImageDecoder} is null or |format| does not correspond to an
|
||||
* {@link AndroidBitmapFormat}.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_CONVERSION}: The
|
||||
* {@link AndroidBitmapFormat} is incompatible with the image.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_STATE}: The animation is not on
|
||||
* the first frame.
|
||||
*/
|
||||
AImageDecoder_setAndroidBitmapFormat :: proc(decoder: ^AImageDecoder, format: AndroidBitmapFormat) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Specify whether the output's pixels should be unpremultiplied.
|
||||
*
|
||||
* By default, {@link AImageDecoder_decodeImage} will premultiply the pixels, if they have alpha.
|
||||
* Pass true to this method to leave them unpremultiplied. This has no effect on an
|
||||
* opaque image.
|
||||
*
|
||||
* If the encoded image represents an animation, this must be called while on
|
||||
* the first frame (e.g. before calling {@link AImageDecoder_advanceFrame} or
|
||||
* after calling {@link AImageDecoder_rewind}).
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @param unpremultipliedRequired Pass true to leave the pixels unpremultiplied.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_CONVERSION}: Unpremultiplied is not
|
||||
* possible due to an existing scale set by
|
||||
* {@link AImageDecoder_setTargetSize}.
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The
|
||||
* {@link AImageDecoder} is null.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_STATE}: The animation is not on
|
||||
* the first frame.
|
||||
*/
|
||||
AImageDecoder_setUnpremultipliedRequired :: proc(decoder: ^AImageDecoder, unpremultipliedRequired: bool) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Choose the dataspace for the output.
|
||||
*
|
||||
* Ignored by {@link ANDROID_BITMAP_FORMAT_A_8}, which does not support
|
||||
* an {@link ADataSpace}.
|
||||
*
|
||||
* If the encoded image represents an animation, this must be called while on
|
||||
* the first frame (e.g. before calling {@link AImageDecoder_advanceFrame} or
|
||||
* after calling {@link AImageDecoder_rewind}).
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @param dataspace The {@link ADataSpace} to decode into. An ADataSpace
|
||||
* specifies how to interpret the colors. By default,
|
||||
* AImageDecoder will decode into the ADataSpace specified by
|
||||
* {@link AImageDecoderHeaderInfo_getDataSpace}. If this
|
||||
* parameter is set to a different ADataSpace, AImageDecoder
|
||||
* will transform the output into the specified ADataSpace.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The
|
||||
* {@link AImageDecoder} is null or |dataspace| does not correspond to an
|
||||
* {@link ADataSpace} value.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_STATE}: The animation is not on
|
||||
* the first frame.
|
||||
*/
|
||||
AImageDecoder_setDataSpace :: proc(decoder: ^AImageDecoder, dataspace: ADataSpace) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Specify the output size for a decoded image.
|
||||
*
|
||||
* Future calls to {@link AImageDecoder_decodeImage} will sample or scale the
|
||||
* encoded image to reach the desired size. If a crop rect is set (via
|
||||
* {@link AImageDecoder_setCrop}), it must be contained within the dimensions
|
||||
* specified by width and height, and the output image will be the size of the
|
||||
* crop rect.
|
||||
*
|
||||
* If the encoded image represents an animation, this must be called while on
|
||||
* the first frame (e.g. before calling {@link AImageDecoder_advanceFrame} or
|
||||
* after calling {@link AImageDecoder_rewind}).
|
||||
*
|
||||
* It is strongly recommended to use setTargetSize only for downscaling, as it
|
||||
* is often more efficient to scale-up when rendering than up-front due to
|
||||
* reduced overall memory.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @param width Width of the output (prior to cropping).
|
||||
* This will affect future calls to
|
||||
* {@link AImageDecoder_getMinimumStride}, which will now return
|
||||
* a value based on this width.
|
||||
* @param height Height of the output (prior to cropping).
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The
|
||||
* {@link AImageDecoder} is null.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_SCALE}: |width| or |height| is <= 0,
|
||||
* the size is too big, any existing crop is not contained by the new image
|
||||
* dimensions, or the scale is incompatible with a previous call to
|
||||
* {@link AImageDecoder_setUnpremultipliedRequired}(true).
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_STATE}: The animation is not on
|
||||
* the first frame.
|
||||
*/
|
||||
AImageDecoder_setTargetSize :: proc(decoder: ^AImageDecoder, width: i32, height: i32) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Compute the dimensions to use for a given sampleSize.
|
||||
*
|
||||
* Although AImageDecoder can scale to an arbitrary target size (see
|
||||
* {@link AImageDecoder_setTargetSize}), some sizes may be more efficient than
|
||||
* others. This computes the most efficient target size to use to reach a
|
||||
* particular sampleSize.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @param sampleSize A subsampling rate of the original image. Must be greater
|
||||
* than or equal to 1. A sampleSize of 2 means to skip every
|
||||
* other pixel/line, resulting in a width and height that are
|
||||
* 1/2 of the original dimensions, with 1/4 the number of
|
||||
* pixels.
|
||||
* @param width Out parameter for the width sampled by sampleSize, and rounded
|
||||
* in the direction that the decoder can do most efficiently.
|
||||
* @param height Out parameter for the height sampled by sampleSize, and rounded
|
||||
* in the direction that the decoder can do most efficiently.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The
|
||||
* {@link AImageDecoder}, |width| or |height| is null or |sampleSize| is < 1.
|
||||
*/
|
||||
AImageDecoder_computeSampledSize :: proc(decoder: ^AImageDecoder, sampleSize: i32, width: ^i32, height: ^i32) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Specify how to crop the output after scaling (if any).
|
||||
*
|
||||
* Future calls to {@link AImageDecoder_decodeImage} will crop their output to
|
||||
* the specified {@link ARect}. Clients will only need to allocate enough memory
|
||||
* for the cropped ARect.
|
||||
*
|
||||
* If the encoded image represents an animation, this must be called while on
|
||||
* the first frame (e.g. before calling {@link AImageDecoder_advanceFrame} or
|
||||
* after calling {@link AImageDecoder_rewind}).
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @param crop Rectangle describing a crop of the decode. It must be contained inside of
|
||||
* the (possibly scaled, by {@link AImageDecoder_setTargetSize})
|
||||
* image dimensions. This will affect future calls to
|
||||
* {@link AImageDecoder_getMinimumStride}, which will now return a
|
||||
* value based on the width of the crop. An empty ARect -
|
||||
* specifically { 0, 0, 0, 0 } - may be used to remove the cropping
|
||||
* behavior. Any other empty or unsorted ARects will result in
|
||||
* returning {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The
|
||||
* {@link AImageDecoder} is null, or the crop is not contained by the
|
||||
* (possibly scaled) image dimensions.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_STATE}: The animation is not on
|
||||
* the first frame.
|
||||
*/
|
||||
AImageDecoder_setCrop :: proc(decoder: ^AImageDecoder, crop: ARect) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Return an opaque handle for reading header info.
|
||||
*
|
||||
* This is owned by the {@link AImageDecoder} and will be destroyed when the
|
||||
* AImageDecoder is destroyed via {@link AImageDecoder_delete}.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AImageDecoder_getHeaderInfo :: proc(decoder: ^AImageDecoder) -> ^AImageDecoderHeaderInfo ---
|
||||
|
||||
/**
|
||||
* Report the native width of the encoded image. This is also the logical
|
||||
* pixel width of the output, unless {@link AImageDecoder_setTargetSize} is
|
||||
* used to choose a different size or {@link AImageDecoder_setCrop} is used to
|
||||
* set a crop rect.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AImageDecoderHeaderInfo_getWidth :: proc(header_info: ^AImageDecoderHeaderInfo) -> i32 ---
|
||||
|
||||
/**
|
||||
* Report the native height of the encoded image. This is also the logical
|
||||
* pixel height of the output, unless {@link AImageDecoder_setTargetSize} is
|
||||
* used to choose a different size or {@link AImageDecoder_setCrop} is used to
|
||||
* set a crop rect.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AImageDecoderHeaderInfo_getHeight :: proc(header_info: ^AImageDecoderHeaderInfo) -> i32 ---
|
||||
|
||||
/**
|
||||
* Report the mimeType of the encoded image.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @return a string literal describing the mime type.
|
||||
*/
|
||||
AImageDecoderHeaderInfo_getMimeType :: proc(header_info: ^AImageDecoderHeaderInfo) -> cstring ---
|
||||
|
||||
/**
|
||||
* Report the {@link AndroidBitmapFormat} the AImageDecoder will decode to
|
||||
* by default. {@link AImageDecoder} will try to choose one that is sensible
|
||||
* for the image and the system. Note that this does not indicate the
|
||||
* encoded format of the image.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AImageDecoderHeaderInfo_getAndroidBitmapFormat :: proc(header_info: ^AImageDecoderHeaderInfo) -> AndroidBitmapFormat ---
|
||||
|
||||
/**
|
||||
* Report how the {@link AImageDecoder} will handle alpha by default. If the image
|
||||
* contains no alpha (according to its header), this will return
|
||||
* {@link ANDROID_BITMAP_FLAGS_ALPHA_OPAQUE}. If the image may contain alpha,
|
||||
* this returns {@link ANDROID_BITMAP_FLAGS_ALPHA_PREMUL}, because
|
||||
* {@link AImageDecoder_decodeImage} will premultiply pixels by default.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* Starting in API level 31, an AImageDecoder may contain multiple frames of an
|
||||
* animation, but this method still only reports whether the first frame has
|
||||
* alpha.
|
||||
*/
|
||||
AImageDecoderHeaderInfo_getAlphaFlags :: proc(header_info: ^AImageDecoderHeaderInfo) -> AndroidBitmapFlagsAlpha ---
|
||||
|
||||
/**
|
||||
* Report the dataspace the AImageDecoder will decode to by default.
|
||||
*
|
||||
* By default, {@link AImageDecoder_decodeImage} will not do any color
|
||||
* conversion.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* @return The {@link ADataSpace} representing the way the colors
|
||||
* are encoded (or {@link ADATASPACE_UNKNOWN} if there is not a
|
||||
* corresponding ADataSpace). This specifies how to interpret the colors
|
||||
* in the decoded image, unless {@link AImageDecoder_setDataSpace} is
|
||||
* called to decode to a different ADataSpace.
|
||||
*
|
||||
* Note that ADataSpace only exposes a few values. This may return
|
||||
* {@link ADATASPACE_UNKNOWN}, even for Named ColorSpaces, if they have
|
||||
* no corresponding {@link ADataSpace}.
|
||||
*/
|
||||
AImageDecoderHeaderInfo_getDataSpace :: proc(header_info: ^AImageDecoderHeaderInfo) -> ADataSpace ---
|
||||
|
||||
/**
|
||||
* Return the minimum stride that can be used in
|
||||
* {@link AImageDecoder_decodeImage}.
|
||||
*
|
||||
* This stride provides no padding, meaning it will be exactly equal to the
|
||||
* width times the number of bytes per pixel for the {@link AndroidBitmapFormat}
|
||||
* being used.
|
||||
*
|
||||
* If the output is scaled (via {@link AImageDecoder_setTargetSize}) and/or
|
||||
* cropped (via {@link AImageDecoder_setCrop}), this takes those into account.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
AImageDecoder_getMinimumStride :: proc(decoder: ^AImageDecoder) -> uint ---
|
||||
|
||||
/**
|
||||
* Decode the image into pixels, using the settings of the {@link AImageDecoder}.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*
|
||||
* Starting in API level 31, it can be used to decode all of the frames of an
|
||||
* animated image (i.e. GIF, WebP) using new APIs. Internally,
|
||||
* AImageDecoder keeps track of its "current frame" - that is, the frame that
|
||||
* will be decoded by a call to AImageDecoder_decodeImage. At creation time, the
|
||||
* current frame is always the first frame, and multiple calls to this method
|
||||
* will each decode the first frame. {@link AImageDecoder_advanceFrame} advances
|
||||
* the current frame to the following frame, so that future calls to this method
|
||||
* will decode that frame. Some frames may update only part of the image. They
|
||||
* may only update a sub-rectangle (see {@link
|
||||
* AImageDecoderFrameInfo_getFrameRect}), or they may have alpha (see
|
||||
* {@link AImageDecoderFrameInfo_hasAlphaWithinBounds}). In these cases, this
|
||||
* method assumes that the prior frame is still residing in the |pixels| buffer,
|
||||
* decodes only the new portion, and blends it with the buffer. Frames that change
|
||||
* the entire |pixels| buffer are "independent", and do not require the prior
|
||||
* frame to remain in the buffer. The first frame is always independent. A
|
||||
* sophisticated client can use information from the {@link AImageDecoderFrameInfo}
|
||||
* to determine whether other frames are independent, or what frames they rely on.
|
||||
*
|
||||
* If the current frame is marked {@link ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS},
|
||||
* AImageDecoder_decodeImage will store the |pixels| buffer prior to decoding
|
||||
* (note: this only happens for the first in a string of consecutive
|
||||
* ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS frames). After advancing to the
|
||||
* following frame, AImageDecoder_decodeImage will restore that buffer prior to
|
||||
* decoding that frame. This is the default behavior, but it can be disabled
|
||||
* by passing false to {@link AImageDecoder_setInternallyHandleDisposePrevious}.
|
||||
*
|
||||
* Ignoring timing information, display, etc, a client wishing to decode all
|
||||
* frames of an animated image may conceptually use code like the following:
|
||||
*
|
||||
* while (true) {
|
||||
* int result = AImageDecoder_decodeImage(decoder, pixels, stride, size);
|
||||
* if (result != ANDROID_IMAGE_DECODER_SUCCESS) break;
|
||||
*
|
||||
* // Display or save the image in |pixels|, keeping the buffer intact for
|
||||
* // AImageDecoder to decode the next frame correctly.
|
||||
* Application_viewImage(pixels);
|
||||
*
|
||||
* result = AImageDecoder_advanceFrame(decoder);
|
||||
* if (result != ANDROID_IMAGE_DECODER_SUCCESS) break;
|
||||
* }
|
||||
*
|
||||
* @param decoder Opaque object representing the decoder.
|
||||
* @param pixels On success, will be filled with the result
|
||||
* of the decode. Must be large enough to hold |size| bytes.
|
||||
* @param stride Width in bytes of a single row. Must be at least
|
||||
* {@link AImageDecoder_getMinimumStride} and a multiple of the
|
||||
* bytes per pixel of the {@link AndroidBitmapFormat}.
|
||||
* @param size Size of the pixel buffer in bytes. Must be at least
|
||||
* stride * (height - 1) +
|
||||
* {@link AImageDecoder_getMinimumStride}.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_INCOMPLETE}: The image was truncated. A
|
||||
* partial image was decoded, and undecoded lines have been initialized to all
|
||||
* zeroes.
|
||||
* - {@link ANDROID_IMAGE_DECODER_ERROR}: The image contained an error. A
|
||||
* partial image was decoded, and undecoded lines have been initialized to all
|
||||
* zeroes.
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The {@link AImageDecoder} or
|
||||
* |pixels| is null, the stride is not large enough or not pixel aligned, or
|
||||
* |size| is not large enough.
|
||||
* - {@link ANDROID_IMAGE_DECODER_SEEK_ERROR}: The asset or file descriptor
|
||||
* failed to seek.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INTERNAL_ERROR}: Some other error, like a
|
||||
* failure to allocate memory.
|
||||
* - {@link ANDROID_IMAGE_DECODER_FINISHED}: The input contains no
|
||||
* more frames. No decoding occurred. The client must call
|
||||
* {@link AImageDecoder_rewind} before calling
|
||||
* {@link AImageDecoder_decodeImage} again.
|
||||
*/
|
||||
AImageDecoder_decodeImage :: proc(decoder: ^AImageDecoder, pixels: rawptr, stride: uint, size: uint) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Return true iff the image is animated - i.e. has multiple frames.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* A single frame GIF is considered to *not* be animated. This may require
|
||||
* seeking past the first frame to verify whether there is a following frame.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
*
|
||||
* Errors:
|
||||
* - returns false if |decoder| is null.
|
||||
*/
|
||||
AImageDecoder_isAnimated :: proc(decoder: ^AImageDecoder) -> bool ---
|
||||
|
||||
|
||||
/**
|
||||
* Report how many times the animation should repeat.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* This does not include the first play through. e.g. a repeat
|
||||
* count of 4 means that each frame is played 5 times.
|
||||
*
|
||||
* {@link ANDROID_IMAGE_DECODER_INFINITE} means to repeat forever.
|
||||
*
|
||||
* This may require seeking.
|
||||
*
|
||||
* For non-animated formats, this returns 0. It may return non-zero for
|
||||
* an image with only one frame (i.e. {@link AImageDecoder_isAnimated} returns
|
||||
* false) if the encoded image contains a repeat count.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @return Number of times to repeat on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The AImageDecoder
|
||||
* is null.
|
||||
*/
|
||||
AImageDecoder_getRepeatCount :: proc(decoder: ^AImageDecoder) -> ResultOrRepeatCount ---
|
||||
|
||||
/**
|
||||
* Advance to the next frame in the animation.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* The AImageDecoder keeps track internally which frame it is ready to decode
|
||||
* (the "current frame"). Initially it is set to decode the first frame, and
|
||||
* each call to {@link AImageDecoder_decodeImage} will continue to decode
|
||||
* the same frame until this method (or {@link AImageDecoder_rewind})
|
||||
* is called.
|
||||
*
|
||||
* Note that this can be used to skip a frame without decoding it. But
|
||||
* some frames depend on (i.e. blend with) prior frames, and
|
||||
* AImageDecoder_decodeImage assumes that the prior frame is in the
|
||||
* |pixels| buffer. In addition, AImageDecoder_decodeImage handles caching and
|
||||
* restoring frames (see {@link ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS}), so
|
||||
* skipping frames in an image with such frames may not produce the correct
|
||||
* results.
|
||||
*
|
||||
* Only supported by {@link ANDROID_BITMAP_FORMAT_RGBA_8888} and
|
||||
* {@link ANDROID_BITMAP_FORMAT_RGBA_F16}.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The AImageDecoder
|
||||
* represents an image that is not animated (see
|
||||
* {@link AImageDecoder_isAnimated}) or the AImageDecoder is null.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INVALID_STATE): The requested
|
||||
* {@link AndroidBitmapFormat} does not support animation.
|
||||
* - {@link ANDROID_IMAGE_DECODER_INCOMPLETE}: The input appears
|
||||
* to be truncated. The client must call {@link AImageDecoder_rewind}
|
||||
* before calling {@link AImageDecoder_decodeImage} again.
|
||||
* - {@link ANDROID_IMAGE_DECODER_ERROR}: The input contains an error.
|
||||
* The client must call {@link AImageDecoder_rewind} before
|
||||
* calling {@link AImageDecoder_decodeImage} again.
|
||||
* - {@link ANDROID_IMAGE_DECODER_FINISHED}: The input contains no
|
||||
* more frames. The client must call {@link AImageDecoder_rewind}
|
||||
* before calling {@link AImageDecoder_decodeImage} again.
|
||||
*/
|
||||
AImageDecoder_advanceFrame :: proc(decoder: ^AImageDecoder) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Return to the beginning of the animation.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* After this call, the AImageDecoder will be ready to decode the
|
||||
* first frame of the animation. This can be called after reaching
|
||||
* the end of the animation or an error or in the middle of the
|
||||
* animation.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: The AImageDecoder
|
||||
* represents an image that is not animated (see
|
||||
* {@link AImageDecoder_isAnimated}) or the AImageDecoder is
|
||||
* null.
|
||||
* - {@link ANDROID_IMAGE_DECODER_SEEK_ERROR}: The asset or file
|
||||
* descriptor failed to seek.
|
||||
*/
|
||||
AImageDecoder_rewind :: proc(decoder: ^AImageDecoder) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Create an uninitialized AImageDecoderFrameInfo.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* This can be passed to {@link AImageDecoder_getFrameInfo} to fill
|
||||
* in information about the current frame. It may be reused.
|
||||
*
|
||||
* Must be deleted with {@link AImageDecoderFrameInfo_delete}.
|
||||
*/
|
||||
AImageDecoderFrameInfo_create :: proc() -> ^AImageDecoderFrameInfo ---
|
||||
|
||||
/**
|
||||
* Delete an AImageDecoderFrameInfo.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*/
|
||||
AImageDecoderFrameInfo_delete :: proc(info: ^AImageDecoderFrameInfo) ---
|
||||
|
||||
/**
|
||||
* Fill |info| with information about the current frame.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* Initially, this will return information about the first frame.
|
||||
* {@link AImageDecoder_advanceFrame} and
|
||||
* {@link AImageDecoder_rewind} can be used to change which frame
|
||||
* is the current frame.
|
||||
*
|
||||
* If the image only has one frame, this will fill the {@link
|
||||
* AImageDecoderFrameInfo} with the encoded info and reasonable
|
||||
* defaults.
|
||||
*
|
||||
* If {@link AImageDecoder_advanceFrame} succeeded, this will succeed as well.
|
||||
*
|
||||
* @param decoder Opaque object representing the decoder.
|
||||
* @param info Opaque object to hold frame information. On success, will be
|
||||
* filled with information regarding the current frame.
|
||||
* @return {@link ANDROID_IMAGE_DECODER_SUCCESS} on success or a value
|
||||
* indicating the reason for the failure.
|
||||
*
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER}: One of the parameters is null.
|
||||
* - {@link ANDROID_IMAGE_DECODER_FINISHED}: The input contains no
|
||||
* more frames. The client must call {@link AImageDecoder_rewind} to reset the
|
||||
* current frame to a valid frame (0).
|
||||
*/
|
||||
AImageDecoder_getFrameInfo :: proc(decoder: ^AImageDecoder, info: ^AImageDecoderFrameInfo) -> AImageDecoderResult ---
|
||||
|
||||
/**
|
||||
* Report the number of nanoseconds to show the current frame.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* Errors:
|
||||
* - returns {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER} if |info| is null.
|
||||
*/
|
||||
AImageDecoderFrameInfo_getDuration :: proc(info: ^AImageDecoderFrameInfo) -> ResultOrFrameDuration ---
|
||||
|
||||
/**
|
||||
* The rectangle of the image (within 0, 0,
|
||||
* {@link AImageDecoderHeaderInfo_getWidth}, {@link AImageDecoderHeaderInfo_getHeight})
|
||||
* updated by this frame.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* Note that this is unaffected by calls to
|
||||
* {@link AImageDecoder_setTargetSize} or
|
||||
* {@link AImageDecoder_setCrop}.
|
||||
*
|
||||
* A frame may update only part of the image. This will always be
|
||||
* contained by the image’s dimensions.
|
||||
*
|
||||
* This, along with other information in AImageDecoderFrameInfo,
|
||||
* can be useful for determining whether a frame is independent, but
|
||||
* the decoder handles blending frames, so a simple
|
||||
* sequential client does not need this.
|
||||
*
|
||||
* Errors:
|
||||
* - returns an empty ARect if |info| is null.
|
||||
*/
|
||||
AImageDecoderFrameInfo_getFrameRect :: proc(info: ^AImageDecoderFrameInfo) -> ARect ---
|
||||
|
||||
/**
|
||||
* Whether the new portion of this frame may contain alpha.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* Unless this frame is independent (see {@link AImageDecoder_decodeImage}),
|
||||
* a single call to {@link AImageDecoder_decodeImage} will decode an updated
|
||||
* rectangle of pixels and then blend it with the existing pixels in the
|
||||
* |pixels| buffer according to {@link AImageDecoderFrameInfo_getBlendOp}. This
|
||||
* method returns whether the updated rectangle has alpha, prior to blending.
|
||||
* The return value is conservative for example, if a color-index-based frame
|
||||
* has a color with alpha but does not use it, this will still return true.
|
||||
*
|
||||
* This, along with other information in AImageDecoderFrameInfo,
|
||||
* can be useful for determining whether a frame is independent, but
|
||||
* the decoder handles blending frames, so a simple
|
||||
* sequential client does not need this.
|
||||
*
|
||||
* Note that this may differ from whether the composed frame (that is, the
|
||||
* resulting image after blending) has alpha. If this frame does not fill the
|
||||
* entire image dimensions (see {@link AImageDecoderFrameInfo_getFrameRect})
|
||||
* or it blends with an opaque frame, for example, the composed frame’s alpha
|
||||
* may not match.
|
||||
*
|
||||
* Errors:
|
||||
* - returns false if |info| is null.
|
||||
*/
|
||||
AImageDecoderFrameInfo_hasAlphaWithinBounds :: proc(info: ^AImageDecoderFrameInfo) -> bool ---
|
||||
|
||||
/**
|
||||
* Return how this frame is “disposed” before showing the next one.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* This, along with other information in AImageDecoderFrameInfo,
|
||||
* can be useful for determining whether a frame is independent, but
|
||||
* the decoder handles disposing of frames, so a simple
|
||||
* sequential client does not need this.
|
||||
*
|
||||
* @return one of:
|
||||
* - {@link ANDROID_IMAGE_DECODER_DISPOSE_OP_NONE}
|
||||
* - {@link ANDROID_IMAGE_DECODER_DISPOSE_OP_BACKGROUND}
|
||||
* - {@link ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS}
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER} if |info| is null.
|
||||
*/
|
||||
AImageDecoderFrameInfo_getDisposeOp :: proc(info: ^AImageDecoderFrameInfo) -> ResultOrFrameDisposalOp ---
|
||||
|
||||
/**
|
||||
* Return how this frame is blended with the previous frame.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* This, along with other information in AImageDecoderFrameInfo,
|
||||
* can be useful for determining whether a frame is independent, but
|
||||
* the decoder handles blending frames, so a simple
|
||||
* sequential client does not need this.
|
||||
*
|
||||
* @return one of:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BLEND_OP_SRC}
|
||||
* - {@link ANDROID_IMAGE_DECODER_BLEND_OP_SRC_OVER}
|
||||
* Errors:
|
||||
* - {@link ANDROID_IMAGE_DECODER_BAD_PARAMETER} if |info| is null.
|
||||
*/
|
||||
AImageDecoderFrameInfo_getBlendOp :: proc(info: ^AImageDecoderFrameInfo) -> ResultOrBlendOp ---
|
||||
|
||||
/**
|
||||
* Whether to have AImageDecoder store the frame prior to a
|
||||
* frame marked {@link ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS}.
|
||||
*
|
||||
* Introduced in API 31.
|
||||
*
|
||||
* The default is true. Many images will not have such a frame (it
|
||||
* is not supported by WebP, and only some GIFs use it). But
|
||||
* if frame i is ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS, then i+1
|
||||
* may depend on i-1. When this setting is true, AImageDecoder will
|
||||
* defensively copy frame i-1 (i.e. the contents of |pixels| in
|
||||
* {@link AImageDecoder_decodeImage}) into an internal buffer so that
|
||||
* it can be used to decode i+1.
|
||||
*
|
||||
* AImageDecoder will only store a single frame, at the size specified
|
||||
* by {@link AImageDecoder_setTargetSize} (or the original dimensions
|
||||
* if that method has not been called), and will discard it when it is
|
||||
* no longer necessary.
|
||||
*
|
||||
* A client that desires to manually store such frames may set this to
|
||||
* false, so that AImageDecoder does not need to store this extra
|
||||
* frame. Instead, when decoding the same
|
||||
* ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS frame i, AImageDecoder
|
||||
* will decode directly into |pixels|, assuming the client stored i-1.
|
||||
* When asked to decode frame i+1, AImageDecoder will now assume that
|
||||
* the client provided i-1 in |pixels|.
|
||||
*
|
||||
* @param decoder an {@link AImageDecoder} object.
|
||||
* @param handleInternally Whether AImageDecoder will internally
|
||||
* handle ANDROID_IMAGE_DECODER_DISPOSE_OP_PREVIOUS
|
||||
* frames.
|
||||
*/
|
||||
AImageDecoder_setInternallyHandleDisposePrevious :: proc(decoder: ^AImageDecoder, handleInternally: bool) ---
|
||||
}
|
||||
+1289
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,367 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
|
||||
/* Primitive types that match up with Java equivalents. */
|
||||
jboolean :: c.uint8_t /* unsigned 8 bits */
|
||||
jbyte :: c.int8_t /* signed 8 bits */
|
||||
jchar :: c.uint16_t /* unsigned 16 bits */
|
||||
jshort :: c.int16_t /* signed 16 bits */
|
||||
jint :: c.int32_t /* signed 32 bits */
|
||||
jlong :: c.int64_t /* signed 64 bits */
|
||||
jfloat :: c.float /* 32-bit IEEE 754 */
|
||||
jdouble :: c.double /* 64-bit IEEE 754 */
|
||||
|
||||
/* "cardinal indices and sizes" */
|
||||
jsize :: jint
|
||||
|
||||
/*
|
||||
* Reference types, in C.
|
||||
*/
|
||||
jobject :: distinct rawptr
|
||||
jclass :: distinct jobject
|
||||
jstring :: distinct jobject
|
||||
jarray :: distinct jobject
|
||||
jobjectArray :: distinct jarray
|
||||
jbooleanArray :: distinct jarray
|
||||
jbyteArray :: distinct jarray
|
||||
jcharArray :: distinct jarray
|
||||
jshortArray :: distinct jarray
|
||||
jintArray :: distinct jarray
|
||||
jlongArray :: distinct jarray
|
||||
jfloatArray :: distinct jarray
|
||||
jdoubleArray :: distinct jarray
|
||||
jthrowable :: distinct jobject
|
||||
jweak :: distinct jobject
|
||||
|
||||
// Opaque
|
||||
jfieldID :: rawptr
|
||||
jmethodID :: rawptr
|
||||
|
||||
jvalue :: struct #raw_union {
|
||||
z: jboolean,
|
||||
b: jbyte,
|
||||
c: jchar,
|
||||
s: jshort,
|
||||
i: jint,
|
||||
j: jlong,
|
||||
f: jfloat,
|
||||
d: jdouble,
|
||||
l: jobject,
|
||||
}
|
||||
|
||||
jobjectRefType :: enum c.int {
|
||||
JNIInvalidRefType = 0,
|
||||
JNILocalRefType = 1,
|
||||
JNIGlobalRefType = 2,
|
||||
JNIWeakGlobalRefType = 3
|
||||
}
|
||||
|
||||
JNINativeMethod :: struct {
|
||||
name: cstring,
|
||||
signature: cstring,
|
||||
fnPtr: rawptr,
|
||||
}
|
||||
|
||||
JavaVM :: ^JNIInvokeInterface
|
||||
JNIEnv :: ^JNINativeInterface
|
||||
|
||||
// NOTE: JNINativeInterface and JNIInvokeInterface don't use the aliased pointer types because of they're considered
|
||||
// not defined when used inside the structs so we just refer to the struct itself and add an extra pointer hat ^
|
||||
|
||||
/*
|
||||
* Table of interface function pointers.
|
||||
*/
|
||||
JNINativeInterface :: struct {
|
||||
reserved0: rawptr,
|
||||
reserved1: rawptr,
|
||||
reserved2: rawptr,
|
||||
reserved3: rawptr,
|
||||
|
||||
GetVersion: #type proc "c" (jni: ^^JNINativeInterface) -> jint,
|
||||
|
||||
DefineClass: #type proc "c" (jni: ^^JNINativeInterface, name: cstring, loader: jobject, #by_ptr buf: jbyte, bufLen: jsize) -> jclass,
|
||||
FindClass: #type proc "c" (jni: ^^JNINativeInterface, name: cstring) -> jclass,
|
||||
|
||||
FromReflectedMethod: #type proc "c" (jni: ^^JNINativeInterface, method: jobject) -> jmethodID,
|
||||
FromReflectedField: #type proc "c" (jni: ^^JNINativeInterface, field: jobject) -> jfieldID,
|
||||
/* spec doesn't show jboolean parameter */
|
||||
ToReflectedMethod: #type proc "c" (jni: ^^JNINativeInterface, cls: jclass, methodID: jmethodID, isStatic: jboolean) -> jobject,
|
||||
|
||||
GetSuperclass: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass) -> jclass,
|
||||
IsAssignableFrom: #type proc "c" (jni: ^^JNINativeInterface, clazz1: jclass, clazz2: jclass) -> jboolean,
|
||||
|
||||
/* spec doesn't show jboolean parameter */
|
||||
ToReflectedField: #type proc "c" (jni: ^^JNINativeInterface, cls: jclass, fieldID: jfieldID, isStatic: jboolean) -> jobject,
|
||||
|
||||
Throw: #type proc "c" (jni: ^^JNINativeInterface, obj: jthrowable) -> jint,
|
||||
ThrowNew: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, message: cstring) -> jint,
|
||||
ExceptionOccurred: #type proc "c" (jni: ^^JNINativeInterface),
|
||||
ExceptionDescribe: #type proc "c" (jni: ^^JNINativeInterface),
|
||||
ExceptionClear: #type proc "c" (jni: ^^JNINativeInterface),
|
||||
FatalError: #type proc "c" (jni: ^^JNINativeInterface, msg: cstring),
|
||||
|
||||
PushLocalFrame: #type proc "c" (jni: ^^JNINativeInterface, capacity: jint) -> jint,
|
||||
PopLocalFrame: #type proc "c" (jni: ^^JNINativeInterface, result: jobject) -> jobject,
|
||||
|
||||
NewGlobalRef: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject) -> jobject,
|
||||
DeleteGlobalRef: #type proc "c" (jni: ^^JNINativeInterface, globalRef: jobject),
|
||||
DeleteLocalRef: #type proc "c" (jni: ^^JNINativeInterface, localRef: jobject),
|
||||
IsSameObject: #type proc "c" (jni: ^^JNINativeInterface, ref1: jobject, ref2: jobject) -> jboolean,
|
||||
|
||||
NewLocalRef: #type proc "c" (jni: ^^JNINativeInterface, ref: jobject) -> jobject,
|
||||
EnsureLocalCapacity: #type proc "c" (jni: ^^JNINativeInterface, capacity: jint) -> jint,
|
||||
|
||||
AllocObject: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass) -> jobject,
|
||||
NewObject: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jobject,
|
||||
NewObjectV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jobject,
|
||||
NewObjectA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jobject,
|
||||
|
||||
GetObjectClass: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject) -> jclass,
|
||||
IsInstanceOf: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass) -> jboolean,
|
||||
GetMethodID: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, name: cstring, sig: cstring) -> jmethodID,
|
||||
|
||||
// TODO: should va_list args be pointers?
|
||||
CallObjectMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jobject,
|
||||
CallObjectMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jobject,
|
||||
CallObjectMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jobject,
|
||||
CallBooleanMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jboolean,
|
||||
CallBooleanMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jboolean,
|
||||
CallBooleanMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jboolean,
|
||||
CallByteMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jbyte,
|
||||
CallByteMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jbyte,
|
||||
CallByteMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jbyte,
|
||||
CallCharMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jchar,
|
||||
CallCharMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jchar,
|
||||
CallCharMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jchar,
|
||||
CallShortMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jshort,
|
||||
CallShortMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jshort,
|
||||
CallShortMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jshort,
|
||||
CallIntMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jint,
|
||||
CallIntMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jint,
|
||||
CallIntMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jint,
|
||||
CallLongMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jlong,
|
||||
CallLongMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jlong,
|
||||
CallLongMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jlong,
|
||||
CallFloatMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jfloat,
|
||||
CallFloatMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jfloat,
|
||||
CallFloatMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jfloat,
|
||||
CallDoubleMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any) -> jdouble,
|
||||
CallDoubleMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list) -> jdouble,
|
||||
CallDoubleMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue) -> jdouble,
|
||||
CallVoidMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #c_vararg args: ..any),
|
||||
CallVoidMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, args: ^c.va_list),
|
||||
CallVoidMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, methodID: jmethodID, #by_ptr args: jvalue),
|
||||
|
||||
CallNonvirtualObjectMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jobject,
|
||||
CallNonvirtualObjectMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jobject,
|
||||
CallNonvirtualObjectMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jobject,
|
||||
CallNonvirtualBooleanMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jboolean,
|
||||
CallNonvirtualBooleanMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jboolean,
|
||||
CallNonvirtualBooleanMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jboolean,
|
||||
CallNonvirtualByteMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jbyte,
|
||||
CallNonvirtualByteMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jbyte,
|
||||
CallNonvirtualByteMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jbyte,
|
||||
CallNonvirtualCharMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jchar,
|
||||
CallNonvirtualCharMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jchar,
|
||||
CallNonvirtualCharMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jchar,
|
||||
CallNonvirtualShortMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jshort,
|
||||
CallNonvirtualShortMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jshort,
|
||||
CallNonvirtualShortMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jshort,
|
||||
CallNonvirtualIntMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jint,
|
||||
CallNonvirtualIntMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jint,
|
||||
CallNonvirtualIntMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jint,
|
||||
CallNonvirtualLongMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jlong,
|
||||
CallNonvirtualLongMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jlong,
|
||||
CallNonvirtualLongMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jlong,
|
||||
CallNonvirtualFloatMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jfloat,
|
||||
CallNonvirtualFloatMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jfloat,
|
||||
CallNonvirtualFloatMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jfloat,
|
||||
CallNonvirtualDoubleMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jdouble,
|
||||
CallNonvirtualDoubleMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jdouble,
|
||||
CallNonvirtualDoubleMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jdouble,
|
||||
CallNonvirtualVoidMethod: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any),
|
||||
CallNonvirtualVoidMethodV: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, args: ^c.va_list),
|
||||
CallNonvirtualVoidMethodA: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue),
|
||||
|
||||
GetFieldID: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, name: cstring, sig: cstring) -> jfieldID,
|
||||
|
||||
GetObjectField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jobject,
|
||||
GetBooleanField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jboolean,
|
||||
GetByteField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jbyte,
|
||||
GetCharField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jchar,
|
||||
GetShortField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jshort,
|
||||
GetIntField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jint,
|
||||
GetLongField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jlong,
|
||||
GetFloatField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jfloat,
|
||||
GetDoubleField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID) -> jdouble,
|
||||
|
||||
SetObjectField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jobject),
|
||||
SetBooleanField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jboolean),
|
||||
SetByteField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jbyte),
|
||||
SetCharField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jchar),
|
||||
SetShortField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jshort),
|
||||
SetIntField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jint),
|
||||
SetLongField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jlong),
|
||||
SetFloatField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jfloat),
|
||||
SetDoubleField: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject, fieldID: jfieldID, value: jdouble),
|
||||
|
||||
GetStaticMethodID: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, name: cstring, sig: cstring) -> jmethodID,
|
||||
|
||||
CallStaticObjectMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jobject,
|
||||
CallStaticObjectMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jobject,
|
||||
CallStaticObjectMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jobject,
|
||||
CallStaticBooleanMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jboolean,
|
||||
CallStaticBooleanMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jboolean,
|
||||
CallStaticBooleanMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jboolean,
|
||||
CallStaticByteMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jbyte,
|
||||
CallStaticByteMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jbyte,
|
||||
CallStaticByteMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jbyte,
|
||||
CallStaticCharMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jchar,
|
||||
CallStaticCharMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jchar,
|
||||
CallStaticCharMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jchar,
|
||||
CallStaticShortMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jshort,
|
||||
CallStaticShortMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jshort,
|
||||
CallStaticShortMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jshort,
|
||||
CallStaticIntMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jint,
|
||||
CallStaticIntMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jint,
|
||||
CallStaticIntMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jint,
|
||||
CallStaticLongMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jlong,
|
||||
CallStaticLongMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jlong,
|
||||
CallStaticLongMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jlong,
|
||||
CallStaticFloatMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jfloat,
|
||||
CallStaticFloatMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jfloat,
|
||||
CallStaticFloatMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jfloat,
|
||||
CallStaticDoubleMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any) -> jdouble,
|
||||
CallStaticDoubleMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list) -> jdouble,
|
||||
CallStaticDoubleMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue) -> jdouble,
|
||||
CallStaticVoidMethod: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #c_vararg args: ..any),
|
||||
CallStaticVoidMethodV: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, args: ^c.va_list),
|
||||
CallStaticVoidMethodA: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methodID: jmethodID, #by_ptr args: jvalue),
|
||||
|
||||
GetStaticFieldID: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, name: cstring, sig: cstring) -> jfieldID,
|
||||
|
||||
GetStaticObjectField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jobject,
|
||||
GetStaticBooleanField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jboolean,
|
||||
GetStaticByteField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jbyte,
|
||||
GetStaticCharField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jchar,
|
||||
GetStaticShortField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jshort,
|
||||
GetStaticIntField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jint,
|
||||
GetStaticLongField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jlong,
|
||||
GetStaticFloatField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jfloat,
|
||||
GetStaticDoubleField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID) -> jdouble,
|
||||
|
||||
SetStaticObjectField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jobject),
|
||||
SetStaticBooleanField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jboolean),
|
||||
SetStaticByteField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jbyte),
|
||||
SetStaticCharField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jchar),
|
||||
SetStaticShortField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jshort),
|
||||
SetStaticIntField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jint),
|
||||
SetStaticLongField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jlong),
|
||||
SetStaticFloatField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jfloat),
|
||||
SetStaticDoubleField: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, fieldID: jfieldID, value: jdouble),
|
||||
|
||||
NewString: #type proc "c" (jni: ^^JNINativeInterface, unicodeChars: [^]jchar, len: jsize) -> jstring,
|
||||
GetStringLength: #type proc "c" (jni: ^^JNINativeInterface, str: jstring) -> jsize,
|
||||
GetStringChars: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, isCopy: ^jboolean) -> [^]jchar,
|
||||
ReleaseStringChars: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, chars: [^]jchar),
|
||||
NewStringUTF: #type proc "c" (jni: ^^JNINativeInterface, bytes: [^]c.char) -> jstring,
|
||||
GetStringUTFLength: #type proc "c" (jni: ^^JNINativeInterface, str: jstring) -> jsize,
|
||||
/* JNI spec says this returns const jbyte*, but that's inconsistent */
|
||||
GetStringUTFChars: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, isCopy: ^jboolean) -> cstring,
|
||||
ReleaseStringUTFChars: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, utf: cstring),
|
||||
GetArrayLength: #type proc "c" (jni: ^^JNINativeInterface, array: jarray) -> jsize,
|
||||
NewObjectArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize, elementClass: jclass, initialElement: jobject) -> jobjectArray,
|
||||
GetObjectArrayElement: #type proc "c" (jni: ^^JNINativeInterface, array: jobjectArray, index: jsize) -> jobject,
|
||||
SetObjectArrayElement: #type proc "c" (jni: ^^JNINativeInterface, array: jobjectArray, index: jsize, value: jobject),
|
||||
|
||||
NewBooleanArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jbooleanArray,
|
||||
NewByteArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jbyteArray,
|
||||
NewCharArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jcharArray,
|
||||
NewShortArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jshortArray,
|
||||
NewIntArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jintArray,
|
||||
NewLongArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jlongArray,
|
||||
NewFloatArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jfloatArray,
|
||||
NewDoubleArray: #type proc "c" (jni: ^^JNINativeInterface, length: jsize) -> jdoubleArray,
|
||||
|
||||
GetBooleanArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jbooleanArray, isCopy: ^jboolean) -> [^]jboolean,
|
||||
GetByteArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jbyteArray, isCopy: ^jboolean) -> [^]jbyte,
|
||||
GetCharArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jcharArray, isCopy: ^jboolean) -> [^]jchar,
|
||||
GetShortArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jshortArray, isCopy: ^jboolean) -> [^]jshort,
|
||||
GetIntArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jintArray, isCopy: ^jboolean) -> [^]jint,
|
||||
GetLongArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jlongArray, isCopy: ^jboolean) -> [^]jlong,
|
||||
GetFloatArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jfloatArray, isCopy: ^jboolean) -> [^]jfloat,
|
||||
GetDoubleArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jdoubleArray, isCopy: ^jboolean) -> [^]jdouble,
|
||||
|
||||
ReleaseBooleanArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jbooleanArray, elems: [^]jboolean, mode: jint),
|
||||
ReleaseByteArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jbyteArray, elems: [^]jbyte, mode: jint),
|
||||
ReleaseCharArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jcharArray, elems: [^]jchar, mode: jint),
|
||||
ReleaseShortArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jshortArray, elems: [^]jshort, mode: jint),
|
||||
ReleaseIntArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jintArray, elems: [^]jint, mode: jint),
|
||||
ReleaseLongArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jlongArray, elems: [^]jlong, mode: jint),
|
||||
ReleaseFloatArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jfloatArray, elems: [^]jfloat, mode: jint),
|
||||
ReleaseDoubleArrayElements: #type proc "c" (jni: ^^JNINativeInterface, array: jdoubleArray, elems: [^]jdouble, mode: jint),
|
||||
|
||||
GetBooleanArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jbooleanArray, start: jsize, len: jsize, buf: [^]jboolean),
|
||||
GetByteArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jbyteArray, start: jsize, len: jsize, buf: [^]jbyte),
|
||||
GetCharArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jcharArray, start: jsize, len: jsize, buf: [^]jchar),
|
||||
GetShortArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jshortArray, start: jsize, len: jsize, buf: [^]jshort),
|
||||
GetIntArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jintArray, start: jsize, len: jsize, buf: [^]jint),
|
||||
GetLongArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jlongArray, start: jsize, len: jsize, buf: [^]jlong),
|
||||
GetFloatArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jfloatArray, start: jsize, len: jsize, buf: [^]jfloat),
|
||||
GetDoubleArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jdoubleArray, start: jsize, len: jsize, buf: [^]jdouble),
|
||||
|
||||
/* spec shows these without const, some jni.h do, some don't */
|
||||
SetBooleanArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jbooleanArray, start: jsize, len: jsize, buf: [^]jboolean),
|
||||
SetByteArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jbyteArray, start: jsize, len: jsize, buf: [^]jbyte),
|
||||
SetCharArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jcharArray, start: jsize, len: jsize, buf: [^]jchar),
|
||||
SetShortArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jshortArray, start: jsize, len: jsize, buf: [^]jshort),
|
||||
SetIntArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jintArray, start: jsize, len: jsize, buf: [^]jint),
|
||||
SetLongArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jlongArray, start: jsize, len: jsize, buf: [^]jlong),
|
||||
SetFloatArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jfloatArray, start: jsize, len: jsize, buf: [^]jfloat),
|
||||
SetDoubleArrayRegion: #type proc "c" (jni: ^^JNINativeInterface, array: jdoubleArray, start: jsize, len: jsize, buf: [^]jdouble),
|
||||
|
||||
RegisterNatives: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass, methods: [^]JNINativeMethod, nMethods: jint) -> jint,
|
||||
UnregisterNatives: #type proc "c" (jni: ^^JNINativeInterface, clazz: jclass) -> jint,
|
||||
MonitorEnter: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject) -> jint,
|
||||
MonitorExit: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject) -> jint,
|
||||
GetJavaVM: #type proc "c" (jni: ^^JNINativeInterface, vm: ^^^JNIInvokeInterface) -> jint,
|
||||
|
||||
GetStringRegion: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, start: jsize, len: jsize, buf: [^]jchar),
|
||||
GetStringUTFRegion: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, start: jsize, len: jsize, buf: [^]c.char),
|
||||
|
||||
GetPrimitiveArrayCritical: #type proc "c" (jni: ^^JNINativeInterface, array: jarray, isCopy: ^jboolean) -> rawptr,
|
||||
ReleasePrimitiveArrayCritical: #type proc "c" (jni: ^^JNINativeInterface, array: jarray, carray: rawptr, mode: jint),
|
||||
|
||||
GetStringCritical: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, isCopy: ^jboolean) -> [^]jchar,
|
||||
ReleaseStringCritical: #type proc "c" (jni: ^^JNINativeInterface, str: jstring, carray: [^]jchar),
|
||||
|
||||
NewWeakGlobalRef: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject) -> jweak,
|
||||
DeleteWeakGlobalRef: #type proc "c" (jni: ^^JNINativeInterface, obj: jweak),
|
||||
|
||||
ExceptionCheck: #type proc "c" (jni: ^^JNINativeInterface),
|
||||
|
||||
NewDirectByteBuffer: #type proc "c" (jni: ^^JNINativeInterface, address: rawptr, capacity: jlong) -> jobject,
|
||||
GetDirectBufferAddress: #type proc "c" (jni: ^^JNINativeInterface, buf: jobject) -> rawptr,
|
||||
GetDirectBufferCapacity: #type proc "c" (jni: ^^JNINativeInterface, buf: jobject) -> jlong,
|
||||
|
||||
/* added in JNI 1.6 */
|
||||
GetObjectRefType: #type proc "c" (jni: ^^JNINativeInterface, obj: jobject) -> jobjectRefType,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* JNI invocation interface.
|
||||
*/
|
||||
JNIInvokeInterface :: struct {
|
||||
reserved0: rawptr,
|
||||
reserved1: rawptr,
|
||||
reserved2: rawptr,
|
||||
|
||||
DestroyJavaVM: #type proc "c" (vm: ^^JNIInvokeInterface) -> jint,
|
||||
AttachCurrentThread: #type proc "c" (vm: ^^JNIInvokeInterface, p_env: ^^JNIEnv, thr_args: rawptr) -> jint,
|
||||
DetachCurrentThread: #type proc "c" (vm: ^^JNIInvokeInterface) -> jint,
|
||||
GetEnv: #type proc "c" (vm: ^^JNIInvokeInterface, env: ^rawptr, version: jint) -> jint,
|
||||
AttachCurrentThreadAsDaemon: #type proc "c" (vm: ^^JNIInvokeInterface, p_env: ^^JNIEnv, thr_args: ^rawptr) -> jint,
|
||||
}
|
||||
@@ -0,0 +1,340 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
|
||||
foreign import log "system:log"
|
||||
|
||||
/**
|
||||
* \file
|
||||
*
|
||||
* Support routines to send messages to the Android log buffer,
|
||||
* which can later be accessed through the `logcat` utility.
|
||||
*
|
||||
* Each log message must have
|
||||
* - a priority
|
||||
* - a log tag
|
||||
* - some text
|
||||
*
|
||||
* The tag normally corresponds to the component that emits the log message,
|
||||
* and should be reasonably small.
|
||||
*
|
||||
* Log message text may be truncated to less than an implementation-specific
|
||||
* limit (1023 bytes).
|
||||
*
|
||||
* Note that a newline character ("\n") will be appended automatically to your
|
||||
* log message, if not already there. It is not possible to send several
|
||||
* messages and have them appear on a single line in logcat.
|
||||
*
|
||||
* Please use logging in moderation:
|
||||
*
|
||||
* - Sending log messages eats CPU and slow down your application and the
|
||||
* system.
|
||||
*
|
||||
* - The circular log buffer is pretty small, so sending many messages
|
||||
* will hide other important log messages.
|
||||
*
|
||||
* - In release builds, only send log messages to account for exceptional
|
||||
* conditions.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Android log priority values, in increasing order of priority.
|
||||
*/
|
||||
LogPriority :: enum i32 {
|
||||
/** For internal use only. */
|
||||
UNKNOWN = 0,
|
||||
/** The default priority, for internal use only. */
|
||||
DEFAULT, /* only for SetMinPriority() */
|
||||
/** Verbose logging. Should typically be disabled for a release apk. */
|
||||
VERBOSE,
|
||||
/** Debug logging. Should typically be disabled for a release apk. */
|
||||
DEBUG,
|
||||
/** Informational logging. Should typically be disabled for a release apk. */
|
||||
INFO,
|
||||
/** Warning logging. For use with recoverable failures. */
|
||||
WARN,
|
||||
/** Error logging. For use with unrecoverable failures. */
|
||||
ERROR,
|
||||
/** Fatal logging. For use when aborting. */
|
||||
FATAL,
|
||||
/** For internal use only. */
|
||||
SILENT, /* only for SetMinPriority(); must be last */
|
||||
}
|
||||
|
||||
/**
|
||||
* Identifies a specific log buffer for __android_log_buf_write()
|
||||
* and __android_log_buf_print().
|
||||
*/
|
||||
LogId :: enum i32 {
|
||||
MIN = 0,
|
||||
|
||||
/** The main log buffer. This is the only log buffer available to apps. */
|
||||
MAIN = 0,
|
||||
/** The radio log buffer. */
|
||||
RADIO = 1,
|
||||
/** The event log buffer. */
|
||||
EVENTS = 2,
|
||||
/** The system log buffer. */
|
||||
SYSTEM = 3,
|
||||
/** The crash log buffer. */
|
||||
CRASH = 4,
|
||||
/** The statistics log buffer. */
|
||||
STATS = 5,
|
||||
/** The security log buffer. */
|
||||
SECURITY = 6,
|
||||
/** The kernel log buffer. */
|
||||
KERNEL = 7,
|
||||
|
||||
MAX,
|
||||
|
||||
/** Let the logging function choose the best log target. */
|
||||
DEFAULT = 0x7FFFFFFF
|
||||
}
|
||||
|
||||
/**
|
||||
* Logger data struct used for writing log messages to liblog via __android_log_write_logger_data()
|
||||
* and sending log messages to user defined loggers specified in __android_log_set_logger().
|
||||
*/
|
||||
LogMessage :: struct {
|
||||
/** Must be set to sizeof(LogMessage) and is used for versioning. */
|
||||
struct_size: uint,
|
||||
|
||||
/** {@link log_id_t} values. */
|
||||
buffer_id: i32,
|
||||
|
||||
/** {@link android_LogPriority} values. */
|
||||
priority: i32,
|
||||
|
||||
/** The tag for the log message. */
|
||||
tag: cstring,
|
||||
|
||||
/** Optional file name, may be set to nullptr. */
|
||||
file: cstring,
|
||||
|
||||
/** Optional line number, ignore if file is nullptr. */
|
||||
line: u32,
|
||||
|
||||
/** The log message itself. */
|
||||
message: cstring,
|
||||
}
|
||||
|
||||
/**
|
||||
* Prototype for the 'logger' function that is called for every log message.
|
||||
*/
|
||||
__android_logger_function :: #type proc "c" (log_message: ^LogMessage)
|
||||
/**
|
||||
* Prototype for the 'abort' function that is called when liblog will abort due to
|
||||
* __android_log_assert() failures.
|
||||
*/
|
||||
__android_aborter_function :: #type proc "c" (abort_message: cstring)
|
||||
|
||||
foreign log {
|
||||
/**
|
||||
* Writes the constant string `text` to the log, with priority `prio` and tag
|
||||
* `tag`.
|
||||
*/
|
||||
__android_log_write :: proc(prio: LogPriority, tag: cstring, text: cstring) -> i32 ---
|
||||
|
||||
/**
|
||||
* Writes a formatted string to the log, with priority `prio` and tag `tag`.
|
||||
* The details of formatting are the same as for
|
||||
* [printf(3)](http://man7.org/linux/man-pages/man3/printf.3.html).
|
||||
*/
|
||||
__android_log_print :: proc(prio: LogPriority, tag: cstring, fmt: cstring, #c_vararg args: ..any) -> i32 ---
|
||||
|
||||
/**
|
||||
* Equivalent to `__android_log_print`, but taking a `va_list`.
|
||||
* (If `__android_log_print` is like `printf`, this is like `vprintf`.)
|
||||
*/
|
||||
__android_log_vprint :: proc(prio: LogPriority, tag: cstring, fmt: cstring, ap: c.va_list) -> i32 ---
|
||||
|
||||
/**
|
||||
* Writes an assertion failure to the log (as `ANDROID_LOG_FATAL`) and to
|
||||
* stderr, before calling
|
||||
* [abort(3)](http://man7.org/linux/man-pages/man3/abort.3.html).
|
||||
*
|
||||
* If `fmt` is non-null, `cond` is unused. If `fmt` is null, the string
|
||||
* `Assertion failed: %s` is used with `cond` as the string argument.
|
||||
* If both `fmt` and `cond` are null, a default string is provided.
|
||||
*
|
||||
* Most callers should use
|
||||
* [assert(3)](http://man7.org/linux/man-pages/man3/assert.3.html) from
|
||||
* `<assert.h>` instead, or the `__assert` and `__assert2` functions
|
||||
* provided by bionic if more control is needed. They support automatically
|
||||
* including the source filename and line number more conveniently than this
|
||||
* function.
|
||||
*/
|
||||
__android_log_assert :: proc(cond: cstring, tag: cstring, fmt: cstring, #c_vararg args: ..any) ---
|
||||
|
||||
/**
|
||||
* Writes the constant string `text` to the log buffer `id`,
|
||||
* with priority `prio` and tag `tag`.
|
||||
*
|
||||
* Apps should use __android_log_write() instead.
|
||||
*/
|
||||
__android_log_buf_write :: proc(bufID: LogId, prio: LogPriority, tag: cstring, text: cstring) -> i32 ---
|
||||
|
||||
/**
|
||||
* Writes a formatted string to log buffer `id`,
|
||||
* with priority `prio` and tag `tag`.
|
||||
* The details of formatting are the same as for
|
||||
* [printf(3)](http://man7.org/linux/man-pages/man3/printf.3.html).
|
||||
*
|
||||
* Apps should use __android_log_print() instead.
|
||||
*/
|
||||
__android_log_buf_print :: proc(bufID: LogId, prio: LogPriority, tag: cstring, fmt: cstring, #c_vararg args: ..any) -> i32 ---
|
||||
|
||||
/**
|
||||
* Writes the log message specified by log_message. log_message includes additional file name and
|
||||
* line number information that a logger may use. log_message is versioned for backwards
|
||||
* compatibility.
|
||||
* This assumes that loggability has already been checked through __android_log_is_loggable().
|
||||
* Higher level logging libraries, such as libbase, first check loggability, then format their
|
||||
* buffers, then pass the message to liblog via this function, and therefore we do not want to
|
||||
* duplicate the loggability check here.
|
||||
*
|
||||
* @param log_message the log message itself, see __android_log_message.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_write_log_message :: proc(log_message: ^LogMessage) ---
|
||||
|
||||
/**
|
||||
* Sets a user defined logger function. All log messages sent to liblog will be set to the
|
||||
* function pointer specified by logger for processing. It is not expected that log messages are
|
||||
* already terminated with a new line. This function should add new lines if required for line
|
||||
* separation.
|
||||
*
|
||||
* @param logger the new function that will handle log messages.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_set_logger :: proc(logger: __android_logger_function) ---
|
||||
|
||||
/**
|
||||
* Writes the log message to logd. This is an __android_logger_function and can be provided to
|
||||
* __android_log_set_logger(). It is the default logger when running liblog on a device.
|
||||
*
|
||||
* @param log_message the log message to write, see __android_log_message.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_logd_logger :: proc(log_message: ^LogMessage) ---
|
||||
|
||||
/**
|
||||
* Writes the log message to stderr. This is an __android_logger_function and can be provided to
|
||||
* __android_log_set_logger(). It is the default logger when running liblog on host.
|
||||
*
|
||||
* @param log_message the log message to write, see __android_log_message.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_stderr_logger :: proc(log_message: ^LogMessage) ---
|
||||
|
||||
/**
|
||||
* Sets a user defined aborter function that is called for __android_log_assert() failures. This
|
||||
* user defined aborter function is highly recommended to abort and be noreturn, but is not strictly
|
||||
* required to.
|
||||
*
|
||||
* @param aborter the new aborter function, see __android_aborter_function.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_set_aborter :: proc(aborter: __android_aborter_function) ---
|
||||
|
||||
/**
|
||||
* Calls the stored aborter function. This allows for other logging libraries to use the same
|
||||
* aborter function by calling this function in liblog.
|
||||
*
|
||||
* @param abort_message an additional message supplied when aborting, for example this is used to
|
||||
* call android_set_abort_message() in __android_log_default_aborter().
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_call_aborter :: proc(abort_message: cstring) ---
|
||||
|
||||
/**
|
||||
* Sets android_set_abort_message() on device then aborts(). This is the default aborter.
|
||||
*
|
||||
* @param abort_message an additional message supplied when aborting. This functions calls
|
||||
* android_set_abort_message() with its contents.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_default_aborter :: proc(abort_message: cstring) ---
|
||||
|
||||
/**
|
||||
* Use the per-tag properties "log.tag.<tagname>" along with the minimum priority from
|
||||
* __android_log_set_minimum_priority() to determine if a log message with a given prio and tag will
|
||||
* be printed. A non-zero result indicates yes, zero indicates false.
|
||||
*
|
||||
* If both a priority for a tag and a minimum priority are set by
|
||||
* __android_log_set_minimum_priority(), then the lowest of the two values are to determine the
|
||||
* minimum priority needed to log. If only one is set, then that value is used to determine the
|
||||
* minimum priority needed. If none are set, then default_priority is used.
|
||||
*
|
||||
* @param prio the priority to test, takes android_LogPriority values.
|
||||
* @param tag the tag to test.
|
||||
* @param default_prio the default priority to use if no properties or minimum priority are set.
|
||||
* @return an integer where 1 indicates that the message is loggable and 0 indicates that it is not.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_is_loggable :: proc(prio: LogPriority, tag: cstring, default_prio: LogPriority) -> i32 ---
|
||||
|
||||
/**
|
||||
* Use the per-tag properties "log.tag.<tagname>" along with the minimum priority from
|
||||
* __android_log_set_minimum_priority() to determine if a log message with a given prio and tag will
|
||||
* be printed. A non-zero result indicates yes, zero indicates false.
|
||||
*
|
||||
* If both a priority for a tag and a minimum priority are set by
|
||||
* __android_log_set_minimum_priority(), then the lowest of the two values are to determine the
|
||||
* minimum priority needed to log. If only one is set, then that value is used to determine the
|
||||
* minimum priority needed. If none are set, then default_priority is used.
|
||||
*
|
||||
* @param prio the priority to test, takes android_LogPriority values.
|
||||
* @param tag the tag to test.
|
||||
* @param len the length of the tag.
|
||||
* @param default_prio the default priority to use if no properties or minimum priority are set.
|
||||
* @return an integer where 1 indicates that the message is loggable and 0 indicates that it is not.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_is_loggable_len :: proc(prio: LogPriority, tag: cstring, len: uint, default_prio: LogPriority) -> i32 ---
|
||||
|
||||
/**
|
||||
* Sets the minimum priority that will be logged for this process.
|
||||
*
|
||||
* @param priority the new minimum priority to set, takes android_LogPriority values.
|
||||
* @return the previous set minimum priority as android_LogPriority values, or
|
||||
* ANDROID_LOG_DEFAULT if none was set.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_set_minimum_priority :: proc(priority: LogPriority) -> LogPriority ---
|
||||
|
||||
/**
|
||||
* Gets the minimum priority that will be logged for this process. If none has been set by a
|
||||
* previous __android_log_set_minimum_priority() call, this returns ANDROID_LOG_DEFAULT.
|
||||
*
|
||||
* @return the current minimum priority as android_LogPriority values, or
|
||||
* ANDROID_LOG_DEFAULT if none is set.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_get_minimum_priority :: proc() -> LogPriority ---
|
||||
|
||||
/**
|
||||
* Sets the default tag if no tag is provided when writing a log message. Defaults to
|
||||
* getprogname(). This truncates tag to the maximum log message size, though appropriate tags
|
||||
* should be much smaller.
|
||||
*
|
||||
* @param tag the new log tag.
|
||||
*
|
||||
* Available since API level 30.
|
||||
*/
|
||||
__android_log_set_default_tag :: proc(tag: cstring) ---
|
||||
}
|
||||
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
/**
|
||||
* ALooper
|
||||
*
|
||||
* A looper is the state tracking an event loop for a thread.
|
||||
* Loopers do not define event structures or other such things; rather
|
||||
* they are a lower-level facility to attach one or more discrete objects
|
||||
* listening for an event. An "event" here is simply data available on
|
||||
* a file descriptor: each attached object has an associated file descriptor,
|
||||
* and waiting for "events" means (internally) polling on all of these file
|
||||
* descriptors until one or more of them have data available.
|
||||
*
|
||||
* A thread can have only one ALooper associated with it.
|
||||
*/
|
||||
ALooper :: struct{}
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Like ALooper_pollOnce(), but performs all pending callbacks until all
|
||||
* data has been consumed or a file descriptor is available with no callback.
|
||||
* This function will never return ALOOPER_POLL_CALLBACK.
|
||||
*/
|
||||
ALooper_pollAll :: proc(timeoutMillis: c.int, outFd: ^c.int, outEvents: ^c.int, outData: ^rawptr) -> c.int ---
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
|
||||
/**
|
||||
* This structure defines the native side of an android.app.NativeActivity.
|
||||
* It is created by the framework, and handed to the application's native
|
||||
* code as it is being launched.
|
||||
*/
|
||||
ANativeActivity :: struct {
|
||||
/**
|
||||
* Pointer to the callback function table of the native application.
|
||||
* You can set the functions here to your own callbacks. The callbacks
|
||||
* pointer itself here should not be changed, it is allocated and managed
|
||||
* for you by the framework.
|
||||
*/
|
||||
callbacks: ^ANativeActivityCallbacks,
|
||||
|
||||
/**
|
||||
* The global handle on the process's Java VM.
|
||||
*/
|
||||
vm: ^JavaVM,
|
||||
|
||||
/**
|
||||
* JNI context for the main thread of the app. Note that this field
|
||||
* can ONLY be used from the main thread of the process, that is, the
|
||||
* thread that calls into the ANativeActivityCallbacks.
|
||||
*/
|
||||
env: ^JNIEnv,
|
||||
|
||||
/**
|
||||
* The NativeActivity object handle.
|
||||
*
|
||||
* IMPORTANT NOTE: This member is mis-named. It should really be named
|
||||
* 'activity' instead of 'clazz', since it's a reference to the
|
||||
* NativeActivity instance created by the system for you.
|
||||
*
|
||||
* We unfortunately cannot change this without breaking NDK
|
||||
* source-compatibility.
|
||||
*/
|
||||
clazz: jobject,
|
||||
|
||||
/**
|
||||
* Path to this application's internal data directory.
|
||||
*/
|
||||
internalDataPath: cstring,
|
||||
|
||||
/**
|
||||
* Path to this application's external (removable/mountable) data directory.
|
||||
*/
|
||||
externalDataPath: cstring,
|
||||
|
||||
/**
|
||||
* The platform's SDK version code.
|
||||
*/
|
||||
sdkVersion: c.int32_t,
|
||||
|
||||
/**
|
||||
* This is the native instance of the application. It is not used by
|
||||
* the framework, but can be set by the application to its own instance
|
||||
* state.
|
||||
*/
|
||||
instance: rawptr,
|
||||
|
||||
/**
|
||||
* Pointer to the Asset Manager instance for the application. The application
|
||||
* uses this to access binary assets bundled inside its own .apk file.
|
||||
*/
|
||||
assetManager: ^AAssetManager,
|
||||
|
||||
/**
|
||||
* Available starting with Honeycomb: path to the directory containing
|
||||
* the application's OBB files (if any). If the app doesn't have any
|
||||
* OBB files, this directory may not exist.
|
||||
*/
|
||||
obbPath: cstring,
|
||||
}
|
||||
|
||||
/**
|
||||
* These are the callbacks the framework makes into a native application.
|
||||
* All of these callbacks happen on the main thread of the application.
|
||||
* By default, all callbacks are NULL; set to a pointer to your own function
|
||||
* to have it called.
|
||||
*/
|
||||
ANativeActivityCallbacks :: struct {
|
||||
/**
|
||||
* NativeActivity has started. See Java documentation for Activity.onStart()
|
||||
* for more information.
|
||||
*/
|
||||
onStart: #type proc "c" (activity: ^ANativeActivity),
|
||||
|
||||
/**
|
||||
* NativeActivity has resumed. See Java documentation for Activity.onResume()
|
||||
* for more information.
|
||||
*/
|
||||
onResume: #type proc "c" (activity: ^ANativeActivity),
|
||||
|
||||
/**
|
||||
* Framework is asking NativeActivity to save its current instance state.
|
||||
* See Java documentation for Activity.onSaveInstanceState() for more
|
||||
* information. The returned pointer needs to be created with malloc(),
|
||||
* the framework will call free() on it for you. You also must fill in
|
||||
* outSize with the number of bytes in the allocation. Note that the
|
||||
* saved state will be persisted, so it can not contain any active
|
||||
* entities (pointers to memory, file descriptors, etc).
|
||||
*/
|
||||
onSaveInstanceState: #type proc "c" (activity: ^ANativeActivity, outSize: ^c.size_t) -> rawptr,
|
||||
|
||||
/**
|
||||
* NativeActivity has paused. See Java documentation for Activity.onPause()
|
||||
* for more information.
|
||||
*/
|
||||
onPause: #type proc "c" (activity: ^ANativeActivity),
|
||||
|
||||
/**
|
||||
* NativeActivity has stopped. See Java documentation for Activity.onStop()
|
||||
* for more information.
|
||||
*/
|
||||
onStop: #type proc "c" (activity: ^ANativeActivity),
|
||||
|
||||
/**
|
||||
* NativeActivity is being destroyed. See Java documentation for Activity.onDestroy()
|
||||
* for more information.
|
||||
*/
|
||||
onDestroy: #type proc "c" (activity: ^ANativeActivity),
|
||||
|
||||
/**
|
||||
* Focus has changed in this NativeActivity's window. This is often used,
|
||||
* for example, to pause a game when it loses input focus.
|
||||
*/
|
||||
onWindowFocusChanged: #type proc "c" (activity: ^ANativeActivity, hasFocus: c.int),
|
||||
|
||||
/**
|
||||
* The drawing window for this native activity has been created. You
|
||||
* can use the given native window object to start drawing.
|
||||
*/
|
||||
onNativeWindowCreated: #type proc "c" (activity: ^ANativeActivity, window: ^ANativeWindow),
|
||||
|
||||
/**
|
||||
* The drawing window for this native activity has been resized. You should
|
||||
* retrieve the new size from the window and ensure that your rendering in
|
||||
* it now matches.
|
||||
*/
|
||||
onNativeWindowResized: #type proc "c" (activity: ^ANativeActivity, window: ^ANativeWindow),
|
||||
|
||||
/**
|
||||
* The drawing window for this native activity needs to be redrawn. To avoid
|
||||
* transient artifacts during screen changes (such resizing after rotation),
|
||||
* applications should not return from this function until they have finished
|
||||
* drawing their window in its current state.
|
||||
*/
|
||||
onNativeWindowRedrawNeeded: #type proc "c" (activity: ^ANativeActivity, window: ^ANativeWindow),
|
||||
|
||||
/**
|
||||
* The drawing window for this native activity is going to be destroyed.
|
||||
* You MUST ensure that you do not touch the window object after returning
|
||||
* from this function: in the common case of drawing to the window from
|
||||
* another thread, that means the implementation of this callback must
|
||||
* properly synchronize with the other thread to stop its drawing before
|
||||
* returning from here.
|
||||
*/
|
||||
onNativeWindowDestroyed: #type proc "c" (activity: ^ANativeActivity, window: ^ANativeWindow),
|
||||
|
||||
/**
|
||||
* The input queue for this native activity's window has been created.
|
||||
* You can use the given input queue to start retrieving input events.
|
||||
*/
|
||||
onInputQueueCreated: #type proc "c" (activity: ^ANativeActivity, queue: ^AInputQueue),
|
||||
|
||||
/**
|
||||
* The input queue for this native activity's window is being destroyed.
|
||||
* You should no longer try to reference this object upon returning from this
|
||||
* function.
|
||||
*/
|
||||
onInputQueueDestroyed: #type proc "c" (activity: ^ANativeActivity, queue: ^AInputQueue),
|
||||
|
||||
/**
|
||||
* The rectangle in the window in which content should be placed has changed.
|
||||
*/
|
||||
onContentRectChanged: #type proc "c" (activity: ^ANativeActivity, #by_ptr rect: ARect),
|
||||
|
||||
/**
|
||||
* The current device AConfiguration has changed. The new configuration can
|
||||
* be retrieved from assetManager.
|
||||
*/
|
||||
onConfigurationChanged: #type proc "c" (activity: ^ANativeActivity),
|
||||
|
||||
/**
|
||||
* The system is running low on memory. Use this callback to release
|
||||
* resources you do not need, to help the system avoid killing more
|
||||
* important processes.
|
||||
*/
|
||||
onLowMemory: #type proc "c" (activity: ^ANativeActivity),
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
/**
|
||||
* Opaque type that provides access to a native window.
|
||||
*
|
||||
* A pointer can be obtained using {@link ANativeWindow_fromSurface()}.
|
||||
*/
|
||||
ANativeWindow :: struct{}
|
||||
|
||||
foreign import android "system:android"
|
||||
|
||||
foreign android {
|
||||
/**
|
||||
* Change the format and size of the window buffers.
|
||||
*
|
||||
* The width and height control the number of pixels in the buffers, not the
|
||||
* dimensions of the window on screen. If these are different than the
|
||||
* window's physical size, then its buffer will be scaled to match that size
|
||||
* when compositing it to the screen. The width and height must be either both zero
|
||||
* or both non-zero.
|
||||
*
|
||||
* For all of these parameters, if 0 is supplied then the window's base
|
||||
* value will come back in force.
|
||||
*
|
||||
* \param window pointer to an ANativeWindow object.
|
||||
* \param width width of the buffers in pixels.
|
||||
* \param height height of the buffers in pixels.
|
||||
* \param format one of the AHardwareBuffer_Format constants.
|
||||
* \return 0 for success, or a negative value on error.
|
||||
*/
|
||||
ANativeWindow_setBuffersGeometry :: proc(window: ^ANativeWindow, width: i32, height: i32, format: i32) -> i32 ---
|
||||
|
||||
/**
|
||||
* Return the current width in pixels of the window surface.
|
||||
*
|
||||
* \return negative value on error.
|
||||
*/
|
||||
ANativeWindow_getWidth :: proc(window: ^ANativeWindow) -> i32 ---
|
||||
|
||||
/**
|
||||
* Return the current height in pixels of the window surface.
|
||||
*
|
||||
* \return a negative value on error.
|
||||
*/
|
||||
ANativeWindow_getHeight :: proc(window: ^ANativeWindow) -> i32 ---
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
//+build android
|
||||
package android
|
||||
|
||||
import "core:c"
|
||||
|
||||
/**
|
||||
* Rectangular window area.
|
||||
*
|
||||
* This is the NDK equivalent of the android.graphics.Rect class in Java. It is
|
||||
* used with {@link ANativeActivityCallbacks::onContentRectChanged} event
|
||||
* callback and the ANativeWindow_lock() function.
|
||||
*
|
||||
* In a valid ARect, left <= right and top <= bottom. ARect with left=0, top=10,
|
||||
* right=1, bottom=11 contains only one pixel at x=0, y=10.
|
||||
*/
|
||||
ARect :: struct {
|
||||
/// Minimum X coordinate of the rectangle.
|
||||
left: c.int32_t,
|
||||
/// Minimum Y coordinate of the rectangle.
|
||||
top: c.int32_t,
|
||||
/// Maximum X coordinate of the rectangle.
|
||||
right: c.int32_t,
|
||||
/// Maximum Y coordinate of the rectangle.
|
||||
bottom: c.int32_t,
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
package android
|
||||
|
||||
off_t :: i64
|
||||
off64_t :: i64
|
||||
Reference in New Issue
Block a user