From d385e205a512478c8c327e01e075274ab9fe7098 Mon Sep 17 00:00:00 2001 From: Andy Meneely Date: Fri, 22 Oct 2021 23:15:11 -0400 Subject: [PATCH] Fix bugs and cleanup to save_sheet --- .vscode/settings.json | 4 +++ docs/dsl/save_sheet.rst | 8 ++++- lib/squib/graphics/save_doc.rb | 34 +++++++++--------- samples/saves/_saves.rb | 12 ------- .../save_sheet_custom_rotate_00_expected.png | Bin 0 -> 2575 bytes .../save_sheet_custom_rotate_01_expected.png | Bin 0 -> 1404 bytes .../save_sheet_unrotated_00_expected.png | Bin 0 -> 2039 bytes .../save_sheet_unrotated_01_expected.png | Bin 0 -> 1151 bytes 8 files changed, 28 insertions(+), 30 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 samples/saves/save_sheet_custom_rotate_00_expected.png create mode 100644 samples/saves/save_sheet_custom_rotate_01_expected.png create mode 100644 samples/saves/save_sheet_unrotated_00_expected.png create mode 100644 samples/saves/save_sheet_unrotated_01_expected.png diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..86acf76 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "restructuredtext.confPath": "${workspaceFolder}\\docs", + "restructuredtext.linter.disabled": true +} \ No newline at end of file diff --git a/docs/dsl/save_sheet.rst b/docs/dsl/save_sheet.rst index c515956..aeb382e 100644 --- a/docs/dsl/save_sheet.rst +++ b/docs/dsl/save_sheet.rst @@ -44,7 +44,9 @@ suffix rotate default: ``false`` - If ``true``, the saved cards will be rotated 90 degrees clockwise. Or, rotate by the number of radians. Intended to rendering landscape instead of portrait. Possible values: ``true``, ``false``, ``:clockwise``, ``:counterclockwise`` + if ``true``, all saved cards will be rotated 90 degrees clockwise. Possible values: ``true``, ``false``, ``:clockwise``, ``:counterclockwise`` + + Supports arrays so you can rotate individual cards different ways if that's how you want to roll, e.g. ``rotate: [:clockwise, :counterclockwise]`` dir default: ``'_output'`` @@ -78,3 +80,7 @@ rtl Examples -------- + +.. literalinclude:: ../../samples/saves/_saves.rb + :language: ruby + :linenos: diff --git a/lib/squib/graphics/save_doc.rb b/lib/squib/graphics/save_doc.rb index 4c6c2fa..982893e 100644 --- a/lib/squib/graphics/save_doc.rb +++ b/lib/squib/graphics/save_doc.rb @@ -4,7 +4,8 @@ module Squib # :nodoc: # @api private def render_sheet(range, batch, sheet) - w,h,sheet_width,sheet_height = compute_dimensions(sheet, batch) + rotate = batch.rotate.any? true # either rotate all or none + w,h,sheet_width,sheet_height = compute_dimensions(sheet, rotate) cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height)) num_this_sheet = 0 sheet_num = 0 @@ -24,31 +25,32 @@ module Squib end surface = preprocess(@cards[i].cairo_surface, sheet.trim, w, h, - batch.rotate[i], batch.angle[i]) + rotate, batch.angle[i]) cc.set_source(surface, x, y) cc.paint num_this_sheet += 1 - x += (w + sheet.gap - 2 * sheet.trim) * (sheet.rtl ? -1 : 1) + x += (w + sheet.gap) * (sheet.rtl ? -1 : 1) if num_this_sheet % sheet.columns == 0 # new row x = sheet.rtl ? rtl_start_x(sheet_width, sheet, w) : sheet.margin - y += surface.height + sheet.gap + y += h + sheet.gap end - bar.increment end cc.target.write_to_png(batch.full_filename(sheet_num)) end end - def compute_dimensions(sheet, batch) - w,h = batch.rotate ? [@height,@width] : [@width,@height] - sheet_width = (sheet.columns * (w + 2 * sheet.gap - 2 * sheet.trim)) + (2 * sheet.margin) - sheet_height = (sheet.rows * (h + 2 * sheet.gap - 2 * sheet.trim)) + (2 * sheet.margin) + def compute_dimensions(sheet, rotate) + w,h = rotate ? [@height,@width] : [@width,@height] + w -= 2 * sheet.trim + h -= 2 * sheet.trim + sheet_width = (sheet.columns * (w + 2 * sheet.gap)) + (2 * sheet.margin) + sheet_height = (sheet.rows * (h + 2 * sheet.gap)) + (2 * sheet.margin) return [w, h, sheet_width, sheet_height] end def rtl_start_x(sheet_width, sheet, w) - return sheet_width - sheet.margin - sheet.gap - w + 2 * sheet.trim + return sheet_width - sheet.margin - sheet.gap - w end # Return a new Cairo::ImageSurface that is trimmed and rotated @@ -56,16 +58,14 @@ module Squib # :nodoc: # @api private def preprocess(surface, trim, w, h, rotate, angle) - trimmed_w = w - 2 * trim - trimmed_h = h - 2 * trim if trim > 0 || rotate - tmp = Cairo::ImageSurface.new(trimmed_w, trimmed_h) + tmp = Cairo::ImageSurface.new(w, h) cc = Cairo::Context.new(tmp) if rotate - cc.translate trimmed_w * 0.5, trimmed_h * 0.5 - cc.rotate angle - cc.translate trimmed_h * -0.5, trimmed_w * -0.5 - end + cc.translate w * 0.5, h * 0.5 + cc.rotate angle + cc.translate h * -0.5, w * -0.5 + end cc.set_source(surface, -1 * trim, -1 * trim) cc.paint surface = tmp diff --git a/samples/saves/_saves.rb b/samples/saves/_saves.rb index 6e4a2e3..82b3d8e 100644 --- a/samples/saves/_saves.rb +++ b/samples/saves/_saves.rb @@ -2,7 +2,6 @@ require_relative '../../lib/squib' # This sample demonstrates how to use the various save methods - Squib::Deck.new(width: 825, height: 1125, cards: 16) do background color: :gray rect x: 38, y: 38, width: 750, height: 1050, @@ -61,14 +60,3 @@ Squib::Deck.new(width: 100, height: 100, cards: 3) do # Buggy behavior was to revert to 1 row and not respect the rows arg. save_sheet prefix: 'save_sheet_bug332_', rows: 2, columns: 4 end - -# Allow rotating -Squib::Deck.new(width: 100, height: 50, cards: 8) do - background color: :white - rect x: 10, y: 10, width: 80, height: 30 - rect x: 5, y: 5, width: 90, height: 40, stroke_width: 5, stroke_color: :blue - text y: 2, str: 0..7, font: 'Open Sans Bold 8', align: :center, width: 100 - save_sheet prefix: 'save_sheet_rotated_', rows: 2, columns: 3, rotate: true - save_sheet prefix: 'save_sheet_rotated_trimmed_', rows: 2, columns: 3, rotate: true, trim: 5 - save_sheet prefix: 'save_sheet_rotated_trimmed_rtl_', rows: 2, columns: 3, rotate: true, trim: 5, rtl: true -end diff --git a/samples/saves/save_sheet_custom_rotate_00_expected.png b/samples/saves/save_sheet_custom_rotate_00_expected.png new file mode 100644 index 0000000000000000000000000000000000000000..2291d029460ebd9189b7750a89ac42d26b3d7a80 GIT binary patch literal 2575 zcmcJR`#Td18^=e8#gjvb_LwnG2q|)!a>$fJNygBeW05v03cy=*6QN! z&fV=EQNi6w;AI@&T_V1AXRH7_zpAA5;avbgtkcHI0uf!fT;!8WYnHY)n{F;Iz1M-0 zbOD`j53!Gt{0>sD;PMlIf^QRssSz&Ab0?9)rPb#MP^w2E8-0+xG4phf?so1@^G?xu zqoQd=QGhqI12bk;Pc05fr6FC%uzx>9leAJ7#XJzBnY8W$zu>XP(L0+>SGSnl@b>kn zPknMD!H6|r6fC(m&{W>iHB&1!D4{*QOuYfP7f_3Fd0wXI!?XNmTGgJe9q?{@`yPXe zah3g7?7xz~Yw~zlgE>eN|Et}Eex2(hT?_XO+ef1D4a@Q*H2}#9k?Sq;gPw%24jrT4 zm3oZLZ9z~@Wt!<|CdmTtzK-~l(t5Pj;$R*F-~$b)-LK5TpK-@6#2mFD-SMk{S5|3? zmVxTL1hr1d|HT6$g>5o6(_HqVES-fbtNdXxIRJat-lG#lCC~3@`>O-m%i5p~tNj@7CdswqSn+l?9X}@)` za;N;PaEkxxthW^k33{$(%A7y>&??iexowgBWEa*N)w|J<@NhI|3RsXLNI`+hD8xN*-GS`vtN_PKHlk%N7IdAhu)^$)TKB|-a_v%<$rR&f%Qp|?vhIWWB@06vQAfB$&a~Ze(N7%x`#<>$!GkD_s_-;7YT<^ zUda$5w$wjFrx$!bhg*1Sm4YQZw3)U~UC-in*h_=CiKj!x^`p2N`V!G^bI2LO-oSIF z-P$~5BJ3-O4SuZ<3lQM-B-syr3l!;o(+S6Vua>mS;Ae%-FPNmJ3u_a<>nAx9eeg-0LsNNO)=k|Ju>$na-aNNZV z4aDz-&Gt&wxbwa{!ZQON(LuX#l1=-JpZ?xGH|pbcp2D6(HBPjixO1djSBrLdvR(bulMKwPpG0Mhed#ZBrt*ga$4Q;m zOOa7U!n=QpNsS?VOJp5;0x7@jhH#iKt4l$gthn%tHKgYD=Ji*g&V_n!@=O^yEy$CD zSueZl4beKA3ul=7bdTN_ax-M29n)&VN@H$r3r)zay^D(*a7P$c14sP+53H>j7F19^ z7D<=%4!LKxSy7gijz8h$k2IJE?L~dJ+cuJ)+UvNF0-vy5&s?v6ctYx^(>(xBddOKt z>IS&U>$w^fDKNx>LL6_Up@UyS7%F)lM8t+4U}HH7W-YRg&Or^k?jOrBPlzV5L2~*O z!CkKyD|=w1vyT9yj**3WW!JGB>7uI1+3{;)i8SCvq~2<D`CnH>~E+ zz=SRo!3H3fBQT4rFb3d<;$wcW;vE$g@~paW84im}mIKaj8nz11mcv3b`l}#z*3;OB zA%XBcGTnL`Dfr=|pGIxy{oa>5!-Tpo<*9rni)%PXf@QuWag@j_K%g@A|eS#!?C&@O%-F7w5+g9evp zW9PxP1&27~(vwq$nK$BQa4av|mKCr)A3ebpJGX0BW@z}r)|_bkI#6;je$L#zd$G;dR=BS!;2L@;JL8AjNdt|h$5?$HU?36Q~C_Q)^zUm@9v&O7(PP#GV z*l{Dw0q-f#P-kg?WY%V+6R9esafJ@;T%l_Ny10)&giHM+i$bPPY~{qy(!z6$-1Q$N zM_|GZUDV-=w$GlyZNwZR8k4WZR7EvSPuKG>wpVL+Y>XR{&|kuGE)j09IR?;7l2C`q z-#ntkt1)l9Q!d!?DcEwNq5Q7b&&3-{{*ho67R0|<$x?`PE!He)GbAX|sExDgx-*kZ z&$BB=nmUlHIgRY(8iX->Cj@;W(fWW zfYSQfW$b)pMqjpd`B8zCFzixT7{eTb3$|p;n-t!f^f1|2zU#wXF>rmby?NaIt9#9` ze>figiUz_-zyH YC^Cw@ZOEwGO?Uts_<5@uOYg-00Qb=3PXGV_ literal 0 HcmV?d00001 diff --git a/samples/saves/save_sheet_custom_rotate_01_expected.png b/samples/saves/save_sheet_custom_rotate_01_expected.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2ee312c2c8bd8733249435addf2b84548f99b7 GIT binary patch literal 1404 zcmeAS@N?(olHy`uVBq!ia0vp^(}4H{2OE&&YL!R@Qfx`y?k)`fL2$v|<&zm0SPea0 z978JRyuF)Pw#Y!D_2KC`k-drhmt9TH6mgu^oauVQc0!)|=jLrqTca-eGv0qb=S(JR zw$k+vrbb&&Sf(eMbuH3(ceg$JN9lXMgt>L~H5>1K%k`W$@0Zz@X@xp>H6nbAkI(Zd z(TK>FIDV;6tA(?PRhWfatxo>-kLTxW&i%c;_RBA;xBIdsk57`}y>@xB$e~=TA}@~1 z{3oK0ZB%h@{`&Al)!?C9=rZq?bHJT*X?)a*GE~_o_w8gU?Np3X`F&_b)843{w zjvEr15)QH)Y=YWBfkfdodDh6;7C)+#Pu^XvteqmVrsTo4pR(Iltth*1p&ozzQ{1QT zuPkDYc}cotm6-*&qQi!g*gVs>0McsZQd=XclGH( zuihl#D@P80zLIC}Y3S+osq62V2Ya8~?%rJx8>s0LdeHlx_LaEvd3~SX?uiZCbKEOc zGGs2-)qi(YLIbr{t%wkn3b!s6TpFP{W$CF+meoD|c~u*N7BA`&x4#+sXGQ5V2|Z7* zAg->^g`09h%rdvx&Yj$O&}-Gdw)|~79i{KRQ57#)v8`*;s!f;nK5x;Rvto5n0N2u0 zi-H1OO??vY&k|W9^8f48OC8g>=Q?fAKK$#X_NwZeE6%R1nSI}RoA6|j_kR^F&g*9t zuf9{&y4dyVJCn$eiI<-!{)~-%uG1SG`~9}c(}U}7T7R#cy+r4E@ofI$eShzq_qKel z_xyW(`)!p}^NOCo$8E3eUs!z1P^x*#?sd|Cmgqgd_WauSzqjsx_byi4eL=QH?wsWD z+`e6VJ&nVB9$!!YeW|XRt1`1ZdQsWtNxyGAD+_j>H04o@-LBJ~`{u{))?4vaz0O!> zj@oH8+dr9~wDMp6P(Ht7vfIPVB$?dL`{dsK*FU$xr0i?@0l#aBU0w@AG)_yG=FQ9d z6t__NOhNVJxv!poOzdJ83r|0MwWxHt+4fgW)`9J|-=>%vMm$b8Ir?h$UzMegy@m4L zKUnhj$=ONMS6g3={od^K-_Vz9TJh|Q-|JVexH9F{>J?w^{klKrS8B_}y~}N$_xKBo8s`l)Bes_RZF)XW zLvzW#+VH09Uq4T2kLmmFwEt{zHUF1wYU1zTdao{ypMGxpr{AtuukT$}mYF73eQs7w zX>)nd?C8)`<)sBl`Rd|vSFW}@UtT}?-n}R#8+Y+ov&X8Xv1`??bs2i)=Rf|+^8Cr4 z&3`suHlI03Wovm=VR@{?{emL1qyDiqw$m+jQj>+JUOtL=QX^d$Sb z%mdAj>R%q9N`^wuo9BKlR&WiB`1*L+HKRVu)oF*X zyWh<`{oU`SAO*p%TicgL151GxU?~8}+CSE8oHy^?jqXmqua&xwBX%YE&VRL&?Wk8+ jzNIJ=u&|>A2>&F1BGjY9b;Ya?Amcq<{an^LB{Ts5$MAU> literal 0 HcmV?d00001 diff --git a/samples/saves/save_sheet_unrotated_00_expected.png b/samples/saves/save_sheet_unrotated_00_expected.png new file mode 100644 index 0000000000000000000000000000000000000000..eba7a4b9223f5ed8b1accf93cfc2a348e2e86ebd GIT binary patch literal 2039 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 GS^ojd#vFS9 literal 0 HcmV?d00001