From 9a6543c530909c6de8ab78f9cefa842f642cd577 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Mon, 13 Oct 2025 09:57:59 +0200 Subject: [PATCH] fix overlays --- dist/text_texture_generator_v1.0.0.zip | Bin 9670043 -> 9670961 bytes dist/text_texture_generator_v1.0.0_free.zip | Bin 9653474 -> 9654392 bytes src/__pycache__/__init__.cpython-311.pyc | Bin 12909 -> 12909 bytes src/core/__pycache__/__init__.cpython-311.pyc | Bin 1710 -> 1662 bytes .../generation_engine.cpython-311.pyc | Bin 11229 -> 16781 bytes .../text_processor.cpython-311.pyc | Bin 13811 -> 11791 bytes src/core/generation_engine.py | 89 ++++++++ .../__pycache__/preset_ops.cpython-311.pyc | Bin 39383 -> 38174 bytes .../property_groups.cpython-311.pyc | Bin 26293 -> 24756 bytes src/ui/__pycache__/panels.cpython-311.pyc | Bin 57223 -> 54709 bytes .../__pycache__/constants.cpython-311.pyc | Bin 7193 -> 7193 bytes .../conftest.cpython-311-pytest-8.3.5.pyc | Bin 11869 -> 11879 bytes ...ration_engine.cpython-311-pytest-8.3.5.pyc | Bin 51487 -> 76856 bytes tests/unit/core/test_generation_engine.py | 207 +++++++++++++++++- 14 files changed, 289 insertions(+), 7 deletions(-) diff --git a/dist/text_texture_generator_v1.0.0.zip b/dist/text_texture_generator_v1.0.0.zip index fe99ed33b79d9874508ba7d87b958c4f9b7006cf..b9ae28e8a9b7603aad4451897dfca33c38e26203 100644 GIT binary patch delta 14779 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 Xhc?i^5{y=n#=j~kTS-eD3X<=CK25~v diff --git a/dist/text_texture_generator_v1.0.0_free.zip b/dist/text_texture_generator_v1.0.0_free.zip index 6684b8830aa7851bc79c4c57a263d088af83bb48..697a51976446fc77743d41f5c17c134f022bcf18 100644 GIT binary patch delta 14736 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 delta 14128 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 diff --git a/src/__pycache__/__init__.cpython-311.pyc b/src/__pycache__/__init__.cpython-311.pyc index 88a8c9200a90c90e93314c9b3fb22783e4e84bc4..ba30c5dc76c2398b4a5c571ba1d47e050f6d2a7c 100644 GIT binary patch delta 20 acmaEx@-~HgIWI340}$+5_hut^k`Vw;LkArI delta 20 acmaEx@-~HgIWI340}zxgc)gK3$p`>V4hG5q diff --git a/src/core/__pycache__/__init__.cpython-311.pyc b/src/core/__pycache__/__init__.cpython-311.pyc index d5188a487d76b44d40dc72b4310e70cbe9c3c0d5..b46f538facb3f50f43fbeeeaeb9545b168477cbf 100644 GIT binary patch delta 218 zcmZ3-`;UirIWI340}!Z*zsZ<9kyny&*+li(T#O9q3@Mz87^5UNUNB)|||rsm-U>COdl9%OGrp@1MPqj4eTIT%mZ{n R3nw2ZLm#&c^K3>LW&oC;F4_P9 delta 264 zcmeyzvyPW{IWI340}!-*c%E@)BCjOls)_2e`En(rBpDgf8B#bGF-A#kJY&Kn$$3kx zpeR2%wYWGww=}0DGbb}IHNGUZqGU27^BzXw$@`e2IEti!Ci!VfPnKpm%2Xsh`7VnZ zmkLmb5r~V^C-btttmk56`oKUhLQ0w&Xd8@ZU~ga-ZeTCw0lKDzlaHZ~TZVZyqYN_u D(Gx#N diff --git a/src/core/__pycache__/generation_engine.cpython-311.pyc b/src/core/__pycache__/generation_engine.cpython-311.pyc index 83fd243d04ae37a1b01937d3304b8d777c38f5ed..010d8e5cbbb50163c2ed87a1beb3e3572254e429 100644 GIT binary patch literal 16781 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 delta 4345 zcmb6cU2Id=`P_SbZD0S!PU6Ig9Xrmi<2Z2~Ncg8I-Dnx2B($SYXc~M?2q71G<1P@L zLn^h>9!e*sGpUoNO5Ub1A*xjq+v}$8WiRVmLZS2)s+B!#Onu1INt3pR?)$ENV>?NK zUCYb|3Z)5VDgW2bt%pnj;PAg~%AH7u}ROUsgX{Q5Z#gn4yyaHCQp=I-7 zPHm4u3XK*{h^oASHry6PC8~>G^!2$^_ae}kQZkq-8>GrwgVTh$z<|dxQ1tSEy`CS~ z?dO+mvg9iI5ci{#jbskm>U_ZRKZg27GG+C;$57u$2Gl*&b=j^rLgehl04{ZjQ0El^ zq6Xj6!`!gKpoOWPSrOsOg1#4G*<;ZOp{`mz)mxI(-C*6N%HdT}=D93rT|lh~N{P*z z>|P9CpWanSu4)j~TS!$fPz+g^>f^`kU4AdnHrV5%%rw=Q>D~|d^cRLK;`&WJMUJy$ z5CB%k0eA>Mka6DdVKPkec=&+B9p93*ANAXmc61!M0jh7}F*Y zt>w~h_(5-sr`!!QVOFojU@0$D+=KHVi-AT>Z5_dc$1cV+XX$rAuzZ?vuP(7p&|EDk zvjZU?xR32!XWx*3?HwX%@oK(pfumz*>TKE_$JS6PFerJ_pOQwGDP!ueL0LSJn;M z-4EBYIv;(Eumlxp0!eDfG|)qPSZ~dJpw+w&q^-h)`#=la2U0`HM;r>jG8@A@6dp4b z5AWu_|0fkYzd03stg9v!0`05Xe+ru2Uz$5KMSD+*m{OX2H*y6IvTNpHhLM0Y_0kSn zS2a&CWxbDebeW-qS>9`<%}jUirT4V=t+FMA*V_Y2Sh$`I3b&v3*UY~Db+a!G64j;M zudbba1CNep)$E(W*@qppzP8hBU`;^NH31drKove%Q(V!Fi%U*gX@FUiqJxkI@V-$R zGy#gsSscKW$#B^{J;+~^LP6#%Oj#8RN0zfVgaYOz^yPp*nt@Rc*P7>ueN>&+%R`Iq%$&9;fXPmU#RI#dFwe(^Vxhhta8 z2VVpIz*WJJX0*ap(GUkRhLD>_>3Ez=p>h6;-Vq_g@AhtreT5NufOngupyPGka6SF( z#4|^qJ@DMv{s#gdOs0c>Lm5I=c2AdpBTw*?Nfz+|rsMTi$5WwfUdKN&dWe6W91uSw ze6Vkm6R)#LQBUyMzLy@UcjK#xx21{=c#+caRd$XT|8uHe*uwvtY7HBbmR~TW zgU{^O@lTfybCl>%G=%Tzf8Ak7b5rN_!1WLMTLibEeCvEJf37fdR^wl$d+mnp%*=d& zhX=Y}FywPO#L7?#`cy7|Vk$RlC?;hxe?FJoitMxJ<_&paMlGB&?5FZG)29lCb7pRO zQk$B~8}1Wl@|v30CxKGE4*t`D?+d$ma_~(d!GAk=SQzKt%ofQIF7SPsZ!1S(o%369 zvF~S6{G*J|VTR8L@k}HX(cc0NZfbrXZ0I#|$L3rS-Li9~`GUl=L$5ey2e#kDa*st?!Sh@bY?U#k6H^z3I$dW%u-|3l(k`Gd2n1E~?2|x#IS`!ak(WD6xLZKDM@D+T07jS7u0x8nJnB4T zla_bOK)Gp?fpSxkrlL#argyCOxe@a5W|aMSB=CHTWu$Z`0KTmx zzdJ16&Z6Y);nd-F`I9yg;7{TL!tGBs0P^Wb@@QN%Vkl(9Q!o1D&)g{VnO8vAHx>ls zZu_?55pu6p7zgBDB=wR@`rLt1pDO~wu01IAMbvd-Q2L^0=ZQY)ey0HN{Vp3s>wce% z@Sucn)|Jaj_jjanY3Z+NIhW<{?0V3IInnWos$=r>7vYt3=*RdwySHQ)Eb_bqpm^yi zWwdTOujTcrLVog`p8wuVenI~chy=Ogi9e420M+o7v>T4eN%d@Qa#F{?nTG$>!pxcZ zf!tYbzA&W~=5;*%%(5`muR@O?0bA}r&K+}S)mP8tcj-Uov9WFSdu>9?3aNTeIQc7M NO|BKvCN!9O{{y@^CPx4O diff --git a/src/core/__pycache__/text_processor.cpython-311.pyc b/src/core/__pycache__/text_processor.cpython-311.pyc index ebb152840f14ee5dacc1f8e58af38363676ee4d1..33f4cfc21ce9663fdc5305a1d840cd2929de62a6 100644 GIT binary patch delta 1829 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 K1=4$_Ui~ky721UW diff --git a/src/properties/__pycache__/property_groups.cpython-311.pyc b/src/properties/__pycache__/property_groups.cpython-311.pyc index 7d9d7c95d312ab6f1d31e32836aded70ed0ff70d..9419f736c59de6d79eceb46a0e1fc0cb2c86d403 100644 GIT binary patch delta 3345 zcma);c~n$Y9LML*un5eINTQ%3o3g05uYiaeDzb=xJ1E(A!WPR=TC{qU9V@dUUxk&G z`NxPS#Ota)FB?GuV~5KP0QR^l~c>til5!X8fQu-)qtPClL0s+`;=szXu&!>jc1s}Cd({7D@g~|<2e>#rqxP6Z$K|#Lm)Tm z=Sk_JM*SlxT`^b2Cds?-5;n7^X5eKyH+R(*gY#i4`eGZlTXL^RE(SZW6EmSp#Q z?-gukiqX#d<){ngKD%l314B2?Lia;!-I2O+&ix}f9EFc@00(_hUI(310zVR;NWy_n zaY#)`j91Sjmnu$tfiIb>ub8W&zOPL?Myu3v;uwyTJ3;QG1^10%{S>~%JPZG)B@u%& z_>Rk%gR{QxVcN=nFbw^ObC!mFl0+1K#(ADd+kC&6!v58;ase0plg&(R)XyVxxn4Hn z`U`(!X0w2eA}Dt9rt^#69c>zX4x@wzX5;T%D?UQ<@eaa~lup4rj5;taMNLbLQx~Rn zi*AolZAyz*oP=X3UF!9i;x_70U1e3#{N6Pvs(8M4!`Z-|sP}%e@OA(9zDOoP>bUrv zNa^8kSL1N22tGSG+%pL8#rGr>qm1|749V2r{GKd%ecmaQRIWriAS8F*s-vL-;;apM=7P zVL=1K`930eRofenBO@gl!{Vn@`E(Tk}Z&$%73el3sNnl z+IY$Yy&`z;$mK+-r)TJDN|9BDg0@{ElY(4L=KB=AA$TvQ*eN#u{H9vWuS9C<6;etm z3z@_6ARp73rwLR9>RUJ8K?0`-&8CuU6{>hO{V`jc5g(<;ptt|5wgoo+qVeM#%G{8_ z%?k=n-w|pkwf`g6^L0J43#x2cbv!9ryH^*@u3o^4TANj@UdS38-cV0OOU_;rCRS?A zIa?iKgH|wPg-_0_4L@5h~xVA6RJ`$U!2lT7Hkk=g{Bl{go{h6w`dj3bTMVs|?-QwT; NBfp0jZ|Fn+{{S?y0VDtb delta 4622 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 delta 5725 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 OlbM%Vyg5$%zZd{poE10# delta 42 wcmaDJb2o-}IWI340}%AQf1Z)Nk=I(BOVPJ9rzA5cGcR@WUQx--rQ)B&06t9*H2?qr diff --git a/tests/unit/core/__pycache__/test_generation_engine.cpython-311-pytest-8.3.5.pyc b/tests/unit/core/__pycache__/test_generation_engine.cpython-311-pytest-8.3.5.pyc index 9d7f549ea23b7428c743d02cf6f216f763461de7..9d9ba3f8389830ccccb81512f5e26da50182ba99 100644 GIT binary patch literal 76856 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 CF}HaD delta 4545 zcmb`K4^WiH6~J%rjyvwS@BRbF-SJN)@PR_`Kr{*>RubT3Lx&D>;k##m#glWBtEK#J8~46)PHiI|y^Xskmswfpu^5IN7x z^ag(4+xNY1_wDZ6-M6Q&$d4YBY2V^FwS@jkPuy%ab-u0jYshKXuUQN?$MtYolL4Cl z7=Yt4i4+RCLZX1JoI|E`Dc~3_so*j#saYp$L zaMW<9Vl#Rzk<2OOO@f>XA=zfPS6D(Np#-rMQHofGC_{V)u>$cdq5@F`y+(_o2F2Cz z3u8fY9TnHpf6oCTk@QObsfpiLwZE!&#h5~3v;^Z!ZxXUj{8T|QV8FaUK^@hFEHIQ~ z2^Ph_qA)&3zvN|MKf=wyMcWBd2R{3+$P!3PULE&5wzUzl75vG4#1~9S@x{}wd+EvO^vOs z4UNKPPk+4N69ZZ@cg_@N(6S4$3(<}6BLc7{=L~r>sGF;aOPlT`HRzWL7(xs@EG}By z(@TrxA=zrTt6v_TxO_BVVDrdENj{}(laqo~J+6~jkreSG#2&<}h<%9th#xX<4xspB zxL4Fe-VgRHOjI?^?0PKPF&I#K31LE@w>Kmby`)?yreZ${yNjle^AEmR_H4vSNVZ{s zh764!k6Z9Iw6%L1a8BGVUMKhB%uDsk7$cNKIMF(Z*dg*vLXSSCHQU0hM%!GiMkBGS(XcZ*|Q@%La_NJQWt!= z@lzRG99K!x6sH=MWR4U9*LgUzISI61>EOtk1aN$n0w1mEB#H3$hD=y?*aAPOEh{p2 z5^6GN!nNy(N_)4liMW!*bPF*{ zT`4fMW+{w5r-RhmB>FUx6iBa4go{^naI`Q{bXv#)F7;>fF1n@oO*F33p)zZwjyXV` z(9?gT-*B*5fWYTTpu1g=JFClD>-KolcF+iKq0yb@b$5ExS{r@s+r7EM^q_@v&GFLT zN^tVcFxspmzk~7Sr>fW%&Zdj)<81J8+}R8~ZuwE08!`%>j7v+3dD7*C&#umQs{Ofa z^V`(Ez0Irkrr`~p}%V%3KU`$DMFnDLJ_@14lLiNU#P`R}bKCb`MY?J-Q!P@4%|N!Tb{qBUX>b`5Xr zsUg%E))$5^u~)Ydle(FtyLa!-q@JdWURzJNo&Q&L-@3M*C+I8dR8$W=-88ZSdZ$d* zr?1M1IjOHQE6+qOo5>OkSgh&ZoyIQXiPU9zM5bweZpVUO&lw;50hY9R(O9a(O zX7LlQRpAd<`#HpWi1QSl1hzf{BkQCmNbrl15YzGw4eBuY5RSpd8}mwk zN=3Rqu|ZggYA1pX$CHeNbz-|xixoB!`EaybLdJ=#B%F~n>}>Hi^LjcQC%>KrdqxwZ zp7(g7hDM#zzmZ_p&Go8<->Sn2*r|zLzkB=XJnXgbXT+0qGWmWdq5A8rh*O*{pXkps zPt=#pJF7@cu=7r?ss_7KJvBL>^p;BHU5e`Vv{e<(aFT@%N6oSReJ?knpZ0uSE%>mO zBE%v@lvsRYFWEpG?_4K|a-tXiD<`@2yYaK1AdVn@iFga~8^lS(9}({(1`rn!gB1M| zArIwwi2D23K?ToctKPsU`KW-<))6L_z8lGp2iouqqbrhr=hn z*vt`~zL%=YL&{Zxdq<0Vr*K@{%aI&w^Ifg`#4eOOsI;inRRKh7u8E+xKw_y&|5 z8=%U5^TgH1F*&4NXuJ!7JLJTz2c?4uJdcIf5pRh9(vlaYE2XCd9r?BTk)2G;wvwC_ z4BZ<#v}f^rm`dfLm{mf1ho@Hfx#+QySv~JiC9j%t0b& z5@IrhFJlo=DHR)d^4+IUrineJa);pcGvb+cZo1A5y!I02c?O`FeZ6` df*K{s9+S+>FPZ-K)VIxA@m>x|5Os42|370@O~e2I diff --git a/tests/unit/core/test_generation_engine.py b/tests/unit/core/test_generation_engine.py index f659467..501beab 100644 --- a/tests/unit/core/test_generation_engine.py +++ b/tests/unit/core/test_generation_engine.py @@ -94,6 +94,7 @@ def create_mock_props(**kwargs): props = MagicMock() # Set default values + props.image_overlays = kwargs.get('image_overlays', []) props.text = kwargs.get('text', '') props.prepend_text = kwargs.get('prepend_text', '') props.append_text = kwargs.get('append_text', '') @@ -417,12 +418,204 @@ class TestGenerateTextureImage: # Call function result, normal_map = generate_texture_image(props, 256, 512) - - # Assertions - assert result is not None - # Verify multiple draw.text calls for vertical layout - assert mock_draw.text.call_count >= 3 # One per text part - + + def test_applies_absolute_overlay_to_texture(self, tmp_path): + """Image overlays should be composited onto the generated texture.""" + Image = pytest.importorskip("PIL.Image") + with patch('src.core.generation_engine.bpy') as mock_bpy: + width = height = 64 + overlay_path = tmp_path / "overlay.png" + # Create a solid red overlay image + overlay_source = Image.new("RGBA", (16, 16), (255, 0, 0, 255)) + overlay_source.save(overlay_path) + + mock_blender_image = MagicMock() + mock_blender_image.pixels = [0.0] * (width * height * 4) + mock_bpy.data.images.new.return_value = mock_blender_image + mock_bpy.data.images.__contains__.return_value = False + + props = create_mock_props( + text="", + background_transparent=False, + background_color=(1.0, 1.0, 1.0, 1.0) + ) + + overlay = MagicMock() + overlay.enabled = True + overlay.image_path = str(overlay_path) + overlay.positioning_mode = 'ABSOLUTE' + overlay.x_position = 0.5 + overlay.y_position = 0.5 + overlay.scale = 1.0 + overlay.rotation = 0.0 + overlay.z_index = 0 + overlay.text_spacing = 0.0 + overlay.image_spacing = 0.0 + props.image_overlays = [overlay] + + result, normal_map = generate_texture_image(props, width, height) + + assert result is mock_blender_image + assert normal_map is None + + center_index = ((height // 2) * width + (width // 2)) * 4 + center_pixel = mock_blender_image.pixels[center_index:center_index + 4] + # Center pixel should now be red from the overlay + assert center_pixel[0] == pytest.approx(1.0, rel=1e-3) + assert center_pixel[1] == pytest.approx(0.0, abs=1e-3) + assert center_pixel[2] == pytest.approx(0.0, abs=1e-3) + assert center_pixel[3] == pytest.approx(1.0, rel=1e-3) + + def test_skips_overlays_without_valid_path(self, tmp_path): + """Overlays without a valid image path should be ignored.""" + pytest.importorskip("PIL.Image") + with patch('PIL.Image.open') as mock_image_open, \ + patch('src.core.generation_engine.bpy') as mock_bpy: + width = height = 32 + + mock_blender_image = MagicMock() + mock_blender_image.pixels = [0.0] * (width * height * 4) + mock_bpy.data.images.new.return_value = mock_blender_image + mock_bpy.data.images.__contains__.return_value = False + + props = create_mock_props( + text="", + background_transparent=True + ) + + overlay = MagicMock() + overlay.enabled = True + overlay.image_path = "" + overlay.positioning_mode = 'ABSOLUTE' + overlay.x_position = 0.5 + overlay.y_position = 0.5 + overlay.scale = 1.0 + overlay.rotation = 0.0 + overlay.z_index = 0 + overlay.text_spacing = 0.0 + overlay.image_spacing = 0.0 + props.image_overlays = [overlay] + + result, normal_map = generate_texture_image(props, width, height) + + assert result is mock_blender_image + assert normal_map is None + mock_image_open.assert_not_called() + + def test_append_overlay_positions_to_right(self, tmp_path): + """Append overlays should be positioned to the right side with spacing applied.""" + Image = pytest.importorskip("PIL.Image") + with patch('src.core.generation_engine.bpy') as mock_bpy: + width = height = 64 + overlay_path = tmp_path / "append.png" + overlay_source = Image.new("RGBA", (10, 10), (0, 255, 0, 255)) + overlay_source.save(overlay_path) + + mock_blender_image = MagicMock() + mock_blender_image.pixels = [0.0] * (width * height * 4) + mock_bpy.data.images.new.return_value = mock_blender_image + mock_bpy.data.images.__contains__.return_value = False + + props = create_mock_props( + text="", + background_transparent=False, + background_color=(1.0, 1.0, 1.0, 1.0) + ) + + overlay = MagicMock() + overlay.enabled = True + overlay.image_path = str(overlay_path) + overlay.positioning_mode = 'APPEND' + overlay.text_spacing = 10.0 # push further right + overlay.image_spacing = 0.0 + overlay.scale = 1.0 + overlay.rotation = 0.0 + overlay.z_index = 0 + overlay.x_position = 0.5 + overlay.y_position = 0.5 + props.image_overlays = [overlay] + + result, normal_map = generate_texture_image(props, width, height) + + assert result is mock_blender_image + assert normal_map is None + + spacing_ratio = overlay.text_spacing / 100.0 + center_x = (width * 0.5) + (spacing_ratio * width) + (overlay_source.width / 2.0) + expected_x = int(round(center_x - overlay_source.width / 2.0)) + expected_y = int(round((height * overlay.y_position) - (overlay_source.height / 2.0))) + expected_y = max(0, min(height - overlay_source.height, expected_y)) + + sample_row = expected_y + overlay_source.height // 2 + green_columns = [] + for x in range(width): + idx = (sample_row * width + x) * 4 + pixel = mock_blender_image.pixels[idx:idx + 4] + if pixel and pixel[1] >= 0.95 and pixel[0] <= 0.1 and pixel[2] <= 0.1: + green_columns.append(x) + + assert green_columns, "Append overlay pixels not found" + assert max(green_columns) >= expected_x + overlay_source.width - 2 + assert min(green_columns) >= expected_x - 1 + assert max(green_columns) > width // 2 # should be on right half + + def test_prepend_overlay_positions_to_left(self, tmp_path): + """Prepend overlays should be positioned to the left side with spacing applied.""" + Image = pytest.importorskip("PIL.Image") + with patch('src.core.generation_engine.bpy') as mock_bpy: + width = height = 64 + overlay_path = tmp_path / "prepend.png" + overlay_source = Image.new("RGBA", (10, 10), (0, 0, 255, 255)) + overlay_source.save(overlay_path) + + mock_blender_image = MagicMock() + mock_blender_image.pixels = [0.0] * (width * height * 4) + mock_bpy.data.images.new.return_value = mock_blender_image + mock_bpy.data.images.__contains__.return_value = False + + props = create_mock_props( + text="", + background_transparent=False, + background_color=(1.0, 1.0, 1.0, 1.0) + ) + + overlay = MagicMock() + overlay.enabled = True + overlay.image_path = str(overlay_path) + overlay.positioning_mode = 'PREPEND' + overlay.text_spacing = 10.0 # push further left + overlay.image_spacing = 0.0 + overlay.scale = 1.0 + overlay.rotation = 0.0 + overlay.z_index = 0 + overlay.x_position = 0.5 + overlay.y_position = 0.5 + props.image_overlays = [overlay] + + result, normal_map = generate_texture_image(props, width, height) + + assert result is mock_blender_image + assert normal_map is None + + spacing_ratio = overlay.text_spacing / 100.0 + center_x = (width * 0.5) - (spacing_ratio * width) - (overlay_source.width / 2.0) + expected_x = int(round(center_x - overlay_source.width / 2.0)) + expected_y = int(round((height * overlay.y_position) - (overlay_source.height / 2.0))) + expected_y = max(0, min(height - overlay_source.height, expected_y)) + + sample_row = expected_y + overlay_source.height // 2 + blue_columns = [] + for x in range(width): + idx = (sample_row * width + x) * 4 + pixel = mock_blender_image.pixels[idx:idx + 4] + if pixel and pixel[2] >= 0.95 and pixel[0] <= 0.1 and pixel[1] <= 0.1: + blue_columns.append(x) + + assert blue_columns, "Prepend overlay pixels not found" + assert min(blue_columns) <= expected_x + 1 + assert max(blue_columns) <= expected_x + overlay_source.width + assert max(blue_columns) < width // 2 # should remain on left half + def test_text_fitting_enabled(self): """Test text fitting integration.""" with patch('PIL.Image') as mock_pil_image_module, \ @@ -696,4 +889,4 @@ class TestGeneratePreview: result = generate_preview(props, preview_width=128, preview_height=128) # Should handle error gracefully - assert result is None \ No newline at end of file + assert result is None