Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SVG displays incorrect and has padding (left/right) #1282

Open
ofedytskiy opened this issue May 26, 2019 · 1 comment
Open

SVG displays incorrect and has padding (left/right) #1282

ofedytskiy opened this issue May 26, 2019 · 1 comment

Comments

@ofedytskiy
Copy link

Description

Try to render SVG file like this:
Code:

<ContentPage.Content>
        <forms:SvgCachedImage  HorizontalOptions="FillAndExpand" VerticalOptions="Center" Source="resource://RESO.SVG.bar_bottom.svg"/>
    </ContentPage.Content>

SVG file:

<svg width="375" height="40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
 <!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com -->
 <title>Combined Shape</title>
 <desc>Created with Sketch.</desc>
 <defs>
  <path id="path-1" d="m375,120c0,-16.56854 -13.43146,-30 -30,-30l-315,0c-16.56854,0 -30,13.43146 -30,30l0,-33l375,0l0,33z"/>
 </defs>
 <g>
  <title>background</title>
  <rect fill="none" id="canvas_background" height="402" width="582" y="-1" x="-1"/>
 </g>
 <g>
  <title>Layer 1</title>
  <image stroke="null" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzoAAABFCAYAAACCLZM9AAAACXBIWXMAABJ0AAASdAHeZh94AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAESRJREFUeNrs3ely1MgShuFaJXXb3Nfc/4XMALZbUqmW84NKkRZtDgPGC/M+ERWS2jZBe4aI/iKzsuxff/01m+ua+QNYa/X7aYdn/XUAAADgj9Da/lHe9md7eH7379E5V0MIW4xxDSFsfaUYY4oxrkHe7LWM8N7+e/bgIoHm+FyttU2WfI/6Pv5FAAAA4E8IOLa1JuHGttZsa8316/6aun4ThN7R5397CHP7+w3qTb07KqToEFOttdU5V+X+ied2CD77nwcAAAC8w5Czf+CXVWt1PeQ4fd+frX7WPycB4i1XfvTfU/195eqCeYeVm2uhxjlXvrP2oOOcKyroyFX+XAlQ/EsBAADAewk4x6uVECPhpl99rdX15dV69Kx/ToeHN/jW3SGYGfO1omPfS9B5FG5UeCnOueK9z3o55/S1OOey/Iy19lHw0VWdY+ABAAAA3knQ2dvVpHXrEHL2MFNK8bXWUGsNpZSgXyulyHoUhFpr/kqoeO33ba9UoUy/2jfduqZDiASbHmY2733y3m8hhM17n/t1v5ew0wNP8d5nXf3RVZ0rLWz8iwEAAMB7CjrHD/5SudEhx/VQcww5oZQSc85yjf21QZ7V97v2hXvtHGGttb3qdK3y1K5VdPYvvvJf3PQqTNJBJoSQZKKC3McY99CjA8+VCs+xja3+QNBh3w4AAADeGnsIOrqi4w6ta49CzpXqTSylhJxz7GvoKx6v8r211qHWGmutrxnwXH/P0mYn4ctaa7+p6Dx1/1LhpvUwIiFlHxH3aFRcCKvc96+tKvzosKMDj7SwfTfoUNUBAADAe/FENedqRedKwNEVnD3kbNs29Oso123b9mvOecw5bz30xFJK6GHqRT9A98/tetLao7a6N7FHRwKODjc92KwxxnUYhkVfY4zLMAyrfL2Hn/QjlR21t+dqyGGfDgAAAN5Z0Dnuz/lmj84TQUcHHB10Rr1SSuO2bZNc+2uTCkKDCjzhhQPPte40K0HnLQSczXu/qSrNMgyDrPna/SH4rOqgoHQt6KjBBEVXc/SYafPt5DXa1gAAAPBW2cPENasnrh0HEciAgf9XzTmEHAk2p3Vdp5TSKaWkr5OEoF7piaWU2Ke3vWrl4NWCjgScHkpWHWbGcZR1kWd1laCjA8/ezvZE69px8tq1trVH5+hQ0QEAAMBbp8+56ZUcow4Ilb06/jtVndDDiYScb4KODjbrup5SSud1XU99nXsI0sFnzDnLHh7/WmfxvHjQcc4155xUXtZhGBYJNer6ME3Tpd/L64/Cjmpfk6rOo9a1H6jkHIcQPGpXI+gAAADgnQUdY9R+lWNl53B2jj+EnSHnHA9BZ0opjT3kSJjZA86yLOd1Xc/9/qbf79/XA0/sgcf9sUFHt6n1Ksx8CDayLnI/juNFAo+u7Kjqz6qHExza1b45NFRVcOox4NCqBgAAgHdOKjqPAs+VNjZ3DDw556CmrQ3btg2HtjWp6EiYuVmWZQ84y7Lc6LV+cT5UeF60ne1Fgk4fACB7cBYJMNM03fdQc386nR7kud9L0HmQqs4h5CyHiWvHCWvlO5WbdmhTo2UNAAAA79axhe0QfPaJZFfGT++HiMpZOsehBNK6ptvVroWbeZ5vpUCxLMttjHGVqk9Kaco5j33/zotUd35r0Oln4WTvfYoxrtKKdjqd7nu4+Wap8LNXeFTQWfQAAnW2zjcT1WTIgPnaknas1lC9AQAAwB/hO1swvjk+5trgAr2HRw8q0JPXdNvaMehIyFmW5XYcx3me51l9bk+9ypO3bZteqroTfuMvu8mo6GEYZgkuPdDcyTqfz3fqtUeVnUPImdWEtXSs3hynpxFkAAAAgEefiR+dF9mLElLpMcYYK2fv6MCzbVvMOUvYmVJK52VZTiro3MpWlHmeL8MwXPpn90X208tk5GVZsuzfKaXE3xl2fkvQcc5VXcVR1Zu78/ks4eazur9TQede79EZx3Gv4sgvyHtfesCpBBsAAADgl4LQPpTLe1+99zaEkGutW611HYYh5JzncRyHXt15mKbptCzLw7quN/M8P0zTdDvP8+WpPfXyWd57n/rAsJJSmkopw+9qZXv2oOOcK4cqzn0PNJ/VVa9j0HmQqWvyy9EBR6o3hBsAAADg9wWfHnpMCCHHGF3OWSYmDymleRzHeV3XyziOl3me58O++vlw5mVS511mFXZqznkopTx7LnnWP9B7n0MIUsV56BWcz+fz+fPNzY1cP10LOufz+U5VcmZVxdHDBQg3AAAAwMuFHmOtLd776pwrrbWcc059ivKiqjePzryUgoWq6CRVvNgk6Djn6rqu1Rgz1lrDc7ayPUvQ6aOjs0xUO51O94eA8+nm5mZfOvgcWtYu/ZclVZzinKuG6g0AAADwqqFHjmkZhqHUWksIQaYqr4eAs6izLtc+Jfla0MnOuWytLdbaum3b9Jz7dn456MjQgRjjoqs4Nzc3n3uw+ahDTg86n25ubh6FHNmPE0JIMcbcA07l/ykAAADgbYWeHlJK3zufe0takuCjl2pZk5CzHwujJiZXa21LKbVSyvAcYeeXgk4POUlCzrWAc3t7+/Hm5ubj7e2tvLa3rck46V7mWmOMGy1qAAAAwPsJPMMwVO99kbBzWNvh9WPrmqxqra3GmLZtWyuljLXWXwo7Px10JOQMw7D0gQMScHS4+ef29vZjf5aKzt6y1vfjyMGfWd4c/88AAAAA70b13jc501JXeA5XqeToIWM65FTTW+RSSsZ82bfz02Hnp4LOlZDzSSo2Pdj8o0OODjqqkvPQ+/c2730h4AAAAADvVrPWlhhj7dPaijr3cjtcr1Zz5ExMGXWdUjKttfFn29j+ddA57MnZQ44OOB8+fPjn9vb2bx10pK2tV3IuvWePKg4AAADwBwUe51wZhmGv7vRVrgScIoMIzNfhY80YY+QA09aa/dk9O/866DjnNr0nR4ecDx8+/C3XHnb+6dUc3a42901JxTBsAAAAAPjjwo61tvX9981aW3uwuVbJaX1/vpGrMcbKaq3ZlJL9mWls/yroeO9zjHFVgwekXU3Czd9XQs7HXsmRoQPJOUerGgAAAPCHBx7vfR7HUfbvVDVhrfZgU1XA2Ss5EnJaa65fbSkl/pag45wrchjo6XS669PVPupqziHo6JBz10PORqsaAAAA8N8JO72VbT+HRy/zpfrzTfRordlaq6u1StBxxhhbSvnh/PJD3+icqyrk7BPWetuabln7R1dz+hjpuz5ZjZADAAAA/AfDTh9U0NTAgaZDTmtNlm2tuVqr7SHHtdZ8rdX3e1drdc8SdA4T1vRZOXq62qOAI1PWpF1NhRwAAAAA/0HW2hpC2Mz1wQPGfGlX28OMBBy9Wms25zz9yNjp/xt0+oS1dZqmh9PpdKfPy1Gtax/1nhwZIU3IAQAAAKDDTowxG2MW/bKEHGlXk2BTSvG11lBKCf1eQtDwS0GnH/aTxnG8qENBPx8Cjj4rRyas3RFyAAAAAFyhw84+cOAYcvoKKuiEUkpQbWzhp4KOalmbe8j5XjVHDgTdBw8QcgAAAAA8FXZCCNkYM8tUtUPI2YNNzjnknGMpJfagE2qtPufszXf2/4cnQk49tKzt1Zzz+fypDyL4qELPp/P5fKfa1TIhBwAAAMBT+p6dPI7j3IOOVy1rEnRiznkopQw55yirT1+zan/PDwWdpqaszWpvzrGicww5xxHSAAAAAPDdsBNjzK215Uo1R4LNkHOO27bJ/ZBzHmqtrp+t034o6Djnqvd+6y1rUs25FnI+95Dz+XQ63U3TNA/DkBghDQAAAOBfhp3UhxH43pYWVAVnUGvctm3ctm2otfpt25r5Mszg+0HHWludcznGuPRqzr2u5qhhBJ/kjJzT6XQ/TdMlxrg65wohBwAAAMC/0JxztW+bcT3oRGlb27ZN1phSkqAzSjWn1hr7uTxPBp3mnCshhKSqOftIabVHZ1+9kvMQY1xDCIQcAAAAAD8Vdrz3pYcdr/fn9LAzbts29aAzpZSmnHNsrZmcc2utuSeDTp+ylodhWKdpmqdpepim6U723xwDjlRyhmFY+3g49uUAAAAA+OmwE0LItdZlmqbQ9+UMKaUxpTSpdUopnXr7mrXWmlJKbK1ZowovQYecEMI6DMM8juOD7M9Re3TuesC5O5/P99M0yYS1xPABAAAAAL+q79fZaq3zNE1B2tSkipNSOq3relrX9bRt21hrddZau21brbU+2pYjQUcGECz9cNCHvj/nXsKN2qtzP03T/TRNc4wxee8ZPgAAAADgWfT9Ots4jsu2bQ99b860ruskIUeCTs7ZGWOcMcbknI35MpigGWNMkGpOjHEfJ62rOSrs3Pd2tX34QD/kh2oOAAAAgOey55Npmi4SdHrL2nld1/O6rudt26acczDGePnBWmuQwQTBWlu896m3rEk1R4edb0LOMAxLjJHzcgAAAAA8O2ttCyHkGOMyTdOlV3RO0zSdT6fTeV3Xc9+nE1pr3hhjWms25zz2vTomXKvm9EBz39vXHlTQuQzDMIcQEqOkAQAAAPwmMoVtP9+z78+5X9f1vCzLTW9fC621YIwxtVbXr8Faa0KMcZEBBGoIwcPpdNKh56F/fZ+ydm1WNQAAAAA8k9qrOus4jjIw7SydZz3oDK210FqztVZvjLHbto2tNReutaw9seZhGJYQwuacYwABAAAAgN+qn/O5DcOwTNN0WddV55NzDzq+teZqrV7a1kopMUzT9E3I0dWd/nwZhmGOMSYGEAAAAAB4IS2EUGKMSU+I7tdLP0sn1Fr3oNNas9baGnSg6ftwHnr4uUzTdBnH8TKO47GaAwAAAAC/nXOuqKNw9m60PpBgqLVGqejUWm1rzTnnaniimnNRS0JO8t5nQ8saAAAAgJfTQgglhJB02OlrrLXGWqsrpfhaq2uteWttDXp0tJSAJOBIyJEzc9ibAwAAAOClWWurTIvuMwZkTRJ0euva16Cjx0hLv5vsyen7cpYYY/LeM2kNAAAAwGsEHb1XR4edSe/R6Ve3V3RU69pFpaN5GIZlGIbkvc/ee6o5AAAAAF5Dc87pqs7aCzMSdLyavuYeta7pvTn9h6RljWoOAAAAgFfV29dKCGHrYWcZx3HurWt7NafWug8juNfVnP4Di7SshRA2qjkAAAAAXlmTCWwxxrWvpZQySMCRio5zrgS1L2fWlZwecpL3niEEAAAAAF6dc64dqjprrXVRQce21uwedKZpehiG4XIl6GzOuULbGgAAAIDXptvXQggpxriWUmI/P8caY74eGNorOvM4jksPOY/25tC2BgAAAOCtUEMJthhjqrWufay0rujUIOfmXBtA0Ks5BB0AAAAAb0FzzlXZqxNCSKWUcGhd+zJ1TY2RXnXLWh9CQNsaAAAAgLcWdor3PocQtlrr1lrztVZnjHGttS9T13rIWY4hR6o5BB0AAAAAb4W1tnnva99ms/Ww42qt3hjjW2veOWdCP2wnHSo52Xtf+rQ1AAAAAHgrmrVW2tdKrTWHEHytNbfWttZakKCTYowpxngMOdK2RkUHAAAAwJthrW19KEGptZbWWmmtZWOMN8Yk51wLfVrB1qs5RYcc2tYAAAAAvMGgY3peqd770lorvaLjjDHOOWdCDzh7FadPMWjee0IOAAAAgDentWastcZ7b9qX6QPFe59lzLS1tgVpVeurOucaLWsAAAAA3jJrrXHOybjpvbJjjCmlFBP6eTlZV3N6KYjfHgAAAIA3GXLUas652lrTYceGPpqtShqSvTn2C36LAAAAAN6q1oNOq7Xu9+bLWTuuXQk5/MoAAAAAvFmSW2Q554xz7uuzDjdqeoFh4hoAAACAN+xRjlEByBhj7P8GADUnAcJ7yovdAAAAAElFTkSuQmCC" id="svg_2" height="72.000002" width="372.500003" y="-17.500002" x="1.499982"/>
  <g fill-rule="evenodd" fill="none" id="Page-1">
   <g id="First-screen">
    <g id="Combined-Shape">
     <use id="svg_1" x="0" y="-87" xlink:href="#path-1" fill-rule="evenodd" fill="#850705"/>
    </g>
   </g>
  </g>
 </g>
</svg>

Expected Behavior

  1. SVG is rendered correctly (with shade)
  2. SVG fills the screen with without 1-2 pixel padding

Actual Behavior

  1. SVG shade is moved (shade is not a filter but included png file, you may look into SVG code)
  2. SVG fills the screen with 1-2 pixels padding

Basic Information

  • Version with issue: 2.4.11.982
  • Last known good version: Don't know
  • Platform: Android (iOS not checked)

Screenshots

How it is displayed (take a look at the image 1-2 pixels padding left and right and shades are in incorrect position)
svg_issue

How the SVG should look like
svg_ok

Reproduction Link / Code

@daniel-luberda
Copy link
Member

Hi @ofedytskiy

At first look, it's probably because currently height="72.000002" width="372.50000 is ignored when image element is used.

case "image":
{
var image = ReadImage(e);
if (image.Bytes != null)
{
using (var bitmap = SKBitmap.Decode(image.Bytes))
{
if (bitmap != null)
{
canvas.DrawBitmap(bitmap, image.Rect);
}
}
}
}

private SKMatrix ReadTransform(string raw, SKPoint xy = default)
{
var t = SKMatrix.MakeIdentity();
if (xy != default && (string.IsNullOrWhiteSpace(raw) || !raw.Contains("translate")))
{
var m = SKMatrix.MakeTranslation(xy.X, xy.Y);
SKMatrix.Concat(ref t, t, m);
}
if (string.IsNullOrWhiteSpace(raw))
{
return t;
}
var calls = raw.Trim().Split(new[] { ')' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var c in calls)
{
var args = c.Split(new[] { '(', ',', ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
var nt = SKMatrix.MakeIdentity();
switch (args[0])
{
case "matrix":
if (args.Length == 7)
{
nt.Values = new float[]
{
ReadNumber(args[1]), ReadNumber(args[3]), ReadNumber(args[5]),
ReadNumber(args[2]), ReadNumber(args[4]), ReadNumber(args[6]),
0, 0, 1
};
}
else
{
LogOrThrow($"Matrices are expected to have 6 elements, this one has {args.Length - 1}");
}
break;
case "translate":
if (args.Length >= 3)
{
nt = SKMatrix.MakeTranslation(ReadNumber(args[1]) + xy.X, ReadNumber(args[2]) + xy.Y);
}
else if (args.Length >= 2)
{
nt = SKMatrix.MakeTranslation(ReadNumber(args[1]) + xy.X, xy.Y);
}
break;
case "scale":
if (args.Length >= 3)
{
nt = SKMatrix.MakeScale(ReadNumber(args[1]), ReadNumber(args[2]));
}
else if (args.Length >= 2)
{
var sx = ReadNumber(args[1]);
nt = SKMatrix.MakeScale(sx, sx);
}
break;
case "rotate":
var a = ReadNumber(args[1]);
if (args.Length >= 4)
{
var x = ReadNumber(args[2]);
var y = ReadNumber(args[3]);
var t1 = SKMatrix.MakeTranslation(x, y);
var t2 = SKMatrix.MakeRotationDegrees(a);
var t3 = SKMatrix.MakeTranslation(-x, -y);
SKMatrix.Concat(ref nt, ref t1, ref t2);
SKMatrix.Concat(ref nt, ref nt, ref t3);
}
else
{
nt = SKMatrix.MakeRotationDegrees(a);
}
break;
default:
LogOrThrow($"Can't transform {args[0]}");
break;
}
SKMatrix.Concat(ref t, ref t, ref nt);
}
return t;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants