From c85fa00d6288d594bde1258fd186ec3c16efa3ac Mon Sep 17 00:00:00 2001 From: Tilman Hausherr Date: Mon, 3 Aug 2015 17:34:30 +0200 Subject: [PATCH] fix handling of flags 1-3 in coons shading Short story: somebody got lost in two different indices. pi is an index in the stream and is explained on page 198 of the 32000-spec (however 1-based there), and ps is an index to something in PDF.js. I used the code from flag 0 (which works) to understand which is which. It is also important to understand that for flags 1,2 and 3, the stream is always assigned to the same coordinates and colors. What changes is which "old" coordinates and colors are assigned to what is "missing" in the stream. This is why for these flags, the code is identical except for the assignments in the first "row". --- src/core/pattern.js | 39 ++++++++++++---------- test/pdfs/.gitignore | 1 + test/pdfs/coons-allflags-withfunction.pdf | Bin 0 -> 3285 bytes test/test_manifest.json | 6 ++++ 4 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 test/pdfs/coons-allflags-withfunction.pdf diff --git a/src/core/pattern.js b/src/core/pattern.js index 0321e1b4b..c6721af59 100644 --- a/src/core/pattern.js +++ b/src/core/pattern.js @@ -508,29 +508,32 @@ Shadings.Mesh = (function MeshClosure() { break; case 1: tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = pi + 5; ps[13] = pi + 4; ps[14] = pi + 3; ps[15] = pi + 2; - ps[ 8] = pi + 6; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 1; - ps[ 4] = pi + 7; /* calculated below */ ps[ 7] = pi; - ps[ 0] = tmp1; ps[ 1] = tmp2; ps[ 2] = tmp3; ps[ 3] = tmp4; + ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; + ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; + ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; + ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = ci + 1; cs[3] = ci; - cs[0] = tmp1; cs[1] = tmp2; + cs[2] = tmp2; cs[3] = ci; + cs[0] = tmp1; cs[1] = ci + 1; break; case 2: - ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6; ps[15] = pi + 5; - ps[ 8] = ps[11]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 4; - ps[ 4] = ps[7]; /* calculated below */ ps[ 7] = pi + 3; - ps[ 0] = ps[3]; ps[ 1] = pi; ps[ 2] = pi + 1; ps[ 3] = pi + 2; - cs[2] = cs[3]; cs[3] = ci + 1; - cs[0] = cs[1]; cs[1] = ci; + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; + ps[ 8] = ps[7]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; + ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; + ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; cs[3] = ci; + cs[0] = tmp1; cs[1] = ci + 1; break; case 3: - ps[12] = ps[0]; ps[13] = ps[1]; ps[14] = ps[2]; ps[15] = ps[3]; - ps[ 8] = pi; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7; - ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 6; - ps[ 0] = pi + 2; ps[ 1] = pi + 3; ps[ 2] = pi + 4; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = cs[1]; - cs[0] = ci; cs[1] = ci + 1; + ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; + ps[ 8] = ps[1]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; + ps[ 4] = ps[2]; /* calculated below */ ps[ 7] = pi + 4; + ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; + cs[2] = cs[0]; cs[3] = ci; + cs[0] = cs[1]; cs[1] = ci + 1; break; } // set p11, p12, p21, p22 diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 165920653..cc9337416 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -127,6 +127,7 @@ !bug946506.pdf !issue3885.pdf !bug859204.pdf +!coons-allflags-withfunction.pdf !issue4246.pdf !issue4461.pdf !issue4573.pdf diff --git a/test/pdfs/coons-allflags-withfunction.pdf b/test/pdfs/coons-allflags-withfunction.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fcbf775dcf972a4786a8834acd75cf5c5224260c GIT binary patch literal 3285 zcmb_f&u`mQ91rZ~16L+akB!cSk-Yb8CvmJKRhul`v}ViFq7|h*xb{nG>e!L}Lb6_< zAkK^v7fwhVCUKdNc0q_E94d_?$7w>GkoXhE_dPqQvs445y6x-p=Y4G@IzDrq>Edg&sl_U%eOgeGADFdy{^POV)js(esg_? z{HAO7NN)Y|)ymhm*M8l5`=`q{KU{t1^VLSd~W<&mKQMIoY`P-u<`k zqc?NUzk6es1#T(@c0#kzC;t;AMT|3>b{>ov?$`r{+syUsjc|&31ddBoL*x6v=Ob>Q%z<{2vJE~-Jjba zf|8a(*Hi>yH)G+MceqvCuD!_fXu|qOiC0g`7(xz_w+o?o>W!JRse3Yk3ENVH#Zd6isJ6&X-PK?C0Q3< zKnIjhYaBS-3j&&2vrA|MS;|Lg;$V7eqYKowxWr{{w9spNYi_{6K+B;Y46e$ZYMSRyo0kds1T zP1J)9*ux5LfZf-gZJnN;ijrF#0wSns(q@646-YB2+FsC0vd|!6qY%;06t)R^CsW|E zHBwPR1PqR(X`s}`2V5Y#?X6iBsBReZG*s87FdmK=M+a=+1vT~WAAeSn=hoEw#Wrb= z8tl-!c^t9r<2yUf@sU$;)wQ}(U9(}1vHa8?<@<7K#)!pE?MkD&)w&`Grq*;g8iE;U zI`o6sn$}dwV!>X(SVfYAAJx>|b_ek=^p8A_v_hpo^HhHy^&@-8CSi1hXrZKn$jI$m z-DWEl2yZp@kn@p+@nkY7O!Pt+4KS@#Dwt?k)AB%(j~@iwp5}x2D(I7jc)N49ATCIo z3Qjo0-Y%vEf@g}F;7;U?Wc3Th_CYx2HFZ4pT+6Y`WzDRZdEF^i@|3b-p1_muAK0|t zH_D`_nKN~xjF}7i-~bfr5C_;Y!=jqH+1WyyhhfYU{RqNgs5o{1qO5}4oF4^9 zXc~qp&{*xz_4*H*(CKxJP;k@C6Mcu8mO(6HTql}ENEN?C3CRc627GG5r|5rR%}{1o z!)OOeqW(c}6oivteKhht#}?^G^hu_ariw*|GO@YnXxXE7`_=Ip4n;u=I;$Bv;~|W} zTh0GdE*G6)*O?nU8b`kD4cEcUXTr7^l1#y3*RlFxG_;|z?Xw7Ds7SS5g+uOfpVejO zt@}LL_@3w_%eR9;O`Yal*0;w#S0Pi9+D)?Id-Y@^`S6*nb8;mi=xj(Ep3jZCf-dN} zI6-H_5{7wAorqDmG}bd$idk2$p4Zgx!Z;T_0wpcFWVLCD79%Fnsc8_|T`D0ekUOm`1Fx5Jbz0m`BNjO2wjHM13^F3<8%p@t|OaX{8c;7%gH%H{inc5(YPgB@B#S z!l!+#FVzgV63*oD z$o6~|!Pf?ax4mPyK$j8jh9O*d#PtZ_TR}fW={5US6ZNV$s7XyzE3TWwpe?<*u9>aM jI@QZMAdRwK|96Ugap8@*9dVgl4ZZ*MWI%BN& literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index b91a6a9a1..ff7efb60b 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2247,6 +2247,12 @@ "lastPage": 4, "type": "eq" }, + { "id": "issue4227", + "file": "pdfs/coons-allflags-withfunction.pdf", + "md5": "c5f79c24bf9eb66698be0e4ecaa1bdf8", + "rounds": 1, + "type": "eq" + }, { "id": "issue4246", "file": "pdfs/issue4246.pdf", "md5": "ed81787b83cc317c9f049643b853bea3",