Skip to content

Commit 4c9abde

Browse files
authored
Add VImage.newMatrix and VImage.newMatrixFromArray methods (#191)
* Add VImage.newMatrix and VImage.newMatrixFromArray methods * Remove non-existent functions from Javadoc, by wiping docs cache when rebuilding
1 parent 40513ae commit 4c9abde

File tree

182 files changed

+720
-44761
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

182 files changed

+720
-44761
lines changed

.run/Generate VipsHelper class.run.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="Generate VipsHelper class" type="JetRunConfigurationType">
3-
<envs>
4-
<env name="DYLD_LIBRARY_PATH" value="libvips/release/lib:/opt/homebrew/lib:$DYLD_LIBRARY_PATH" />
5-
</envs>
63
<option name="MAIN_CLASS_NAME" value="vipsffm.GenerateVipsHelperClass" />
74
<module name="vips-ffm.generator.main" />
5+
<option name="PROGRAM_PARAMETERS" value="-Dvipsffm.libpath.vips.override=/opt/homebrew/lib/libvips.dylib -Dvipsffm.libpath.glib.override=/opt/homebrew/lib/libglib-2.0.dylib -Dvipsffm.libpath.gobject.override=/opt/homebrew/lib/libgobject-2.0.dylib" />
86
<shortenClasspath name="NONE" />
97
<option name="VM_PARAMETERS" value="--enable-preview --enable-native-access=ALL-UNNAMED" />
108
<method v="2">

.run/Run samples.run.xml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="Run samples" type="JetRunConfigurationType">
3-
<option name="ALTERNATIVE_JRE_PATH" value="24" />
4-
<envs>
5-
<env name="DYLD_LIBRARY_PATH" value="libvips/release/lib:/opt/homebrew/lib:$DYLD_LIBRARY_PATH" />
6-
</envs>
3+
<option name="ALTERNATIVE_JRE_PATH" value="temurin-23" />
4+
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
75
<option name="MAIN_CLASS_NAME" value="vipsffm.SampleRunner" />
86
<module name="vips-ffm.sample.main" />
7+
<option name="PROGRAM_PARAMETERS" value="-Dvipsffm.libpath.vips.override=/opt/homebrew/lib/libvips.dylib -Dvipsffm.libpath.glib.override=/opt/homebrew/lib/libglib-2.0.dylib -Dvipsffm.libpath.gobject.override=/opt/homebrew/lib/libgobject-2.0.dylib" />
98
<shortenClasspath name="NONE" />
109
<option name="VM_PARAMETERS" value="--enable-native-access=ALL-UNNAMED" />
1110
<method v="2">

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ repositories {
2323
}
2424

2525
dependencies {
26-
implementation("app.photofox.vips-ffm:vips-ffm-core:1.9.3")
26+
implementation("app.photofox.vips-ffm:vips-ffm-core:1.9.4")
2727
}
2828
```
2929

core/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ tasks.withType<Javadoc> {
3535
// note that warnings are still printed during the build
3636
(options as CoreJavadocOptions).addBooleanOption("Xdoclint:none", true)
3737

38+
doFirst {
39+
delete("../docs")
40+
mkdir("../docs")
41+
}
42+
3843
doLast {
3944
copy {
4045
from("build/docs/javadoc")

core/src/main/java/app/photofox/vipsffm/VImage.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.lang.String;
5555
import java.lang.foreign.Arena;
5656
import java.lang.foreign.MemorySegment;
57+
import java.lang.foreign.ValueLayout;
5758
import java.util.ArrayList;
5859
import java.util.Arrays;
5960
import java.util.List;
@@ -9912,6 +9913,25 @@ public static VImage newFromStream(Arena arena, InputStream stream, VipsOption..
99129913
return newFromSource(arena, source, options);
99139914
}
99149915

9916+
/// A convenience function for creating a new matrix image: a one-band image storing doubles.
9917+
///
9918+
/// See also: [libvips new_matrix docs](https://www.libvips.org/API/8.17/ctor.Image.new_matrix.html)
9919+
public static VImage newMatrix(Arena arena, int width, int height) throws VipsError {
9920+
var newImagePointer = VipsHelper.image_new_matrix(arena, width, height);
9921+
return new VImage(arena, newImagePointer);
9922+
}
9923+
9924+
/// A convenience function for creating a new matrix image: a one-band image storing doubles.
9925+
/// Also initialises the image with the provided double values, copying them to native memory in the process.
9926+
///
9927+
/// See also: [VImage#newMatrix]
9928+
public static VImage newMatrixFromArray(Arena arena, int width, int height, double[] array) throws
9929+
VipsError {
9930+
var segment = arena.allocateFrom(ValueLayout.JAVA_DOUBLE, array);
9931+
var newImagePointer = VipsHelper.image_new_matrix_from_array(arena, width, height, segment, array.length);
9932+
return new VImage(arena, newImagePointer);
9933+
}
9934+
99159935
public void writeToFile(String path, VipsOption... options) throws VipsError {
99169936
var filename = VipsHelper.filename_get_filename(arena, path);
99179937
var filenameOptions = VipsHelper.filename_get_options(arena, filename);

core/src/main/java/app/photofox/vipsffm/VipsHelper.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,37 @@ public static MemorySegment image_new_from_memory_copy(Arena arena, MemorySegmen
10521052
return result;
10531053
}
10541054

1055+
/// Binding for:
1056+
/// ```c
1057+
/// VipsImage *vips_image_new_matrix(int width, int height)
1058+
/// ```
1059+
public static MemorySegment image_new_matrix(Arena arena, int width, int height) throws
1060+
VipsError {
1061+
var result = VipsRaw.vips_image_new_matrix(width, height);
1062+
if(!VipsValidation.isValidPointer(result)) {
1063+
VipsValidation.throwInvalidOutputError("vips_image_new_matrix", "result");
1064+
}
1065+
result = result.reinterpret(arena, VipsRaw::g_object_unref);
1066+
return result;
1067+
}
1068+
1069+
/// Binding for:
1070+
/// ```c
1071+
/// VipsImage *vips_image_new_matrix_from_array(int width, int height, const double *array, int size)
1072+
/// ```
1073+
public static MemorySegment image_new_matrix_from_array(Arena arena, int width, int height,
1074+
MemorySegment array, int size) throws VipsError {
1075+
if(!VipsValidation.isValidPointer(array)) {
1076+
VipsValidation.throwInvalidInputError("vips_image_new_matrix_from_array", "array");
1077+
}
1078+
var result = VipsRaw.vips_image_new_matrix_from_array(width, height, array, size);
1079+
if(!VipsValidation.isValidPointer(result)) {
1080+
VipsValidation.throwInvalidOutputError("vips_image_new_matrix_from_array", "result");
1081+
}
1082+
result = result.reinterpret(arena, VipsRaw::g_object_unref);
1083+
return result;
1084+
}
1085+
10551086
/// Binding for:
10561087
/// ```c
10571088
/// void vips_image_set_delete_on_close(VipsImage *image, gboolean delete_on_close)

core/src/main/java/app/photofox/vipsffm/jextract/VipsRaw.java

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7121,6 +7121,126 @@ public static MemorySegment vips_image_new_from_memory_copy(MemorySegment data,
71217121
}
71227122
}
71237123

7124+
private static class vips_image_new_matrix {
7125+
public static final FunctionDescriptor DESC = FunctionDescriptor.of(
7126+
VipsRaw.C_POINTER,
7127+
VipsRaw.C_INT,
7128+
VipsRaw.C_INT
7129+
);
7130+
7131+
public static final MemorySegment ADDR = VipsRaw.findOrThrow("vips_image_new_matrix");
7132+
7133+
public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC);
7134+
}
7135+
7136+
/**
7137+
* Function descriptor for:
7138+
* {@snippet lang=c :
7139+
* extern VipsImage *vips_image_new_matrix(int width, int height)
7140+
* }
7141+
*/
7142+
public static FunctionDescriptor vips_image_new_matrix$descriptor() {
7143+
return vips_image_new_matrix.DESC;
7144+
}
7145+
7146+
/**
7147+
* Downcall method handle for:
7148+
* {@snippet lang=c :
7149+
* extern VipsImage *vips_image_new_matrix(int width, int height)
7150+
* }
7151+
*/
7152+
public static MethodHandle vips_image_new_matrix$handle() {
7153+
return vips_image_new_matrix.HANDLE;
7154+
}
7155+
7156+
/**
7157+
* Address for:
7158+
* {@snippet lang=c :
7159+
* extern VipsImage *vips_image_new_matrix(int width, int height)
7160+
* }
7161+
*/
7162+
public static MemorySegment vips_image_new_matrix$address() {
7163+
return vips_image_new_matrix.ADDR;
7164+
}
7165+
7166+
/**
7167+
* {@snippet lang=c :
7168+
* extern VipsImage *vips_image_new_matrix(int width, int height)
7169+
* }
7170+
*/
7171+
public static MemorySegment vips_image_new_matrix(int width, int height) {
7172+
var mh$ = vips_image_new_matrix.HANDLE;
7173+
try {
7174+
if (TRACE_DOWNCALLS) {
7175+
traceDowncall("vips_image_new_matrix", width, height);
7176+
}
7177+
return (MemorySegment)mh$.invokeExact(width, height);
7178+
} catch (Throwable ex$) {
7179+
throw new AssertionError("should not reach here", ex$);
7180+
}
7181+
}
7182+
7183+
private static class vips_image_new_matrix_from_array {
7184+
public static final FunctionDescriptor DESC = FunctionDescriptor.of(
7185+
VipsRaw.C_POINTER,
7186+
VipsRaw.C_INT,
7187+
VipsRaw.C_INT,
7188+
VipsRaw.C_POINTER,
7189+
VipsRaw.C_INT
7190+
);
7191+
7192+
public static final MemorySegment ADDR = VipsRaw.findOrThrow("vips_image_new_matrix_from_array");
7193+
7194+
public static final MethodHandle HANDLE = Linker.nativeLinker().downcallHandle(ADDR, DESC);
7195+
}
7196+
7197+
/**
7198+
* Function descriptor for:
7199+
* {@snippet lang=c :
7200+
* extern VipsImage *vips_image_new_matrix_from_array(int width, int height, const double *array, int size)
7201+
* }
7202+
*/
7203+
public static FunctionDescriptor vips_image_new_matrix_from_array$descriptor() {
7204+
return vips_image_new_matrix_from_array.DESC;
7205+
}
7206+
7207+
/**
7208+
* Downcall method handle for:
7209+
* {@snippet lang=c :
7210+
* extern VipsImage *vips_image_new_matrix_from_array(int width, int height, const double *array, int size)
7211+
* }
7212+
*/
7213+
public static MethodHandle vips_image_new_matrix_from_array$handle() {
7214+
return vips_image_new_matrix_from_array.HANDLE;
7215+
}
7216+
7217+
/**
7218+
* Address for:
7219+
* {@snippet lang=c :
7220+
* extern VipsImage *vips_image_new_matrix_from_array(int width, int height, const double *array, int size)
7221+
* }
7222+
*/
7223+
public static MemorySegment vips_image_new_matrix_from_array$address() {
7224+
return vips_image_new_matrix_from_array.ADDR;
7225+
}
7226+
7227+
/**
7228+
* {@snippet lang=c :
7229+
* extern VipsImage *vips_image_new_matrix_from_array(int width, int height, const double *array, int size)
7230+
* }
7231+
*/
7232+
public static MemorySegment vips_image_new_matrix_from_array(int width, int height, MemorySegment array, int size) {
7233+
var mh$ = vips_image_new_matrix_from_array.HANDLE;
7234+
try {
7235+
if (TRACE_DOWNCALLS) {
7236+
traceDowncall("vips_image_new_matrix_from_array", width, height, array, size);
7237+
}
7238+
return (MemorySegment)mh$.invokeExact(width, height, array, size);
7239+
} catch (Throwable ex$) {
7240+
throw new AssertionError("should not reach here", ex$);
7241+
}
7242+
}
7243+
71247244
private static class vips_image_set_delete_on_close {
71257245
public static final FunctionDescriptor DESC = FunctionDescriptor.ofVoid(
71267246
VipsRaw.C_POINTER,

docs/app.photofox.vipsffm/app/photofox/vipsffm/VImage.html

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@
393393
<li><a href="#newFromMemory(java.lang.foreign.Arena,java.lang.foreign.MemorySegment,int,int,int,int)" tabindex="0">newFromMemory(Arena, MemorySegment, int, int, int, int)</a></li>
394394
<li><a href="#newFromStream(java.lang.foreign.Arena,java.io.InputStream,java.lang.String,app.photofox.vipsffm.VipsOption...)" tabindex="0">newFromStream(Arena, InputStream, String, VipsOption...)</a></li>
395395
<li><a href="#newFromStream(java.lang.foreign.Arena,java.io.InputStream,app.photofox.vipsffm.VipsOption...)" tabindex="0">newFromStream(Arena, InputStream, VipsOption...)</a></li>
396+
<li><a href="#newMatrix(java.lang.foreign.Arena,int,int)" tabindex="0">newMatrix(Arena, int, int)</a></li>
397+
<li><a href="#newMatrixFromArray(java.lang.foreign.Arena,int,int,double%5B%5D)" tabindex="0">newMatrixFromArray(Arena, int, int, double[])</a></li>
396398
<li><a href="#writeToFile(java.lang.String,app.photofox.vipsffm.VipsOption...)" tabindex="0">writeToFile(String, VipsOption...)</a></li>
397399
<li><a href="#write(app.photofox.vipsffm.VImage)" tabindex="0">write(VImage)</a></li>
398400
<li><a href="#writeToTarget(app.photofox.vipsffm.VTarget,java.lang.String,app.photofox.vipsffm.VipsOption...)" tabindex="0">writeToTarget(VTarget, String, VipsOption...)</a></li>
@@ -1925,6 +1927,21 @@ <h2>Method Summary</h2>
19251927
<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#newImage(java.lang.foreign.Arena)" class="member-name-link">newImage</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/foreign/Arena.html" title="class or interface in java.lang.foreign" class="external-link">Arena</a>&nbsp;arena)</code></div>
19261928
<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">&nbsp;</div>
19271929
<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="VImage.html" title="class in app.photofox.vipsffm">VImage</a></code></div>
1930+
<div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#newMatrix(java.lang.foreign.Arena,int,int)" class="member-name-link">newMatrix</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/foreign/Arena.html" title="class or interface in java.lang.foreign" class="external-link">Arena</a>&nbsp;arena,
1931+
int&nbsp;width,
1932+
int&nbsp;height)</code></div>
1933+
<div class="col-last odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
1934+
<div class="block">A convenience function for creating a new matrix image: a one-band image storing doubles.</div>
1935+
</div>
1936+
<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="VImage.html" title="class in app.photofox.vipsffm">VImage</a></code></div>
1937+
<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#newMatrixFromArray(java.lang.foreign.Arena,int,int,double%5B%5D)" class="member-name-link">newMatrixFromArray</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/foreign/Arena.html" title="class or interface in java.lang.foreign" class="external-link">Arena</a>&nbsp;arena,
1938+
int&nbsp;width,
1939+
int&nbsp;height,
1940+
double[]&nbsp;array)</code></div>
1941+
<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
1942+
<div class="block">A convenience function for creating a new matrix image: a one-band image storing doubles.</div>
1943+
</div>
1944+
<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="VImage.html" title="class in app.photofox.vipsffm">VImage</a></code></div>
19281945
<div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#openexrload(java.lang.foreign.Arena,java.lang.String,app.photofox.vipsffm.VipsOption...)" class="member-name-link">openexrload</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/foreign/Arena.html" title="class or interface in java.lang.foreign" class="external-link">Arena</a>&nbsp;arena,
19291946
<a href="https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;filename,
19301947
<a href="VipsOption.html" title="interface in app.photofox.vipsffm">VipsOption</a>...&nbsp;args)</code></div>
@@ -12315,6 +12332,44 @@ <h3>newFromStream</h3>
1231512332
</section>
1231612333
</li>
1231712334
<li>
12335+
<section class="detail" id="newMatrix(java.lang.foreign.Arena,int,int)">
12336+
<h3>newMatrix</h3>
12337+
<div class="horizontal-scroll">
12338+
<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="VImage.html" title="class in app.photofox.vipsffm">VImage</a></span>&nbsp;<span class="element-name">newMatrix</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/foreign/Arena.html" title="class or interface in java.lang.foreign" class="external-link">Arena</a>&nbsp;arena,
12339+
int&nbsp;width,
12340+
int&nbsp;height)</span>
12341+
throws <span class="exceptions"><a href="VipsError.html" title="class in app.photofox.vipsffm">VipsError</a></span></div>
12342+
<div class="block"><p>A convenience function for creating a new matrix image: a one-band image storing doubles.</p>
12343+
<p>See also: <a href="https://www.libvips.org/API/8.17/ctor.Image.new_matrix.html">libvips new_matrix docs</a></p>
12344+
</div>
12345+
<dl class="notes">
12346+
<dt>Throws:</dt>
12347+
<dd><code><a href="VipsError.html" title="class in app.photofox.vipsffm">VipsError</a></code></dd>
12348+
</dl>
12349+
</div>
12350+
</section>
12351+
</li>
12352+
<li>
12353+
<section class="detail" id="newMatrixFromArray(java.lang.foreign.Arena,int,int,double[])">
12354+
<h3>newMatrixFromArray</h3>
12355+
<div class="horizontal-scroll">
12356+
<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="VImage.html" title="class in app.photofox.vipsffm">VImage</a></span>&nbsp;<span class="element-name">newMatrixFromArray</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/foreign/Arena.html" title="class or interface in java.lang.foreign" class="external-link">Arena</a>&nbsp;arena,
12357+
int&nbsp;width,
12358+
int&nbsp;height,
12359+
double[]&nbsp;array)</span>
12360+
throws <span class="exceptions"><a href="VipsError.html" title="class in app.photofox.vipsffm">VipsError</a></span></div>
12361+
<div class="block"><p>A convenience function for creating a new matrix image: a one-band image storing doubles.
12362+
Also initialises the image with the provided double values, copying them to native memory in the process.</p>
12363+
<p>See also: <a href="#newMatrix(java.lang.foreign.Arena,int,int)"><code>newMatrix(java.lang.foreign.Arena, int, int)</code></a></p>
12364+
</div>
12365+
<dl class="notes">
12366+
<dt>Throws:</dt>
12367+
<dd><code><a href="VipsError.html" title="class in app.photofox.vipsffm">VipsError</a></code></dd>
12368+
</dl>
12369+
</div>
12370+
</section>
12371+
</li>
12372+
<li>
1231812373
<section class="detail" id="writeToFile(java.lang.String,app.photofox.vipsffm.VipsOption...)">
1231912374
<h3>writeToFile</h3>
1232012375
<div class="horizontal-scroll">

0 commit comments

Comments
 (0)