summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/vf/region.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/vf/region.c')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/vf/region.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/vf/region.c b/Build/source/texk/web2c/mfluadir/otfcc/lib/vf/region.c
new file mode 100644
index 00000000000..61519be1c66
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/vf/region.c
@@ -0,0 +1,62 @@
+#include "otfcc/vf/axis.h"
+#include "support/util.h"
+
+vq_Region *vq_createRegion(shapeid_t dimensions) {
+ vq_Region *r;
+ NEW_CLEAN_S(r, (VQ_REGION_SIZE(dimensions)));
+ r->dimensions = dimensions;
+ return r;
+}
+
+void vq_deleteRegion(MOVE vq_Region *region) {
+ FREE(region);
+}
+
+vq_Region *vq_copyRegion(const vq_Region *region) {
+ vq_Region *dst = vq_createRegion(region->dimensions);
+ memcpy(dst, region, VQ_REGION_SIZE(region->dimensions));
+ return dst;
+}
+
+int vq_compareRegion(const vq_Region *a, const vq_Region *b) {
+ if (a->dimensions < b->dimensions) return -1;
+ if (a->dimensions > b->dimensions) return 1;
+ return strncmp((const char *)a, (const char *)b, VQ_REGION_SIZE(a->dimensions));
+}
+
+bool vq_AxisSpanIsOne(const vq_AxisSpan *s) {
+ const pos_t a = s->start;
+ const pos_t p = s->peak;
+ const pos_t z = s->end;
+ return a > p || p > z || (a < 0 && z > 0 && p != 0) || (p == 0);
+}
+
+static pos_t INLINE weightAxisRegion(const vq_AxisSpan *as, const pos_t x) {
+ const pos_t a = as->start;
+ const pos_t p = as->peak;
+ const pos_t z = as->end;
+ if (a > p || p > z) {
+ return 1;
+ } else if (a < 0 && z > 0 && p != 0) {
+ return 1;
+ } else if (p == 0) {
+ return 1;
+ } else if (x < a || x > z) {
+ return 0;
+ } else if (x == p) {
+ return 1;
+ } else if (x < p) {
+ return (x - a) / (p - a);
+ } else {
+ return (z - x) / (z - p);
+ }
+}
+static pos_t vqRegionGetWeight(const vq_Region *r, const VV *v) {
+ pos_t w = 1;
+ for (size_t j = 0; j < r->dimensions && v->length; j++) {
+ w *= weightAxisRegion(&r->spans[j], v->items[j]);
+ }
+ return w;
+}
+
+void vq_showRegion(const vq_Region *r) {}