Code

Updated cases for attributes added in <color-profile> support
[inkscape.git] / src / removeoverlap / placement_SolveVPSC.cpp
1 #include <jni.h>
2 #include "placement_SolveVPSC.h"
3 #include <stdio.h>
4 #include "solve_VPSC.h"
5 #include "variable.h"
6 #include "constraint.h"
7 #include "remove_rectangle_overlap.h"
8 #include "generate-constraints.h"
9 #include <assert.h>
10 #include <map>
11 #define MaxSize 500
13 JNIEXPORT jdouble JNICALL Java_placement_SolveVPSC_solve
14   (JNIEnv *env, jobject obj, jobjectArray vName, jdoubleArray vWeight, jdoubleArray vDesPos, jintArray cLeft, jintArray cRight, jdoubleArray cGap, jdoubleArray vResult, jint mode)
15 {
16         jsize n = env->GetArrayLength(vWeight);
17         jsize m = env->GetArrayLength(cLeft);
18         int i;
19         double *lvWeight = env->GetDoubleArrayElements(vWeight, 0);
20         double *lvDesPos = env->GetDoubleArrayElements(vDesPos, 0);
21         long *lcLeft = env->GetIntArrayElements(cLeft, 0);
22         long *lcRight = env->GetIntArrayElements(cRight, 0);
23         double *lcGap = env->GetDoubleArrayElements(cGap, 0);
24         Variable **vs=new Variable*[n];
25         Constraint **cs=new Constraint*[m];
26         for (i=0; i<n; i++) {
27                 jstring lvName = (jstring)env->GetObjectArrayElement(vName, i);
28                 const char *name = env->GetStringUTFChars(lvName, NULL); 
29                 // once upon a time variables had real names, now you'll have to 
30                 // track them by number.
31                 vs[i]=new Variable(i,lvDesPos[i],lvWeight[i]);
32         }
33         for (i=0; i<m; i++) {
34                 cs[i]=new Constraint(vs[lcLeft[i]],vs[lcRight[i]],lcGap[i]);
35         }
36         double cost=0;
37         VPSC vpsc(vs,n,cs,m);
38         if(mode==0) {
39                 vpsc.satisfy();
40         } else {
41                 vpsc.solve();
42         }
43         for (i=0; i<n; i++) {
44                 double p=vs[i]->position();
45                 env->SetDoubleArrayRegion(vResult, i,1,&p);
46         }
47         for (i=0; i<m; i++) {
48                 delete cs[i];
49         }
50         delete [] cs;
51         for (i=0; i<n; i++) {
52                 delete vs[i];
53         }
54         env->ReleaseIntArrayElements(cLeft, lcLeft, 0);
55         env->ReleaseIntArrayElements(cRight, lcRight, 0);
56         env->ReleaseDoubleArrayElements(cGap, lcGap, 0);
57         env->ReleaseDoubleArrayElements(vWeight, lvWeight, 0);
58         env->ReleaseDoubleArrayElements(vDesPos, lvDesPos, 0);
59         delete [] vs;
60         return cost;
61 }
63 static Variable **vs;
64 static Constraint **cs;
65 static int m,n;
66 JNIEXPORT jint JNICALL Java_placement_SolveVPSC_generateXConstraints
67 (JNIEnv *env, jobject obj, jdoubleArray rMinX, jdoubleArray rMaxX, jdoubleArray rMinY, jdoubleArray rMaxY, jdoubleArray rWeight) {
68         n = (int)env->GetArrayLength(rWeight);
69         Rectangle **rs=new Rectangle*[n];
70         double *ws = env->GetDoubleArrayElements(rWeight, 0);
71         double *minX = env->GetDoubleArrayElements(rMinX, 0);
72         double *maxX = env->GetDoubleArrayElements(rMaxX, 0);
73         double *minY = env->GetDoubleArrayElements(rMinY, 0);
74         double *maxY = env->GetDoubleArrayElements(rMaxY, 0);
75         for(int i=0;i<n;i++) rs[i]=new Rectangle(minX[i],maxX[i],minY[i],maxY[i]);
76         m = generateXConstraints(rs, ws, n, vs, cs, true);
77         return m;
78 }
80 JNIEXPORT jint JNICALL Java_placement_SolveVPSC_generateYConstraints
81 (JNIEnv *env, jobject obj, jdoubleArray rMinX, jdoubleArray rMaxX, jdoubleArray rMinY, jdoubleArray rMaxY, jdoubleArray rWeight) {
82         n = (int)env->GetArrayLength(rWeight);
83         Rectangle **rs=new Rectangle*[n];
84         double *ws = env->GetDoubleArrayElements(rWeight, 0);
85         double *minX = env->GetDoubleArrayElements(rMinX, 0);
86         double *maxX = env->GetDoubleArrayElements(rMaxX, 0);
87         double *minY = env->GetDoubleArrayElements(rMinY, 0);
88         double *maxY = env->GetDoubleArrayElements(rMaxY, 0);
89         for(int i=0;i<n;i++) rs[i]=new Rectangle(minX[i],maxX[i],minY[i],maxY[i]);
90         m = generateYConstraints(rs, ws, n, vs, cs);
91         return m;
92 }
93 using namespace std;
94 JNIEXPORT void JNICALL Java_placement_SolveVPSC_getConstraints
95 (JNIEnv *env, jobject obj, jintArray cLeft, jintArray cRight, jdoubleArray cGap) {
96         map<Variable*,int> vmap;
97         for(int i=0;i<n;i++) {
98                 vmap[vs[i]]=i;
99         }
100         
101         for(int i=0;i<m;i++) {
102                 jint l=vmap[cs[i]->left];
103                 jint r=vmap[cs[i]->right];
104                 double g=cs[i]->gap;
105                 env->SetIntArrayRegion(cLeft, i,1,&l);
106                 env->SetIntArrayRegion(cRight, i,1,&r);
107                 env->SetDoubleArrayRegion(cGap, i,1,&g);
108         }
110 JNIEXPORT void JNICALL Java_placement_SolveVPSC_removeOverlaps
111 (JNIEnv *env, jobject obj, jdoubleArray rMinX, jdoubleArray rMaxX, jdoubleArray rMinY, jdoubleArray rMaxY) {
112         //assert(1==2); //break for debugging
113         n = (int)env->GetArrayLength(rMinX);
114         Rectangle **rs=new Rectangle*[n];
115         double *minX = env->GetDoubleArrayElements(rMinX, 0);
116         double *maxX = env->GetDoubleArrayElements(rMaxX, 0);
117         double *minY = env->GetDoubleArrayElements(rMinY, 0);
118         double *maxY = env->GetDoubleArrayElements(rMaxY, 0);
119         for(int i=0;i<n;i++) rs[i]=new Rectangle(minX[i],maxX[i],minY[i],maxY[i]);
120         removeRectangleOverlap(rs,n,0,0);
121         for (i=0; i<n; i++) {
122                 double x=rs[i]->getMinX();
123                 double y=rs[i]->getMinY();
124                 env->SetDoubleArrayRegion(rMinX, i,1,&x);
125                 env->SetDoubleArrayRegion(rMinY, i,1,&y);
126         }
127         delete [] rs;
128         env->ReleaseDoubleArrayElements(rMaxX, maxX, 0);
129         env->ReleaseDoubleArrayElements(rMaxY, maxY, 0);