Skip to content

Commit 7f70c13

Browse files
authored
fix: retrieval of ArrayDouble output options (fixes #183) (#184)
* fix: retrieval of ArrayDouble output options (fixes #183) * More array offset fixes for ArrayImage and ArrayInt * fix: Bump JVM version to 25 for CI
1 parent 5a2f11d commit 7f70c13

File tree

4 files changed

+50
-5
lines changed

4 files changed

+50
-5
lines changed

.github/workflows/checks.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ jobs:
1717
- name: Setup Java
1818
uses: actions/setup-java@v4
1919
with:
20-
distribution: "temurin"
21-
java-version: 23
20+
distribution: "corretto"
21+
java-version: 25 # run a newer version on macOS to work around libzip linking issues
2222

2323
- name: Setup Gradle
2424
uses: gradle/actions/setup-gradle@v3

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ private static void readGValueAndSetOptionValue(
175175
var numberOfElements = numberOfValuesPointer.get(C_INT, 0);
176176
var list = new ArrayList<Integer>();
177177
for (int i = 0; i < numberOfElements; i++) {
178-
var value = valuesPointer.get(C_INT, i);
178+
var value = valuesPointer.get(C_INT, i * C_INT.byteSize());
179179
list.add(value);
180180
}
181181
o.setValue(list);
@@ -188,7 +188,7 @@ private static void readGValueAndSetOptionValue(
188188
var numberOfElements = numberOfValuesPointer.get(C_INT, 0);
189189
var list = new ArrayList<Double>();
190190
for (int i = 0; i < numberOfElements; i++) {
191-
var value = valuesPointer.get(C_DOUBLE, i);
191+
var value = valuesPointer.get(C_DOUBLE, i * C_DOUBLE.byteSize());
192192
list.add(value);
193193
}
194194
o.setValue(list);
@@ -201,7 +201,7 @@ private static void readGValueAndSetOptionValue(
201201
var numberOfElements = numberOfValuesPointer.get(C_INT, 0);
202202
var list = new ArrayList<VImage>();
203203
for (int i = 0; i < numberOfElements; i++) {
204-
var pointer = valuesPointer.get(C_POINTER, i);
204+
var pointer = valuesPointer.get(C_POINTER, i * C_POINTER.byteSize());
205205
pointer = refGObjectToArenaScope(arena, pointer);
206206
var value = new VImage(arena, pointer);
207207
list.add(value);

sample/src/main/kotlin/vipsffm/SampleRunner.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import vipsffm.sample.VImageGetPagesSample
2020
import vipsffm.sample.VImageGetSetSample
2121
import vipsffm.sample.VImageJoinSample
2222
import vipsffm.sample.VImageFromMemoryToMemorySample
23+
import vipsffm.sample.VImageGetPointSample
2324
import vipsffm.sample.VImageStaticThumbnailSample
2425
import vipsffm.sample.VOptionHyphenSample
2526
import vipsffm.sample.VSourceTargetSample
@@ -53,6 +54,7 @@ object SampleRunner {
5354
VImageStreamSample,
5455
VImageStaticThumbnailSample,
5556
VImageGetPagesSample,
57+
VImageGetPointSample,
5658
HelperGetSetMetadataSample,
5759
VImageGetSetSample,
5860
VImageFindTrimSample,
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package vipsffm.sample
2+
3+
import app.photofox.vipsffm.VBlob
4+
import app.photofox.vipsffm.VImage
5+
import org.slf4j.LoggerFactory
6+
import vipsffm.RunnableSample
7+
import java.lang.foreign.Arena
8+
import java.nio.file.Path
9+
10+
/**
11+
* Sample to get the color values at a specific point in an image
12+
*/
13+
object VImageGetPointSample: RunnableSample {
14+
15+
val logger = LoggerFactory.getLogger(VImageGetPointSample::class.java)
16+
17+
override fun run(arena: Arena, workingDirectory: Path): Result<Unit> {
18+
val sourceImage = VImage
19+
.newFromFile(
20+
arena,
21+
"sample/src/main/resources/sample_images/rabbit.jpg"
22+
)
23+
24+
val point = sourceImage.getpoint(100, 100)
25+
if (point.size != 3) {
26+
return Result.failure(
27+
RuntimeException("unexpected number of channels at 100,100: ${point.size}")
28+
)
29+
}
30+
val red = point.get(0).toInt()
31+
val green = point.get(1).toInt()
32+
val blue = point.get(2).toInt()
33+
if (red != 154 ||
34+
green != 165 ||
35+
blue != 135) {
36+
return Result.failure(
37+
RuntimeException("unexpected pixel value at 100,100: R=${red} G=${green} B=${blue}")
38+
)
39+
}
40+
41+
return Result.success(Unit)
42+
}
43+
}

0 commit comments

Comments
 (0)