From f6fef8184d22732f5a1eef8ccbaa168ee9584d6a Mon Sep 17 00:00:00 2001 From: Sebastian Tia Date: Sat, 6 May 2023 14:18:53 -0400 Subject: [PATCH 1/6] wip --- fpdf/enums.py | 12 ++++ fpdf/fpdf.py | 40 +++++++++++++ help.pdf | Bin 0 -> 1161 bytes test/mirror.pdf | Bin 0 -> 1728 bytes test/mirror_text.pdf | Bin 0 -> 1116 bytes test/test_mirror.py | 131 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 help.pdf create mode 100644 test/mirror.pdf create mode 100644 test/mirror_text.pdf create mode 100644 test/test_mirror.py diff --git a/fpdf/enums.py b/fpdf/enums.py index 2c0e79197..32b73a9de 100644 --- a/fpdf/enums.py +++ b/fpdf/enums.py @@ -394,6 +394,18 @@ class YPos(CoerciveEnum): "bottom page margin (end of printable area)" +class Angle(CoerciveIntEnum): + "Direction values used for mirror transformations specifying the angle of mirror line" + NORTH = 90 + EAST = 0 + SOUTH = 270 + WEST = 180 + NORTHEAST = 45 + SOUTHEAST = 315 + SOUTHWEST = 225 + NORTHWEST = 135 + + class PageLayout(CoerciveEnum): "Specify the page layout shall be used when the document is opened" diff --git a/fpdf/fpdf.py b/fpdf/fpdf.py index fc0813aac..b1274b32b 100644 --- a/fpdf/fpdf.py +++ b/fpdf/fpdf.py @@ -53,6 +53,7 @@ class Image: from .enums import ( AccessPermission, Align, + Angle, AnnotationFlag, AnnotationName, CharVPos, @@ -2570,6 +2571,45 @@ def skew(self, ax=0, ay=0, x=None, y=None): ) yield + @check_page + @contextmanager + def mirror(self, angle, origin=(None, None)): + """ + This method allows to perform a reflection transformation over a given mirror line. + It must be used as a context-manager using `with`: + + with mirror(angle="SOUTH", origin=(15,15)): + pdf.something() + + The mirror transformation affects all elements which are printed inside the indented + context (with the exception of clickable areas). + + Args: + angle: (fpdf.enums.Angle): the direction of the mirror line + origin (Sequence[float, float]): a point on the mirror line + """ + angle = Angle.coerce(angle) + x, y = origin + + if x is None: + x = self.x + if y is None: + y = self.y + + theta = angle.value + + a = math.cos(math.radians(theta * 2)) + b = math.sin(math.radians(theta * 2)) + d = a * -1 + cx, cy = x * self.k, (self.h - y) * self.k + + with self.local_context(): + self._out( + f"{a:.5f} {b:.5f} {b:.5f} {d:.5f} {cx:.2f} {cy:.2f} cm " + f"1 0 0 1 -{cx:.2f} -{cy:.2f} cm" + ) + yield + @check_page @contextmanager def local_context( diff --git a/help.pdf b/help.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6b736be07b930a09df4833f79cd36750bcc0a6cc GIT binary patch literal 1161 zcmah|TSyd97$za9A?QX_1agQ(H*n9)uCva>V(!lDkY=f?WVviG?jE;^@r=!!jV-!B z4?R@S#fqW}CS^U8WDrqA5lThASVjg3Nrc_3AcCNW>YQ~qhkWQf%$fPl`M>|4|NH*p zdQ~eEynapqJg{1~a={=66)TMi5IDHjNID?qr$^B^2iKvbp@*#ui18E=Wzp-CfK)Dc zC7GT!?dU)N*6S(caFvxD!bwKwbJ5myARI~%!@@aE05yZG0XS`%lz@fS>N~770k94u z#WK_FcoKF1D=(T)qUc07t&}SbD{-oNOb{jxD4&d}*KPWlXNV%lO4|wKfPkBlC3o?$ z&^(`Jm;~9hR#PWPMF}g3I9Q8tifjQsQDjjLv60@+WzL=(8mt+pnm2Q3_q{jX^i$Nl zx-k}7{AJ)*L27xaQK(d{etn=*Eh&Bfy?fcm`RjZ8;|WjOU2$Y)^Q}4ClVwj9;wMet zYDc?oo?p>5v90gZ&!WVS%GTgmpR&7XfB(>D*s!_h+{nZ0dqQ(3#^WEov*pmTQ!NjA z_gzqSp1GZPvBBS5P*St+&cuzir>}NB>c9AQiRa;O{_CQjXNJu#&#Icwhlg%n+Iy|A zZ?GeBtV)lczwk)v+%o=Qc+>I6uNz)nKRNQ!|LkDP(OKhTJ-b#OD%hnxpZ%_`K}fy1 z+dV2@xnGmfVTQ^K(XGgx#*okP#Flt!@u%V^HR*l;%z*@oHRS*lxQbd!aa3G=t pR9Ol66(u4?cu`V$Nz=k=r1JkavR!tFZj)@ABvIgsiz9U!_Xh!AZ~p)Q literal 0 HcmV?d00001 diff --git a/test/mirror.pdf b/test/mirror.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7ead930ed8226b0d9a508bae7abb8a553cb0cb36 GIT binary patch literal 1728 zcmah~Yfuwc6h@Fr*C<7tBDIApc}fgvI)_!8#kL81s|vr zaoTDtV?o8Lbvo2`NTt@%wqmt$5XWkqY0&{ud`_!%6ogWz#M)gRB@UhG{j)dc?)mQ7 z^L^(_l3txP7fr(;6d-^uTLH=C5UiqI6bn!YUSu;nK_SK+8Hyn|mo(c5CG7@<2p19K z;xwTQ$V6zG4ChYs*EmQ3>j^9AgcJ&hq|7{=FbG!XAgK%!Yoncq zI%yYUBAq}I49Q;}gvY0j;$_+FEXi=S+6k6alP20sLU0aAS=n+R6iN6jC(DpT1>|nn zw-aT;W(hJYwFf7IMWHYMmR_s*E-~A&QkPudjc>NZUi;nBGX1pT6%Xj9@YU_Xujdv#3V0K>)34;z+`I|)W@p{t;&zNNv{Tc^C< z^(5JnHbtEN{Xhog-ABc*G!tfj`zo^T;-l6nXE*lK~p>rGG1SHn#pqzCQdMF@?D#WG-N9wZp-(UqpQLR-F`z_q9AvDQL?xsS{Wg zOSpFt5mC>t`;hV|Mdb64!GWbQzN^~;?$C#|F&9#F9)Fx5Uf$t3vbEcf1;U>ocl=c7 z;b*zt4(n2nzeMmhvvBRxB{dNuPvf@01ItrMrr?LI)i;|`<{+944zs)V!1jlPZ07Fj zS5ud@8+T=1sVP9u$NjB;+@B$LC7!v~v7>nUx=m=0_F`WA#eg(x)eEfSt>G+r!=SqGt z7Zpmz;h~r~D8@2`%}z2ye-wGPwIn~#2AXC8Z}pr-YbXm1_*U?HH7JzJgt$s5!PHV| smQpQ}ASj~D#JNUb7=o)YM56frH;RYHk6_rLHlZR^3MD0F>aw7J0C=8Z^#A|> literal 0 HcmV?d00001 diff --git a/test/mirror_text.pdf b/test/mirror_text.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b94c204baa5d7d8c2c98ec8d7edf42735b33420c GIT binary patch literal 1116 zcmah|OK1~87#3+2Mrl3RdJuGMjSs}m?q)a5YAhz3#uQr;6Rozf;5M10tDD`rJCU?{ z5Fdz@f<;8@gCh1=(1Rj~^@UROqIgjR#fv>i5A{;9N^vF+yV!$snceT7|NH;>{%>5- zU}!7f;08S8pxJ#G_%|a7)eN>lQxm{OiqQ!U+DI=p{7IsjMu`)mkVeAL$mu#IV5zNYpP3^NMGUN% zdM;}eVH>jcV&x)=N>ts=JhHW!vC9w@XPD)nX!N*d| zd?8II*rL7aD#1aVG*cL$R%~QQ4-|NgW!c2SY8K>gTpnrz&$$(6f9!af_*Qr6$p%;A zR>Q%Sqm|W%YH9`!EbBiJ&nic1#0wRZZIj2{x9<*A3|Bnp*>e)PM(fr^r-o{?;f`Ie zpRFGltG;q|-^9bF_dQh;TdsW?AHMCq|LRJ3c4Thnqw%p-v)vzu#1HKkr#t4-H=myp z4^6bk^`%o?KP&3LUSIQgCO{oyN@7=0@wsPeAi8CYjw)3Nd_3Eu$pmT6J z0n6S+mUw)TbG4sWSA|~W7mw7wZToVkGPU{5(k=N#Pmi8H&&F7~Txp<^Lz#eT&6x_zk9+?;1 zJTG%}b@K8?j@!7|k({@18gS4HSiHEPN0QtUOv8ChhJ_F`<}sPxhAjui%L~s5jSDf! zLp}dbu1E4Nz#2s=P5B(LR87ZL;T6ZVeoR|NG1DZFy+itbT8y*_nH20h2opZVEhr)v s@GJfh$MJ&T7n&8XUz9kW7lNE9HU0lYL1mk$7AeT& Date: Sat, 6 May 2023 14:53:00 -0400 Subject: [PATCH 2/6] touch up --- fpdf/fpdf.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fpdf/fpdf.py b/fpdf/fpdf.py index b1274b32b..019fc28cb 100644 --- a/fpdf/fpdf.py +++ b/fpdf/fpdf.py @@ -2600,12 +2600,11 @@ def mirror(self, angle, origin=(None, None)): a = math.cos(math.radians(theta * 2)) b = math.sin(math.radians(theta * 2)) - d = a * -1 cx, cy = x * self.k, (self.h - y) * self.k with self.local_context(): self._out( - f"{a:.5f} {b:.5f} {b:.5f} {d:.5f} {cx:.2f} {cy:.2f} cm " + f"{a:.5f} {b:.5f} {b:.5f} {a*-1:.5f} {cx:.2f} {cy:.2f} cm " f"1 0 0 1 -{cx:.2f} -{cy:.2f} cm" ) yield From 55a2c6b68ad6d69e003b02c8fd99fde5d1af0f80 Mon Sep 17 00:00:00 2001 From: Sebastian Tia Date: Sat, 6 May 2023 22:57:50 -0400 Subject: [PATCH 3/6] .mirror() --- CHANGELOG.md | 2 + docs/Transformations.md | 36 +++++++++++- docs/diagonal_mirror.png | Bin 0 -> 60691 bytes docs/horizontal_mirror.png | Bin 0 -> 18230 bytes docs/vertical_mirror.png | Bin 0 -> 17895 bytes fpdf/fpdf.py | 16 +++--- test/mirror_cell.pdf | Bin 0 -> 1257 bytes test/mirror_multi_cell.pdf | Bin 0 -> 1570 bytes test/test_mirror.py | 113 ++++++++++++++++++++++++++----------- 9 files changed, 124 insertions(+), 43 deletions(-) create mode 100644 docs/diagonal_mirror.png create mode 100644 docs/horizontal_mirror.png create mode 100644 docs/vertical_mirror.png create mode 100644 test/mirror_cell.pdf create mode 100644 test/mirror_multi_cell.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a1a4688b..28f3a46ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ in order to get warned about deprecated features used in your code. This can also be enabled programmatically with `warnings.simplefilter('default', DeprecationWarning)`. ## [2.7.5] - Not released yet +### Added +- [`FPDF.mirror()`](https://pyfpdf.github.io/fpdf2/fpdf/fpdf.html#fpdf.fpdf.FPDF.mirror) - New method: [documentation page](https://pyfpdf.github.io/fpdf2/Transformations.html) - Contributed by @sebastiantia ## [2.7.4] - 2023-04-28 ### Added diff --git a/docs/Transformations.md b/docs/Transformations.md index a5d59e8d6..ea33eb1b7 100644 --- a/docs/Transformations.md +++ b/docs/Transformations.md @@ -41,4 +41,38 @@ pdf.set_fill_color(r=230, g=30, b=180) with pdf.skew(ax=-45, ay=0, x=100, y=170): pdf.circle(x=100, y=170, r=10, style="FD") ``` -![](slanted_circle.png) \ No newline at end of file +![](slanted_circle.png) + +## Mirror ## + +The `mirror` context-manager applies a mirror transformation to all objects inserted in its indented block over a given mirror line by specifying starting co-ordinate and angle. + +```python +x = 100 +y = 100 +pdf.text(x, y, txt="mirror this text") +with pdf.mirror("EAST", (x, y)): + pdf.set_text_color(r=255, g=128, b=0) + pdf.text(x, y, txt="mirror this text") +``` +![](horizontal_mirror.png) + +```python +pdf.text(x, y, txt="mirror this text") +with pdf.mirror("NORTH", (x, y)): + pdf.set_text_color(r=255, g=128, b=0) + pdf.text(x, y, txt="mirror this text") +``` +![](vertical_mirror.png) + +```python +prev_x = pdf.x +prev_y = pdf.y +pdf.multi_cell(w=50, txt=LOREM_IPSUM) +with pdf.mirror("NORTHEAST", (pdf.x, pdf.y)): + # Reset cursor to mirror original multi-cell + pdf.x = prev_x + pdf.y = prev_y + pdf.multi_cell(w=50, txt=LOREM_IPSUM, fill=True) +``` +![](diagonal_mirror.png) \ No newline at end of file diff --git a/docs/diagonal_mirror.png b/docs/diagonal_mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..17ad79e819264f0995790c86852b3c79b687a112 GIT binary patch literal 60691 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 literal 0 HcmV?d00001 diff --git a/docs/horizontal_mirror.png b/docs/horizontal_mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..94850d35e0829ef5e305579bc5e9d817c7855cbc GIT binary patch literal 18230 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 literal 0 HcmV?d00001 diff --git a/docs/vertical_mirror.png b/docs/vertical_mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..fa99631a7dacedd28e9b05b95eb577b494f5d836 GIT binary patch literal 17895 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 Date: Sat, 6 May 2023 23:03:24 -0400 Subject: [PATCH 4/6] touch-up --- fpdf/fpdf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fpdf/fpdf.py b/fpdf/fpdf.py index 1209bd7dd..b66e0c608 100644 --- a/fpdf/fpdf.py +++ b/fpdf/fpdf.py @@ -2500,7 +2500,7 @@ def rotate(self, angle, x=None, y=None): @contextmanager def rotation(self, angle, x=None, y=None): """ - This method allows to perform a rotation around a given center. + Method to perform a rotation around a given center. It must be used as a context-manager using `with`: with rotation(angle=90, x=x, y=y): @@ -2541,7 +2541,7 @@ def rotation(self, angle, x=None, y=None): @contextmanager def skew(self, ax=0, ay=0, x=None, y=None): """ - This method allows to perform a skew transformation originating from a given center. + Method to perform a skew transformation originating from a given center. It must be used as a context-manager using `with`: with skew(ax=15, ay=15, x=x, y=y): @@ -2575,7 +2575,7 @@ def skew(self, ax=0, ay=0, x=None, y=None): @contextmanager def mirror(self, angle, origin): """ - This method allows to perform a reflection transformation over a given mirror line. + Method to perform a reflection transformation over a given mirror line. It must be used as a context-manager using `with`: with mirror(angle="SOUTH", origin=(15,15)): From 708f1af0460900c661339d7a1ae82fd5780b1380 Mon Sep 17 00:00:00 2001 From: Sebastian Tia Date: Sun, 7 May 2023 16:02:09 -0400 Subject: [PATCH 5/6] polish --- docs/Transformations.md | 9 +++-- fpdf/fpdf.py | 6 ++-- test/mirror_cell.pdf | Bin 1257 -> 1258 bytes test/mirror_multi_cell.pdf | Bin 1570 -> 1622 bytes test/test_mirror.py | 66 +++++++++++++++++-------------------- 5 files changed, 38 insertions(+), 43 deletions(-) diff --git a/docs/Transformations.md b/docs/Transformations.md index ea33eb1b7..b1dfda657 100644 --- a/docs/Transformations.md +++ b/docs/Transformations.md @@ -51,7 +51,7 @@ The `mirror` context-manager applies a mirror transformation to all objects inse x = 100 y = 100 pdf.text(x, y, txt="mirror this text") -with pdf.mirror("EAST", (x, y)): +with pdf.mirror((x, y), "EAST"): pdf.set_text_color(r=255, g=128, b=0) pdf.text(x, y, txt="mirror this text") ``` @@ -59,17 +59,16 @@ with pdf.mirror("EAST", (x, y)): ```python pdf.text(x, y, txt="mirror this text") -with pdf.mirror("NORTH", (x, y)): +with pdf.mirror((x, y), "NORTH"): pdf.set_text_color(r=255, g=128, b=0) pdf.text(x, y, txt="mirror this text") ``` ![](vertical_mirror.png) ```python -prev_x = pdf.x -prev_y = pdf.y +prev_x, prev_y = pdf.x, pdf.y pdf.multi_cell(w=50, txt=LOREM_IPSUM) -with pdf.mirror("NORTHEAST", (pdf.x, pdf.y)): +with pdf.mirror((pdf.x, pdf.y), "NORTHEAST"): # Reset cursor to mirror original multi-cell pdf.x = prev_x pdf.y = prev_y diff --git a/fpdf/fpdf.py b/fpdf/fpdf.py index b66e0c608..87a3e0730 100644 --- a/fpdf/fpdf.py +++ b/fpdf/fpdf.py @@ -2573,20 +2573,20 @@ def skew(self, ax=0, ay=0, x=None, y=None): @check_page @contextmanager - def mirror(self, angle, origin): + def mirror(self, origin, angle): """ Method to perform a reflection transformation over a given mirror line. It must be used as a context-manager using `with`: - with mirror(angle="SOUTH", origin=(15,15)): + with mirror(origin=(15,15), angle="SOUTH"): pdf.something() The mirror transformation affects all elements which are rendered inside the indented context (with the exception of clickable areas). Args: - angle: (fpdf.enums.Angle): the direction of the mirror line origin (Sequence(float, float)): a point on the mirror line + angle: (fpdf.enums.Angle): the direction of the mirror line """ angle = Angle.coerce(angle) x, y = origin diff --git a/test/mirror_cell.pdf b/test/mirror_cell.pdf index 8481b3e67e0b113c161efd29501cabd550d418d1..1bc99b82397f29907e68c94bb4dca87e63a43d23 100644 GIT binary patch delta 535 zcmaFK`HFLcBV)Z0mz^C~aY<2XVlG$3oVkpe&NEQ`+1&#gH5?x_7@ z+EB`|C2P$rmOZv@YlE*FT3zc7wf^@ge&3Nt`wUbB-ydCa=&WqBu4Hpo?O9G zKN@w|xTH1tQA>(UYJXPW>d3t@Nt+J^_dZ*i8=h{x0?(TW+pt$&D)y*~!wd79rxi{5{nvV1x zQ8sGrDC)j`E#gn_m4jb64!F5*TileRqiX5@FgU~& ze_AvARHLq=PV1M|y1yq?={VKjEa{fMdw=qM^Y6KxRWoE18e=SSPv7|Cen3dMP{!nj z-G>jiN;jH_-*LX^BW6(Tt;7}cNo@0y7K@EPy-=F$?p_K`hoWmd2JQuC6AQj;@Y|rUph9P8Md)E{;YH delta 521 zcmaFG`I2*kBV)ZGmz^C~aY<2XVlG$3oVkpe&NEQ`+1&%0RI^Mq>| zZ&K!uYm}--H_z zD_oWd1m=C*C3X7$#HtyLj5l7KC<~gu$^`9dmNu_Tw zn>CAE{BFBx&zh<=W}Re8%lC9?^p-vB+OclKJBEm$1ro~}mOry+`gSnz%wo23&JUG* z`9J5VebL-TQlhuGG8~XjlVT`AJz^oA)ziGYT6i z7=VC6o&pz`VPIfBnUO`9*}}qXaxjZ^jD>-jg^{V5v5B#Zqm!w#sgbFrk(rB=xw(Ox jnX9XXv7HS;6|s^C`wJ^vNSR0QdM>JcjE#8+w0o% diff --git a/test/mirror_multi_cell.pdf b/test/mirror_multi_cell.pdf index f5f912ac533b41eb69dc096fad5294ef0b586414..463930196a34d72dd74f2617e818d0816f612d93 100644 GIT binary patch delta 904 zcmZ3)bB$+%J!8GOp(&T09anKlQEFl?SH+yYVJC}bI|%IkELt1F=aVMCW7#RoB}Ij< zKN+T)Z1dcBLT97BeeMiLh3p(3&1Udd}pGRjTI zu9w;Q+CeUpgg_6^_1xM&KqV8rf{NvHQ|N$<|j?M_&$+ZQU! zHgVswDH&_41#a(Lo-i*|!li!0Mg=Fn(A-U%SbyiduD$l|)*7wE>FNEkWju>Fl<0I_ z+T;E+yZDXU^yj;i;u~|Ne&^|2nO+tg^79BUt9yK1hu!{T_YRbLRd7Wu+#_^Dd@s*M z{-pFy_h1p_*#-(9*q#P7IQ54(u3`yeDEiS___2k9l~dToGhvdTvVvSopYN{v-EBK$ zSyR0=u65Nb7<%sNNI6?z!Ims$xJE|KebH5=NmCC$^|-QV-g;R(cctm2wQmco#P+Ru zo85kWn>pBTT}G*@}u6&CjRyHXL}DH3!kC=!nM`eV=8m{j0R2jhSd$c z2lt1`woGBtzsuYFc%I||^XV)M2bUeZX;uIA_2hZ6k5@7-5p#KU)9CH{fzO;EYX)Qmhb1CIZ4?)$>;pXiG9BJc@l+A%APznwcaYYFk{7yKfVq#DOJwOnA5klB2#G?9y3b5d{Jp1Jpf`y6i@r9(SoU$khvI6{_(=Me zO0jZ_vj^>#t-MhwcJJVPf4TWeOCn<)ny~$z!S?RZW|KY5_VaDh`eTYB);zuaLY`G` zUf$#<%j+)L?QKt97iY zlcTeNo2!$HrKO9rqp7L6rK_2-rIWLPg|Ul~rK78z4M7#LkUW-HR8motn#N^lY-q@( Ks_N?R#svVjFo1sm delta 852 zcmcb{vxsMdJ!8F@nK7509anKlQEFl?SH+yIVJGu$8wl)ut^MqU+>xT?CAt&jy5gF4 z$tT?KS>@Edc(Ao?rG=ROEMF{fYGl2&mhaC6^u$>fN{T17Xxv)(^}?^(*Z+T1J-@xE-8VKQQDC}oNAkH;We&l^>og6O zU;N=~v+GHaRZOt@*;4R*)7Rhk_}}&ze!0N=)mq`0K*yn5Pu;6;nw37^zW2T0n(tTl zWgb?jTBn(Q?UvvX{x4#4-f8jFFFLYN!OK7NZPzaL|Br6xUd;csXk}usn7{Kz{>2@C z0z{IZc6>TNeZ{eWX|uC#H@vs{pQu-(_jXm*sl}-o7XN-Zf4Q7(#lGb1%rgh2wuH0Y z&f225u6c^mOT{TmPArqrs5zh-l2G89r(n*d&7k_{(4LfIQyP6V(o8sXX9Q31b91ks zD7P*#Z_xv#wxpFm)rF=%4OH=-)hscmJ1OFZjZ2cR$jL*`l!Szr{=D=|Sx9#IuS?HV z#3a>!UwWo0Ca7M!V5k1FhR_=u+MaBFH8-!xzrS8vHu15b8*A<5hXO@Uk4UNsv~d)O zbZGwczV3KJ^TVn<37O|-SoT$&W)KkJJ$LM-O}*XEo2IsW4codhtBrh)KYyt>VM)}Z zI(~0$i@o;qmWHM47*`m(HJR<)^y|pl9Fgz5cN{rAWTzgOde`}hhq!Z{YR)%Ay0t|%rGzn0!%SWi^=;~tz!)x&4CI` zO`OeK%`7b4Obv~lEX>;$^ZZW diff --git a/test/test_mirror.py b/test/test_mirror.py index d329abf5a..a3e4fc233 100644 --- a/test/test_mirror.py +++ b/test/test_mirror.py @@ -8,7 +8,7 @@ HERE = Path(__file__).resolve().parent -def draw_mirror_line(pdf, angle, origin=(None, None)): +def draw_mirror_line(pdf, origin, angle): """ A helper method which converts a given angle and origin to two co-ordinates to then draw a line. @@ -16,17 +16,13 @@ def draw_mirror_line(pdf, angle, origin=(None, None)): Args: pdf (fpdf.FPDF): pdf to modify - angle: (fpdf.enums.Angle): the direction of the mirror line origin (Sequence[float, float]): a point on the mirror line + angle: (fpdf.enums.Angle): the direction of the mirror line """ angle = Angle.coerce(angle) x, y = origin - if x is None: - x = pdf.x - if y is None: - y = pdf.y theta = angle.value @@ -53,23 +49,23 @@ def test_mirror(tmp_path): pdf.image(img_filepath, x=100, y=100) pdf.image(img_filepath, x=100, y=100) - with pdf.mirror("WEST", (pdf.epw / 2, pdf.eph / 2.5)): - draw_mirror_line(pdf, "WEST", (pdf.epw / 2, pdf.eph / 2.5)) + with pdf.mirror((pdf.epw / 2, pdf.eph / 2.5), "WEST"): + draw_mirror_line(pdf, (pdf.epw / 2, pdf.eph / 2.5), "WEST") pdf.image(img_filepath, x=100, y=100) - with pdf.mirror("SOUTH", (pdf.epw / 2.5, pdf.eph / 2)): + with pdf.mirror((pdf.epw / 2.5, pdf.eph / 2), "SOUTH"): pdf.set_draw_color(r=128, g=0, b=0) - draw_mirror_line(pdf, "SOUTH", (pdf.epw / 2.5, pdf.eph / 2)) + draw_mirror_line(pdf, (pdf.epw / 2.5, pdf.eph / 2), "SOUTH") pdf.image(img_filepath, x=100, y=100) - with pdf.mirror("SOUTHWEST", (pdf.epw / 1.5, pdf.eph / 1.5)): + with pdf.mirror((pdf.epw / 1.5, pdf.eph / 1.5), "SOUTHWEST"): pdf.set_draw_color(r=0, g=0, b=128) - draw_mirror_line(pdf, "SOUTHWEST", (pdf.epw / 1.5, pdf.eph / 1.5)) + draw_mirror_line(pdf, (pdf.epw / 1.5, pdf.eph / 1.5), "SOUTHWEST") pdf.image(img_filepath, x=100, y=100) - with pdf.mirror("SOUTHEAST", (pdf.epw / 3, pdf.eph / 2.5)): + with pdf.mirror((pdf.epw / 3, pdf.eph / 2.5), "SOUTHEAST"): pdf.set_draw_color(r=0, g=128, b=0) - draw_mirror_line(pdf, "SOUTHEAST", (pdf.epw / 3, pdf.eph / 2.5)) + draw_mirror_line(pdf, (pdf.epw / 3, pdf.eph / 2.5), "SOUTHEAST") pdf.image(img_filepath, x=100, y=100) assert_pdf_equal(pdf, HERE / "mirror.pdf", tmp_path) @@ -82,16 +78,16 @@ def test_mirror_text(tmp_path): pdf.text(pdf.epw / 2, pdf.epw / 2, txt="mirror this text") - with pdf.mirror("EAST", (pdf.epw / 2, pdf.eph / 2.5)): + with pdf.mirror((pdf.epw / 2, pdf.eph / 2.5), "EAST"): pdf.text(pdf.epw / 2, pdf.eph / 2, txt="mirrored text E/W") - with pdf.mirror("NORTH", (pdf.epw / 2.5, pdf.eph / 2)): + with pdf.mirror((pdf.epw / 2.5, pdf.eph / 2), "NORTH"): pdf.text(pdf.epw / 2, pdf.eph / 2, txt="mirrored text N/S") - with pdf.mirror("NORTHWEST", (pdf.epw / 1.5, pdf.eph / 1.5)): + with pdf.mirror((pdf.epw / 1.5, pdf.eph / 1.5), "NORTHWEST"): pdf.text(pdf.epw / 2, pdf.eph / 2, txt="mirrored text NW/SE") - with pdf.mirror("NORTHEAST", (pdf.epw / 2.5, pdf.eph / 2.5)): + with pdf.mirror((pdf.epw / 2.5, pdf.eph / 2.5), "NORTHEAST"): pdf.text(pdf.epw / 2, pdf.eph / 2, txt="mirrored text NE/SW") assert_pdf_equal(pdf, HERE / "mirror_text.pdf", tmp_path) @@ -105,8 +101,8 @@ def test_mirror_cell(tmp_path): pdf.cell(txt="cell to be mirrored repeatedly") pdf.x = pdf.l_margin - with pdf.mirror("NORTH", (pdf.epw / 2, 0)): - draw_mirror_line(pdf, "NORTH", (pdf.epw / 2, 0)) + with pdf.mirror((pdf.epw / 2, 0), "NORTH"): + draw_mirror_line(pdf, (pdf.epw / 2, 0), "NORTH") pdf.cell(txt="cell mirrored", fill=True) pdf.cell(txt="cell mirrored", fill=True) pdf.cell(txt="cell mirrored", fill=True) @@ -114,23 +110,23 @@ def test_mirror_cell(tmp_path): pdf.cell(txt="cell text 1") pdf.x = pdf.l_margin - with pdf.mirror("EAST", (pdf.epw / 2, pdf.eph / 4)): - draw_mirror_line(pdf, "EAST", (pdf.epw / 2, pdf.eph / 4)) + with pdf.mirror((pdf.epw / 2, pdf.eph / 4), "EAST"): + draw_mirror_line(pdf, (pdf.epw / 2, pdf.eph / 4), "EAST") pdf.cell(txt="cell text 1", fill=True) pdf.ln(40) pdf.cell(txt="cell text 2") pdf.x = pdf.l_margin - with pdf.mirror("SOUTHWEST", (pdf.epw / 2, 0)): - draw_mirror_line(pdf, "SOUTHWEST", (pdf.epw / 2, 0)) + with pdf.mirror((pdf.epw / 2, 0), "SOUTHWEST"): + draw_mirror_line(pdf, (pdf.epw / 2, 0), "SOUTHWEST") pdf.cell(txt="cell text 2", fill=True) pdf.ln(40) pdf.cell(txt="cell text 3") pdf.x = pdf.l_margin - with pdf.mirror("NORTHEAST", (pdf.epw / 2, pdf.eph / 4)): - draw_mirror_line(pdf, "NORTHEAST", (pdf.epw / 2, pdf.eph / 4)) - pdf.cell(txt="cell text 3", fill=True) + with pdf.mirror((pdf.epw / 2, pdf.eph / 4), "NORTHEAST"): + draw_mirror_line(pdf, (pdf.epw / 2, pdf.eph / 4), "NORTHEAST") + pdf.cell(txt="cell text 3", fill=True, border=1) pdf.ln(40) assert_pdf_equal(pdf, HERE / "mirror_cell.pdf", tmp_path) @@ -146,8 +142,8 @@ def test_mirror_multi_cell(tmp_path): pdf.x = pdf.l_margin pdf.y = pdf.t_margin - with pdf.mirror("NORTHEAST", (pdf.epw / 2, pdf.eph / 4)): - draw_mirror_line(pdf, "NORTHEAST", (pdf.epw / 2, pdf.eph / 4)) + with pdf.mirror((pdf.epw / 2, pdf.eph / 4), "NORTHEAST"): + draw_mirror_line(pdf, (pdf.epw / 2, pdf.eph / 4), "NORTHEAST") pdf.multi_cell(w=50, txt=LOREM_IPSUM[:200], fill=True) pdf.ln(20) @@ -156,8 +152,8 @@ def test_mirror_multi_cell(tmp_path): pdf.x = pdf.l_margin pdf.y = prev_y - with pdf.mirror("EAST", (0, pdf.eph / 2)): - draw_mirror_line(pdf, "EAST", (0, pdf.eph / 2)) + with pdf.mirror((0, pdf.eph / 2), "EAST"): + draw_mirror_line(pdf, (0, pdf.eph / 2), "EAST") pdf.multi_cell(w=100, txt=LOREM_IPSUM[:200], fill=True) pdf.ln(150) @@ -166,13 +162,13 @@ def test_mirror_multi_cell(tmp_path): pdf.x = pdf.l_margin pdf.y = prev_y - with pdf.mirror("SOUTH", (pdf.epw / 2, pdf.eph)): - draw_mirror_line(pdf, "SOUTH", (pdf.epw / 2, pdf.eph)) - pdf.multi_cell(w=120, txt=LOREM_IPSUM[:120], fill=True) + with pdf.mirror((pdf.epw / 2, pdf.eph), "SOUTH"): + draw_mirror_line(pdf, (pdf.epw / 2, pdf.eph), "SOUTH") + pdf.multi_cell(w=120, txt=LOREM_IPSUM[:120], fill=True, border=1) pdf.output(HERE / "mirror_multi_cell.pdf") assert_pdf_equal( pdf, HERE / "mirror_multi_cell.pdf", - tmp_path, + tmp_path ) From 49f88efd9e0d790a799e9a28bad05b214772624d Mon Sep 17 00:00:00 2001 From: Sebastian Tia Date: Sun, 7 May 2023 17:17:39 -0400 Subject: [PATCH 6/6] reformat --- test/test_mirror.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/test_mirror.py b/test/test_mirror.py index a3e4fc233..ec7ffa8cd 100644 --- a/test/test_mirror.py +++ b/test/test_mirror.py @@ -167,8 +167,4 @@ def test_mirror_multi_cell(tmp_path): pdf.multi_cell(w=120, txt=LOREM_IPSUM[:120], fill=True, border=1) pdf.output(HERE / "mirror_multi_cell.pdf") - assert_pdf_equal( - pdf, - HERE / "mirror_multi_cell.pdf", - tmp_path - ) + assert_pdf_equal(pdf, HERE / "mirror_multi_cell.pdf", tmp_path)