From 598e3077f38b69a485ade24cfa6554a761d87217 Mon Sep 17 00:00:00 2001 From: FManga Date: Mon, 16 Oct 2023 01:14:39 +0100 Subject: [PATCH] Completed png parser plugin --- plugins/parsepng/parsepng.cpp | 40 ++++++++++++---------------------- plugins/parsepng/parsepng.drt | Bin 98856 -> 98928 bytes plugins/test/test.cpp | 9 ++------ plugins/test/test.drt | Bin 19528 -> 19008 bytes 4 files changed, 16 insertions(+), 33 deletions(-) diff --git a/plugins/parsepng/parsepng.cpp b/plugins/parsepng/parsepng.cpp index b44ee72..b7c0bc0 100644 --- a/plugins/parsepng/parsepng.cpp +++ b/plugins/parsepng/parsepng.cpp @@ -1,9 +1,11 @@ +#include "API.hpp" +#include #include #include #include #include -bool loadPNGImage(const char* name) { +SurfaceId loadPNGImage(const char* name) { png_image image; /* The control structure used by libpng */ /* Initialize the 'png_image' structure. */ memset(&image, 0, (sizeof image)); @@ -16,9 +18,11 @@ bool loadPNGImage(const char* name) { * textual message in the 'png_image' structure: */ fprintf(stderr, "pngtopng: error: %s\n", image.message); - return false; + return SurfaceId(0); } + uint32_t width{image.width}, height{image.height}; + /* Set the format in which to read the PNG file; this code chooses a * simple sRGB format with a non-associated alpha channel, adequate to * store most images. @@ -59,29 +63,20 @@ bool loadPNGImage(const char* name) { * * to find the maximum size of the colormap in bytes. */ - if (png_image_finish_read(&image, NULL/*background*/, buffer.data(), 0/*row_stride*/, NULL/*colormap*/) != 0) + if (!png_image_finish_read(&image, NULL/*background*/, buffer.data(), 0/*row_stride*/, NULL/*colormap*/)) { - return true; - // /* Now write the image out to the second argument. In the write - // * call 'convert_to_8bit' allows 16-bit data to be squashed down to - // * 8 bits; this isn't necessary here because the original read was - // * to the 8-bit format. - // */ - // if (png_image_write_to_file(&image, argv[2], 0/*convert_to_8bit*/, - // buffer, 0/*row_stride*/, NULL/*colormap*/) != 0) - // { - // /* The image has been written successfully. */ - // exit(0); - // } - } else { /* Calling png_image_free is optional unless the simplified API was * not run to completion. In this case, if there wasn't enough * memory for 'buffer', we didn't complete the read, so we must * free the image: */ png_image_free(&image); - return false; + return SurfaceId(0); } + + auto surface = createSurface(width, height); + Surface_write(surface, 0, 0, width, height, (Color*)buffer.data()); + return surface; } @@ -90,14 +85,7 @@ int main(int argc, const char* argv[]) { printf("parseobj error: expected 2 arguments, got %d.\n", argc); return 1; } - std::string answer = fmt("{} {} ", argv[1], getpid()); - - bool ok = loadPNGImage(argv[0]); - if (!ok) { - system((answer + "0 \"Could not open file\"").c_str()); - return 1; - } - - system((answer + "1").c_str()); + auto ok = loadPNGImage(argv[0]); + message("{} {:#x} {:#x}", argv[1], getpid(), ok); return 0; } diff --git a/plugins/parsepng/parsepng.drt b/plugins/parsepng/parsepng.drt index bcc965b4d6e485e2fa051d6a4c83533c8c737fe0..181cf9a2b0151b9b8a4cba5c2afaa3e6484e6876 100755 GIT binary patch delta 4990 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 delta 5060 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 diff --git a/plugins/test/test.cpp b/plugins/test/test.cpp index eb91d7c..353e0ce 100644 --- a/plugins/test/test.cpp +++ b/plugins/test/test.cpp @@ -8,13 +8,8 @@ using namespace std::literals; -bool loadPNGImage(const char* name) { - return message("parsepng {} {}", name, getpid()) != 0; -} - int main(int argc, const char* argv[]) { - auto jpgparsejob = message("parsejpg {} {}", "test.jpg", getpid()); - log("Loading png image: {}", loadPNGImage("test.png")); + auto jpgparsejob = message("parsepng {} {}", "test.png", getpid()); auto tex = createSurface(256, 256); Surface_fill(tex, 32, 128, 255, 255); @@ -101,7 +96,7 @@ int main(int argc, const char* argv[]) { } t += 0.001f; - Node_setPosition(node, x, sinf(t) * 5, z); + Node_setPosition(node, x, sinf(t) * 2, z); if (int(obj)) { Node_rotate(obj, 0.001f, 1, 0, 0); diff --git a/plugins/test/test.drt b/plugins/test/test.drt index ef392354d98836fa9d4ae03cc60eb9e994c57c66..7c4f0b81315d468074abcef720f4a8ede9a6826a 100755 GIT binary patch delta 5326 zcma)Adw3L8mOoWp{UGGg2{Cq(B35^kq?1mXB(xA?kUXH1PLseVk3lA@Ju~W*yPyFy z>#PhN5OsWv6LJ~1ljbQp1~MyXj1!fxQFKKewA*n<@QJHS{9Ff1+_kD7)wSnVKy<$O zV>;ij?!D)pI?sF0y_FMTW^yMJTI|1eWw6r_$9`cnk44LPKP0qAvzF0 zLfnc7A?`=e-v|C_+=%_A4gkRbzy+*h;5I}Jey$zPz`t83CViBb&QpFE<6NdwjP&1% z!DupO0#}c;IX`6FRD@a??)`?ZCRv8Z+I+P)ead6KOs3?tA1~SB< z7JJM9mU*3`AqdXapkd?g7Q=hhc93q>*0*Fh9D$#U*Nd!Yfb|r_>fj2$O=P7TRdD6R zW(VFcX58E!1>A4r0+EP+l`KUn=rDP zwrByiOA*#FV_>mZTs+jmo;IMU(ljG6ign^5k9ExSnkIj#Stpb+Gh~8gfjMXd3xMQE zlQT>{$4WEOL}6B5w+TJVDlr7vSPsg0OSJ$ieW-eDOn;8cd>R}AFb6?8qy8|GOVZPk z6oAIE7gMwhtukz(sbiw7lvb={!eGC4mkQNv)P;ICt8Ils@QEN-ZThehYEjF>DFJ>S zOiystiP$`hq&$_tmXHNHZb@q;;yfq%bcqU7El0t0`&hjU%j-pUQSN{Qg{*o16=H51sS7`UO}ZR-qwRrP1|LXRqsE zGn(*^TIr!#V24WZ3>WOY{I{BXx8^~Ld$4NAi}RnQJ;Pc^eo>>$y=bo{Z%TW^<84{} z-eHicQhoMQ0Y5IQVlmwIZlKR`g{V0NJCN}vWU1(SWyg1Lo@n#8q&*4mx|O zM7Ks&myURbZ95B5`4WvP_KZ-~Pf*qJcGMiAR#VmUQT36wOkMR?$zz>Pd^xkc_4U@{ z--jK%BMsmfw(iXRS4}>zRzMT3;hI`j+MTpI=xpimtbx3p=$-0>o-55K&BrNBCr!sK zPCHl}ml4;ncO)M<{-iqK@le3|hVvx~n*h>}lQtA$=x3$gDm*h z)nl={V^1I#_jR$z4TRfvb?mw@GT~^bvliT<0K0sSp__fq$dNVyJYq$}HN*|lep#e+ z$TV0j4!7+H7={E083t{2RKdf6-?UG+Eat3OoY|id4!1qD)Fe1@)}lY1Vm)pNa9YTH zx^ee*nELy%M%;sYyD$k(ju?n30&Yvxh7r9vWpkQ_4E-xwkJ~uHI1PKvIBOmvEpU3~ zCx*xiEfBjqbf)HzX8;@v!80;X!6>$dxRgHtuLyhsv9#qm~Oylm+B3((rXG`P3EKn-KrNE z>6cn�cS*ni!>o#&2Py+cj|fD3HtZ;_860e_xw1l5;SJfv-TNGlWddWf@J5S7o&_glgsy^`_-Ed9I)Qg@o+L7GU_23Q{K z8DVNNxO1aWmUdJxt@M|Q#_&9TzzB~Fx22tP#0tML439*Nb^N}za$W8fSpGAyHiVwW ziufX8DGnARUdR3ih(;Xz5wR0#cOt$*+B$3%Y#2Q4h31B<6SYyD8 zpyyjA^36x|;TVtL=7rc_j=fH78&N;pmUnjpz`mxO^pMeC{# z(!#`6wLf*18{*-4TyV@BzVJZH6{nU3Fy^Ouu+qJspERP-zCtXUN%DFoA9^rub9T47 z3psLpYSGe9rfQMtz9g;Z@5OENXN3Q2$}Qe1nn>eF0|6|CR}-w}8#iE1ewtvgAb9<_ zDwFi=H4SR=s-zuDpeFw$DWHVs;`&G5+jX^cF_&c0!ZLW3p!A zVpxOiPY}Cs?pAE?Kx}R%9odz6Yw#XH?-Dm6p30$@DROUix8-`g=1lqqTFDpLo7v?G z5p!3F`uQZ^d=?o3EFZcm_RSy z8Kk}>U}UTlAk9jEi-|EdR zT+`%tkYd24Y?(Jn_F5OR&$W_|tee?~(xf}r#tx)MdvgaEHr6_tG0VZQ=URy;zax87 z+&aMoY+_H_r0@2Q(R=eP26m}J`Y-P$?-UNO)+7;&?hUchyYXdyj%TGm#k+7tWTfrb zKN(-@XQg8a+J80Pf%LRW`!B}Zk^Zz!e;iwkk(Ca|n|&r;K<-2F zt9XugVej!cqf>sHVE7sw@4z-K^cmS@(nElP|aSI_GQI^7JaVMzg7gK zyVR{dm}`wOdH|*r9_LSCXjthJ#m;N8O`SaYobQNFnMm1d^uYb6;`f>PCgg}JOf_GR zVkdQhuPM}r=i@W|Mt%B4g$mVVIW=wGzr~4Xc9(EZ{6N6S?`gR$`Y7t!g6^4g-M@(M z!EtY#?3(SZJC0r&`>89d$sjM`HbEf`jN82vUE>j3wvi7H!#i2A9 z6oR{_)}yTK_&PL&l`_85VT_ANXX6h{f%L9&Ge(P*%u33BzfqGH;#P{NM!fH?O|0>6 z^D$CFV{}KpP*(f5`j#W*YmFQ$DJo#4KPzVbD$GMU?zpHz!*x<2=Sl?3#|w()IG*+G zWwV+H#_5|Pi~EBQ7y9Yj&ueDP6iwbi42_|m_8wENLJRjR^ZjO?@(gQqJg68V4BzLo z@q@@Spse*B&njvfEi&_6zC!miA9{3o1K-Kpit@JlaLI=46bka^sE)fL&+Qrq9#A`9bZ71 ziS&n)U*NfSD#yR*(>Ds5B>W)g%Xw`P$rLj4Zd`(eXYrK_EC=rKY>zt@eYTiX3ftM0 zadJdx&txS0+QaRo$(AJH>|3fB>DOsZE={rcrATv)L6Wv3i-7IzSXOMQ3X%DbdVFCt zL7uep_`)st^%qEPLuN+$8M4+R>k5p9CV!jUiV+*bcu<;OBj4JenZrt}lvbZD$l}Rf z{QeRjlpA)T%s(>HUsTGd$<73M(^19_x07!jyZC=e_u;01*pjKVzzy~pLDFyuHDP+z zr^%Df#u7%lPSxbE6O8nfMol)MuH`6-n%tBgwam$9@@H#y934xYv%7-#8|ln=iqw>L zU;uXDj-Wf^RfXJJ+ESp&k16cXJm9Vw!ee#8RIP|BQ6V3dHsaJ>N+T{BGrtD4&sFJ` z+^CS6GDnRj-=LJ?6sLPSORdGJ)e0LCgH=Ip;YiE>#1{KNm_6Gra*dkoSID+9FZ+3l zjF$d1q5KDO%8%~imykj$-j@B`@9lwQ>baqmgLdPdAjLFlL1MK@M@wvA&jI{&(E)U_!w{#X{ z0E7Q$(ByS^VqMh50oOhYz{N!~fEDa`sc1tvuXsq>eeL|mD*;X-jBbEhL?0^u9I<@b z^bY-hAksSB^fPGs-~xOfkL{|uj7zNKrK-w0>g++hm|Y@YbYl zsjf7=g0GARNLTf0_DetcUG*_+MsN1~nW4jLYMu?zfPu4T%+$$&1>8YZepzef4KcR} zZiqUAJt+Gq%BCNv7RZGn=7My;#v zY+fVHA>P+tMkB|OeM2en&3o1~O(v{&fZg0N`iQre%`@YjEeny0pg*lCl**KB0j2a@`=sHeGrU7jSrYVOPE?gR)ToOhC(mIC5xxr4mXa`^H)Hr=!a*58KB zb=dUYB;57OD#YlH)=`$#w9&=B%|_o!bXysl^eIOzNB8)8+MYujH)Q^hMjfR;yw&Lo UR>Ba`-=)P%ngiExFQR|{4+s$W!2kdN delta 5803 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