From 6760653d628b9cdabce5f56c53db00eba6aaa90e Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 1 Jan 2023 18:54:05 +0100 Subject: [PATCH] Demos: Remove "Fire" application This served no purpose other than looking somewhat neat. --- Base/res/apps/Fire.af | 4 - Base/res/icons/16x16/app-fire.png | Bin 594 -> 0 bytes Base/res/icons/32x32/app-fire.png | Bin 7758 -> 0 bytes Userland/Demos/CMakeLists.txt | 1 - Userland/Demos/Fire/CMakeLists.txt | 11 -- Userland/Demos/Fire/Fire.cpp | 228 ----------------------------- 6 files changed, 244 deletions(-) delete mode 100644 Base/res/apps/Fire.af delete mode 100644 Base/res/icons/16x16/app-fire.png delete mode 100644 Base/res/icons/32x32/app-fire.png delete mode 100644 Userland/Demos/Fire/CMakeLists.txt delete mode 100644 Userland/Demos/Fire/Fire.cpp diff --git a/Base/res/apps/Fire.af b/Base/res/apps/Fire.af deleted file mode 100644 index 37d90edd2e..0000000000 --- a/Base/res/apps/Fire.af +++ /dev/null @@ -1,4 +0,0 @@ -[App] -Name=Fire -Executable=/bin/Fire -Category=Demos diff --git a/Base/res/icons/16x16/app-fire.png b/Base/res/icons/16x16/app-fire.png deleted file mode 100644 index 20ab485eaa2da390278229bdecbffcff0e180e88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 594 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7BevDDT6R$#Zvn+1_lQ95>H=O_9v`NOzH-A3La%JFfd4#xJHyX=jZ08=9Mrw z7o{eaq^2m8XO?6rxO@5rgg5euGcYjj@^o zwiVkfHEXNE1^dMp3^o|(q#ByMcHBJc>w`m$hqon2n+Jxj3<{Ha`{vAxzY@8Zx9R3v zYTv8)$7#^{=|02X?uWIjerjgK@qJsA^Val5t^dPix!$+8)$CvUz4*?S+{!-z+1ua8 zeUCe)<^0(oXxZiXo;S~;Uh@b|dHluQQU8=(VA%4`O|vuA0{w)a-u$h)>d5IfqiWVK zE5!7rPaS(OA@f?ie!(1#xexyFwCh$ZV^LUOf9Z|z)4YbuOz!R03EM^g>3V(soE$As zGc(a-hOFK9f|D1PSM@WWNq-R(nz(A4(}h1ju85tVz$3Pv*?E*2VDXY6u zXLsDYAmpNcZ6eQ8*3*s^51M0d7Uh4KeYbs<_VKN4N4#!+JQrcsDbOOB=q6`1W$p{1 zS!EAGIh#D#R%+$Vn|Duqr|_k(!b|g%^wppEEeVkfEf)+ZS4zBl#A@lp#A1dA6*B7; u9+$-1>htqBzny>ncXqu5-;VQtn55({n;+kk;mW|kz~JfX=d#Wzp$Py$c>2u% diff --git a/Base/res/icons/32x32/app-fire.png b/Base/res/icons/32x32/app-fire.png deleted file mode 100644 index 979d1ad5a30c20e619387e9dc4319b3d39758e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7758 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM^y;UI*B|(Yh3I#>^X_+~x z3MG{VsS2qTnQ06R6}Q&Ti0o6@$m{aIluO?6cae;)$OGvgKk9rmS1+$lOJFV&UsV(w zq@*mdsc}``(M=#QaAo^^sG5cAk2E=I_&g`~gmO-+9gVu^ZR-)$e(KssH!&1(i;JPM=Av zOZ!*0|5WPLeudZN??cbtE86qgQ20{K+^X2ha}pLDl@)QPYq;(osjRf?^*23Z+*orn zlYRcnS)UJViY+-^x_z$A@t11eJ#jV@D&8;WKfjmD<*dK!+13^E+iMwDi)x+leZYI? z>-?=d((irqF^^4s^i<-d>@ktj{4dY{fBd<6;ohmA&fWagDf;@8m(#R`Ctm6=W;pV8 zy8BDc55Ir@T)u-%z{h`vHeZ=_U+2U-Pp5s-uyJ5#Q|nW|9us+;K{4swk)#*~#@VqR zde+f<^v?+%=dzP^zS{nRU0}zQKS@*V+9ohAubMl%ysP@yuP5hoO}G_;PAp{LJ;@TL zmGfcw5w7+sF3n|AinLZPn^whV`D{wDUgXjB(*u$`Ri_7KWiGuQknC%EJ!tjHwcnma zJIDl|Uc2R1)a$vP*3+!>%h|rz{ozpVGx?;kxXbd2MSRFlMc6G~>$kd>MX~9Pv47xsN?&dFxKT&)5 z?2#Y#51++9>2do0-{G7_NxkE{@;m<;ZUya}Z8n2l(bt)G74H&x<|SqEyT!Ktuejqm z;}ZYoJ1%0(-4fo%ZWSxc%$;TtGx4eUEVIepM&VC*#e`L+?{F60ulfD%L$1PTwZ5~j zuU_3`6!*?xm;C9UW))JWKVR5)UhI6^ms!<9+S$(;Pt+c}G-qbwPL~R=`~$4~r*>@9 z+~#oi&nv$-T_-m(ybdclzw+9X`2J_ld+p^9Dm)cjx^dN9fe8woqCWzI#a|{zI>$J% zzvuNWFlVn&$aCJLrmC8$*BCk7;8xR0)0bQK?O(F)Kr~CjH@_aUl*MfoM-$iXGu~x9 zM`ga(hQB-2AGrq?aBYz=oH8%V(rnv%^<`;iUb?FURcbd!Og_Kl(J|3H(H&EdyZqc_ za`oy;p#vqCr-{VO%8u-;-LPn1vZG?q{jv({)W@qgJPUd@V~^dbM{zQTAAXjrTs^C* zS87AMi(ldG<%u1U>kGG6d6>Q4@Yix{y}cIa-wkyf`3ui6?DJ*H^gOfs`W?BZBX^%) z>RBafk|sZOiuxzM>5KTcPBhtCk`x%6X_y*$r8)DC)TXW*JV!4#oyc|+Kcm3R`e6C} zlvQ7NqRt>^ee4rC|xn<>_+aX5O|>?~|`{>Jj=)8>CP zjO(7X`NfPqy=QEn^W@HxSR0`zb>!wkIhi!cM8RFQB7b$4+|1h~8qbodH=(q|@Px1nH?c`c?ZedAV|j5Ad7tKPwe?=MZ*3os8Z(3D_YIe8!s66| zj2UK6nHCo|$+yWXvqXND)@;jPe`dN?s(rSZ7v!Z}>75p8`d~-=iCL{*T`#&URnZGI zv~b?OYf8tB8V*C2s;-afX4PIt^R*dL1S9OtT2!A`?YemSU;YuU;3CuhsZz~ncAcAi zan*#yKV#lVFf*;@;Q6(F<2B=4zI{FpvI|YF>D=TfbUYirFgbd1Q`0*83+Fx>bapuF z)O7CkVPV?0OI_H^v)+bza-dJZqgP)KJr8*(Udk-hzp$!@VZq+&4{Da|%Z0sFBq!EC zaQa{E>>)kT)Z9s=we{%@Ii{uSUNW~PXUiQtaiLIu;VRY{4Ppy7<}xgExgB(Mit*gl zjy0j}0g3{_H^3xmb{5oH(JzQ zAoasx^UE_=>g~$A;p@QhJZ9hZuRkK?~-|hqxA3wG`?plKG@-jMkJx5kKjiM9e&v9vk=Vk% zV5zS+;+kDgIfZ_o**A+j?`2%5NM}xW^R^rvp@u`#HgVoQ&apRp_o>v4hWaZ`B|H&j zQ(pYMP-X7TLvO#%oM_AZwr}U*o9mZGp31e_GO?5Q!@P@=W(TxB^6i^?d)aPV;fZZ4 z*KVCt>2^zvY2v%;-h177pKtYS>CQ3F@2FlWId|TziAGy*E#01~xBW7oc$OS2yzvT3qA`Kab|#l~n`zYE4K|1Pw~zHYZn(TLT#vTw4U zsDerKz2~Lk+CQHaFFC(@%hu;w{vtg_m1}|~Gp+CUpCF}MZW^D!P*nfWol)%V@y26r zZ+GS`kyV*lIkzzQbZK3iWX(diMN!w^Mx8uT<2#}GM`iAW<^OIoe|fxs`M|XRH~o|9 zx4#zdX70CJ@>uQeojuz+l%+dAe|z)B$}cfH=f3|p_t&>#16=C!ByOu5%v<^*bOqOO zm-G)i=4^T+U>Ez=)$R7T&24j3=cz9Fmf03;p%#3B^WI96hvz(+PnJw?$PT+@s68$A zyzTj4-`BNWJ7_zxFZ923;XNLcs4p!q`y_9P*nVn$|8mFu2`|hA*2?%^nj5HUB)=4r|t%oB7_*-P^0bvod{a^zuIcb*y)TuL!G~ z9K5TuP`)Soj)UTcuR6yrv$cKL*7;=r72|t8XO*|VTj761FLU12xM{Z@<=$Q|8Pop~T-4{J#oqpxpH{SQ^{#T!utT-ZOJ?*$O^VIs=iG2kxJ>+YDRy;M_aQa7q z`-!Ih&&RfgKeFC!u;t^al)^1LRqwa%)bHY*AK$fA{~l{`@Z~)7(~cVHvro0kulXiw zsq)`lKRPcUL#;%+O10$Hn%Yml|E*s0ruVO}&HK#1ekqIRmOq(gUg>k@r`t5&#e0$D$ zx7?RiMz_!2-}Umm^)Ig5H!-E&bJ&%FBnM4u<^%hc3$mt~xIx+9uc1i4OWEZ~q9j4BP%QOU5sb;$n3FV!N= zCt3{?lNnVrCdAtRkpJ`U+9|)DYR`ij7ydo6kU#8@Aig40=K1d%g<0wi|0Q=^lKvMY zI^&ReN8>*{t`@znFc=;lA#LozK38-9P@4 zdBT!)kIWAoR5X~h_{~?b_wO>^y}fVz^&L|zf!N9=Zof#5Q65;D(m7Jfe zmza{Dl&V*eTfhJUHue<-iOJciB??KY>6v-9O7C~?S5nAKu~iB;^)>J2bec`(EilL#HoS&;-kyxN_sAr&`n~S2OxWu&#VINi<#UYgisro^w#rdU0$*Hbo zsd**J$d(r5lolh~Sz4S55(2wBCnZh4A{SyavL1I&-vGECP%x%v<`#f;fK(%^Oi6~T zD=00>0jo(#)=$kz%}vcKDb_dCGeq%FNoE=%f>8Vek^u(+vhfwU1#t6GRKvmxtQZ`w zRxbI;r65Z^U2K&=?zKwEPtHuS0yB-xl8w#G%uIFDj8iOiO$?0^b(2z(Omz(m49wHa zlFcklOp=j|^2{qPNz6-51sPS5TcDSjnPQb}VPs}vW?`b6l4z8qYhr3(pqpfxYNDHF zmSS#cX=IveVql77gnv`R!keP-CdPYWInUrKJxBQ~q#1dPj%-qEE zRQ-aybg%>{TCDtwGE?(P5H1)%;ifni zm6YcfW&0QTCuOB3m*6)Cn_{?0L8XxDc>POojx1abj6&3OH&MU{c8$iFxU%DYi<`tOgU$#FC8743kXE%u`cz z4K32lbxlkyEOafC(oA)eQw=PP3{BHa%uLNtO)t(*D=AMbN_9+6%`350a?i{y0LQa} z1~~O;qN*;>NX@fV(l#)#GB8krM6ZI4KBz#2dCvw^X7t<(^)=2?a0a?x}Eb2DvL7HGfMo+^YB`aMIpolpUmXc zykfj|BP)Rf3sSvf#{~_lAQv|~E*pJt?k)`fL2$v| z<&zm07&r?&B8wRqxP?KOkzv*x2?hoR_7YEDSN117g5uUJevdXtGcYhodAc};L>zt_ zrW?TIC}Jm*e&g7&+&R6+OwX&RWh8CRRJparCD$ZZ$aE#AN75rDwM@CUIo{DiZQpI% z%8RY69-oO#IDPMS_3qF6=5H^bw_W!3$Kw~*ObI{hRrxjk`P(PFD~|A&E~tvu@t(~& zJv3_nywhLbv&|0<7O}5Md%t^iaNIwhkkcV2Ydoj=%@UFC*`)paPn^fcliE)=>brH{ zHw=~Fe`ECN_~H2zKPTi$TJpy?E4n}bA}u1n^jvcPmXbgTkL+_%WeW?<7tP!{*Yf3~ zHvhtE9m!38Wr6Aoew29`mxuo2`I7$S1Cv^fs`lHhjT#HTGdxo~d%IdqC3DH+8P66j z-P!!-vf0}${&9})8vB#)ylyCAJ?p%~gsJJX)Y;7}QPPs_4swl__dWD8RCga;xu}Nw z-uVtjZWT7sV_`}hJ$FuUh|E58@;j$;`$`e9q&WUi$9Ih3moId96`$+mGM!Q2(;C#o znB8!}lWT|f6_Mvnk)j!EZZ9&}uuZ+2J!QkrKA|H~87mE=%S_K*+@U3FBfP!$M7TlY zXYR+0hfgF0YG&sxjEuUy%R;;9@^S8yz?mKKmKOpA4v(GZ{Z;`UF*|>6B`UVkIy?{?v}OY$=(hBs+Qd|PX1Zm zX!zx|@Rq7aM++p<@;IcoEA=H`vf+60@8uVzV*BTj(xT0c`of=I^zNxX0-7ym@O1Ta JS?83{1OOH@g~ - * Copyright (c) 2022, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -/* Fire.cpp - a (classic) graphics demo for Serenity, by pd. - * heavily based on the Fabien Sanglard's article: - * http://fabiensanglard.net/doom_fire_psx/index.html - * - * Future directions: - * [X] This does suggest the need for a palletized graphics surface. Thanks kling! - * [X] alternate column updates, or vertical interlacing. this would certainly alter - * the effect, but the update load would be halved. - * [/] scaled blit - * [ ] dithering? - * [X] inlining rand() - * [/] precalculating and recycling random data - * [ ] rework/expand palette - * [ ] switch to use tsc values for perf check - * [ ] handle mouse events differently for smoother painting (queue) - * [ ] handle fire bitmap edges better - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static constexpr int FIRE_WIDTH = 320; -static constexpr int FIRE_HEIGHT = 200; -static constexpr int FIRE_MAX = 29; - -static constexpr Array s_palette = { - Color(0x07, 0x07, 0x07), Color(0x1F, 0x07, 0x07), Color(0x2F, 0x0F, 0x07), - Color(0x47, 0x0F, 0x07), Color(0x57, 0x17, 0x07), Color(0x67, 0x1F, 0x07), - Color(0x77, 0x1F, 0x07), Color(0x9F, 0x2F, 0x07), Color(0xAF, 0x3F, 0x07), - Color(0xBF, 0x47, 0x07), Color(0xC7, 0x47, 0x07), Color(0xDF, 0x4F, 0x07), - Color(0xDF, 0x57, 0x07), Color(0xD7, 0x5F, 0x07), Color(0xD7, 0x5F, 0x07), - Color(0xD7, 0x67, 0x0F), Color(0xCF, 0x6F, 0x0F), Color(0xCF, 0x7F, 0x0F), - Color(0xCF, 0x87, 0x17), Color(0xC7, 0x87, 0x17), Color(0xC7, 0x8F, 0x17), - Color(0xC7, 0x97, 0x1F), Color(0xBF, 0x9F, 0x1F), Color(0xBF, 0xA7, 0x27), - Color(0xBF, 0xAF, 0x2F), Color(0xB7, 0xAF, 0x2F), Color(0xB7, 0xB7, 0x37), - Color(0xCF, 0xCF, 0x6F), Color(0xEF, 0xEF, 0xC7), Color(0xFF, 0xFF, 0xFF) -}; - -class Fire : public GUI::Frame { - C_OBJECT(Fire); - -public: - virtual ~Fire() override = default; - void set_stat_label(RefPtr l) { stats = l; }; - -private: - Fire(); - RefPtr bitmap; - RefPtr stats; - - virtual void paint_event(GUI::PaintEvent&) override; - virtual void timer_event(Core::TimerEvent&) override; - virtual void mousedown_event(GUI::MouseEvent& event) override; - virtual void mousemove_event(GUI::MouseEvent& event) override; - virtual void mouseup_event(GUI::MouseEvent& event) override; - - bool dragging; - int timeAvg; - int cycles; - int phase; -}; - -Fire::Fire() -{ - bitmap = Gfx::Bitmap::try_create(Gfx::BitmapFormat::Indexed8, { FIRE_WIDTH, FIRE_HEIGHT }).release_value_but_fixme_should_propagate_errors(); - - /* Initialize fire palette */ - for (int i = 0; i < 30; i++) - bitmap->set_palette_color(i, s_palette[i]); - - /* Set remaining entries to white */ - for (int i = 30; i < 256; i++) - bitmap->set_palette_color(i, Color::White); - - dragging = false; - timeAvg = 0; - cycles = 0; - phase = 0; - - srand(time(nullptr)); - stop_timer(); - start_timer(20); - - /* Draw fire "source" on bottom row of pixels */ - for (int i = 0; i < FIRE_WIDTH; i++) - bitmap->scanline_u8(bitmap->height() - 1)[i] = FIRE_MAX; - - /* Set off initital paint event */ - // update(); -} - -void Fire::paint_event(GUI::PaintEvent& event) -{ - GUI::Frame::paint_event(event); - auto timer = Core::ElapsedTimer::start_new(); - - GUI::Painter painter(*this); - painter.add_clip_rect(event.rect()); - painter.draw_scaled_bitmap(frame_inner_rect(), *bitmap, bitmap->rect()); - - timeAvg += timer.elapsed(); - cycles++; -} - -void Fire::timer_event(Core::TimerEvent&) -{ - /* Update only even or odd columns per frame... */ - phase++; - if (phase > 1) - phase = 0; - - /* Paint our palettized buffer to screen */ - for (int px = 0 + phase; px < FIRE_WIDTH; px += 2) { - for (int py = 1; py < FIRE_HEIGHT; py++) { - int rnd = rand() % 3; - - /* Calculate new pixel value, don't go below 0 */ - u8 nv = bitmap->scanline_u8(py)[px]; - if (nv > 0) - nv -= (rnd & 1); - - /* ...sigh... */ - int epx = px + (1 - rnd); - if (epx < 0) - epx = 0; - else if (epx > FIRE_WIDTH) - epx = FIRE_WIDTH; - - bitmap->scanline_u8(py - 1)[epx] = nv; - } - } - - if ((cycles % 50) == 0) { - dbgln("{} total cycles. finished 50 in {} ms, avg {} ms", cycles, timeAvg, timeAvg / 50); - stats->set_text(DeprecatedString::formatted("{} ms", timeAvg / 50)); - timeAvg = 0; - } - - update(); -} - -void Fire::mousedown_event(GUI::MouseEvent& event) -{ - if (event.button() == GUI::MouseButton::Primary) - dragging = true; - - return GUI::Widget::mousedown_event(event); -} - -/* FIXME: needs to account for the size of the window rect */ -void Fire::mousemove_event(GUI::MouseEvent& event) -{ - if (dragging) { - int ypos = event.y() / 2; - int xpos = event.x() / 2; - if (bitmap->rect().shrunken(1, 1, 0, 0).contains(xpos, ypos)) { - bitmap->scanline_u8(ypos - 1)[xpos] = FIRE_MAX + 5; - bitmap->scanline_u8(ypos - 1)[xpos + 1] = FIRE_MAX + 5; - bitmap->scanline_u8(ypos)[xpos] = FIRE_MAX + 5; - bitmap->scanline_u8(ypos)[xpos + 1] = FIRE_MAX + 5; - } - } - - return GUI::Widget::mousemove_event(event); -} - -void Fire::mouseup_event(GUI::MouseEvent& event) -{ - if (event.button() == GUI::MouseButton::Primary) - dragging = false; - - return GUI::Widget::mouseup_event(event); -} - -ErrorOr serenity_main(Main::Arguments arguments) -{ - auto app = TRY(GUI::Application::try_create(arguments)); - - TRY(Core::System::pledge("stdio recvfd sendfd rpath")); - TRY(Core::System::unveil("/res", "r")); - TRY(Core::System::unveil(nullptr, nullptr)); - - auto window = TRY(GUI::Window::try_create()); - window->set_double_buffering_enabled(false); - window->set_title("Fire"); - window->set_resizable(false); - window->resize(FIRE_WIDTH * 2 + 4, FIRE_HEIGHT * 2 + 4); - - auto file_menu = TRY(window->try_add_menu("&File")); - TRY(file_menu->try_add_action(GUI::CommonActions::make_quit_action([&](auto&) { app->quit(); }))); - - auto fire = TRY(window->try_set_main_widget()); - - auto time = TRY(fire->try_add()); - time->set_relative_rect({ 0, 4, 40, 10 }); - time->move_by({ window->width() - time->width(), 0 }); - fire->set_stat_label(time); - - window->show(); - - auto app_icon = GUI::Icon::default_icon("app-fire"sv); - window->set_icon(app_icon.bitmap_for_size(16)); - - return app->exec(); -}