Skip to content

Commit eed7cdb

Browse files
authored
Merge pull request #193 from rainyl/leaf-getter
optimize Mat.ptrAt and Mat.atVec
2 parents b9f4ded + a04580b commit eed7cdb

File tree

6 files changed

+285
-976
lines changed

6 files changed

+285
-976
lines changed

ffigen/ffigen_core.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ functions:
4949
- "Mat_ElemSize.*"
5050
- "Mat_Dims"
5151
- "Mat_Data"
52-
- ""
52+
- "Mat_Get.*"
53+
- "Mat_Set.*"
5354
# - ""
5455
# - ""
5556
# - ""

lib/src/core/mat.dart

Lines changed: 28 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -391,103 +391,59 @@ class Mat extends CvStruct<cvg.Mat> {
391391
T atVec<T>(int row, int col) {
392392
// Vec2b, Vec3b, Vec4b
393393
if (T == Vec2b) {
394-
final p = calloc<cvg.Vec2b>();
395-
cvRun(() => ccore.Mat_GetVec2b(ref, row, col, p));
396-
return Vec2b.fromPointer(p) as T;
394+
return Vec2b.fromPointer(ccore.Mat_GetVec2b(ref, row, col)) as T;
397395
} else if (T == Vec3b) {
398-
final p = calloc<cvg.Vec3b>();
399-
cvRun(() => ccore.Mat_GetVec3b(ref, row, col, p));
400-
return Vec3b.fromPointer(p) as T;
396+
return Vec3b.fromPointer(ccore.Mat_GetVec3b(ref, row, col)) as T;
401397
} else if (T == Vec4b) {
402-
final p = calloc<cvg.Vec4b>();
403-
cvRun(() => ccore.Mat_GetVec4b(ref, row, col, p));
404-
return Vec4b.fromPointer(p) as T;
398+
return Vec4b.fromPointer(ccore.Mat_GetVec4b(ref, row, col)) as T;
405399
}
406400
// Vec2w, Vec3w, Vec4w
407401
else if (T == Vec2w) {
408-
final p = calloc<cvg.Vec2w>();
409-
cvRun(() => ccore.Mat_GetVec2w(ref, row, col, p));
410-
return Vec2w.fromPointer(p) as T;
402+
return Vec2w.fromPointer(ccore.Mat_GetVec2w(ref, row, col)) as T;
411403
} else if (T == Vec3w) {
412-
final p = calloc<cvg.Vec3w>();
413-
cvRun(() => ccore.Mat_GetVec3w(ref, row, col, p));
414-
return Vec3w.fromPointer(p) as T;
404+
return Vec3w.fromPointer(ccore.Mat_GetVec3w(ref, row, col)) as T;
415405
} else if (T == Vec4w) {
416-
final p = calloc<cvg.Vec4w>();
417-
cvRun(() => ccore.Mat_GetVec4w(ref, row, col, p));
418-
return Vec4w.fromPointer(p) as T;
406+
return Vec4w.fromPointer(ccore.Mat_GetVec4w(ref, row, col)) as T;
419407
}
420408
// Vec2s, Vec3s, Vec4s
421409
else if (T == Vec2s) {
422-
final p = calloc<cvg.Vec2s>();
423-
cvRun(() => ccore.Mat_GetVec2s(ref, row, col, p));
424-
return Vec2s.fromPointer(p) as T;
410+
return Vec2s.fromPointer(ccore.Mat_GetVec2s(ref, row, col)) as T;
425411
} else if (T == Vec3s) {
426-
final p = calloc<cvg.Vec3s>();
427-
cvRun(() => ccore.Mat_GetVec3s(ref, row, col, p));
428-
return Vec3s.fromPointer(p) as T;
412+
return Vec3s.fromPointer(ccore.Mat_GetVec3s(ref, row, col)) as T;
429413
} else if (T == Vec4s) {
430-
final p = calloc<cvg.Vec4s>();
431-
cvRun(() => ccore.Mat_GetVec4s(ref, row, col, p));
432-
return Vec4s.fromPointer(p) as T;
414+
return Vec4s.fromPointer(ccore.Mat_GetVec4s(ref, row, col)) as T;
433415
}
434416
// Vec2i, Vec3i, Vec4i, Vec6i, Vec8i
435417
else if (T == Vec2i) {
436-
final p = calloc<cvg.Vec2i>();
437-
cvRun(() => ccore.Mat_GetVec2i(ref, row, col, p));
438-
return Vec2i.fromPointer(p) as T;
418+
return Vec2i.fromPointer(ccore.Mat_GetVec2i(ref, row, col)) as T;
439419
} else if (T == Vec3i) {
440-
final p = calloc<cvg.Vec3i>();
441-
cvRun(() => ccore.Mat_GetVec3i(ref, row, col, p));
442-
return Vec3i.fromPointer(p) as T;
420+
return Vec3i.fromPointer(ccore.Mat_GetVec3i(ref, row, col)) as T;
443421
} else if (T == Vec4i) {
444-
final p = calloc<cvg.Vec4i>();
445-
cvRun(() => ccore.Mat_GetVec4i(ref, row, col, p));
446-
return Vec4i.fromPointer(p) as T;
422+
return Vec4i.fromPointer(ccore.Mat_GetVec4i(ref, row, col)) as T;
447423
} else if (T == Vec6i) {
448-
final p = calloc<cvg.Vec6i>();
449-
cvRun(() => ccore.Mat_GetVec6i(ref, row, col, p));
450-
return Vec6i.fromPointer(p) as T;
424+
return Vec6i.fromPointer(ccore.Mat_GetVec6i(ref, row, col)) as T;
451425
} else if (T == Vec8i) {
452-
final p = calloc<cvg.Vec8i>();
453-
cvRun(() => ccore.Mat_GetVec8i(ref, row, col, p));
454-
return Vec8i.fromPointer(p) as T;
426+
return Vec8i.fromPointer(ccore.Mat_GetVec8i(ref, row, col)) as T;
455427
}
456428
// Vec2f, Vec3f, Vec4f, Vec6f
457429
else if (T == Vec2f) {
458-
final p = calloc<cvg.Vec2f>();
459-
cvRun(() => ccore.Mat_GetVec2f(ref, row, col, p));
460-
return Vec2f.fromPointer(p) as T;
430+
return Vec2f.fromPointer(ccore.Mat_GetVec2f(ref, row, col)) as T;
461431
} else if (T == Vec3f) {
462-
final p = calloc<cvg.Vec3f>();
463-
cvRun(() => ccore.Mat_GetVec3f(ref, row, col, p));
464-
return Vec3f.fromPointer(p) as T;
432+
return Vec3f.fromPointer(ccore.Mat_GetVec3f(ref, row, col)) as T;
465433
} else if (T == Vec4f) {
466-
final p = calloc<cvg.Vec4f>();
467-
cvRun(() => ccore.Mat_GetVec4f(ref, row, col, p));
468-
return Vec4f.fromPointer(p) as T;
434+
return Vec4f.fromPointer(ccore.Mat_GetVec4f(ref, row, col)) as T;
469435
} else if (T == Vec6f) {
470-
final p = calloc<cvg.Vec6f>();
471-
cvRun(() => ccore.Mat_GetVec6f(ref, row, col, p));
472-
return Vec6f.fromPointer(p) as T;
436+
return Vec6f.fromPointer(ccore.Mat_GetVec6f(ref, row, col)) as T;
473437
}
474438
// Vec2d, Vec3d, Vec4d, Vec6d
475439
else if (T == Vec2d) {
476-
final p = calloc<cvg.Vec2d>();
477-
cvRun(() => ccore.Mat_GetVec2d(ref, row, col, p));
478-
return Vec2d.fromPointer(p) as T;
440+
return Vec2d.fromPointer(ccore.Mat_GetVec2d(ref, row, col)) as T;
479441
} else if (T == Vec3d) {
480-
final p = calloc<cvg.Vec3d>();
481-
cvRun(() => ccore.Mat_GetVec3d(ref, row, col, p));
482-
return Vec3d.fromPointer(p) as T;
442+
return Vec3d.fromPointer(ccore.Mat_GetVec3d(ref, row, col)) as T;
483443
} else if (T == Vec4d) {
484-
final p = calloc<cvg.Vec4d>();
485-
cvRun(() => ccore.Mat_GetVec4d(ref, row, col, p));
486-
return Vec4d.fromPointer(p) as T;
444+
return Vec4d.fromPointer(ccore.Mat_GetVec4d(ref, row, col)) as T;
487445
} else if (T == Vec6d) {
488-
final p = calloc<cvg.Vec6d>();
489-
cvRun(() => ccore.Mat_GetVec6d(ref, row, col, p));
490-
return Vec6d.fromPointer(p) as T;
446+
return Vec6d.fromPointer(ccore.Mat_GetVec6d(ref, row, col)) as T;
491447
} else {
492448
throw UnsupportedError("at<$T>() for ${type.asString()} is not supported!");
493449
}
@@ -653,14 +609,12 @@ class Mat extends CvStruct<cvg.Mat> {
653609
///
654610
/// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html#a8b2912f6a6f5d55a3c9a7aae9134d862
655611
ffi.Pointer<T> ptrAt<T extends ffi.NativeType>(int i0, [int? i1, int? i2]) {
656-
final step = this.step;
657-
658-
ffi.Pointer<U8> pp = dataPtr + i0 * step.$1;
659-
if (i1 != null) {
660-
pp += i1 * step.$2;
661-
if (i2 != null) pp += i2 * step.$3;
662-
}
663-
return pp.cast<T>();
612+
return switch ((i1, i2)) {
613+
(null, null) => ccore.Mat_Ptr_u8_1(ref, i0).cast<T>(),
614+
(final int i1, null) => ccore.Mat_Ptr_u8_2(ref, i0, i1).cast<T>(),
615+
(final int i1, final int i2) => ccore.Mat_Ptr_u8_3(ref, i0, i1, i2).cast<T>(),
616+
_ => throw UnsupportedError("ptrAt<$T>() for i1=$i1, i2=$i2 is not supported!"),
617+
};
664618
}
665619

666620
Float16P ptrAtF16(int i0, [int? i1, int? i2]) => ptrAt<U16>(i0, i1, i2).asFp16();

0 commit comments

Comments
 (0)