From 49093116b798100061e09759cddb555dc7ae830a Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 19 Jun 2017 18:22:07 +0200 Subject: [PATCH] Added test tool: raw_importer --- examples/raw_importer/image_2x2_RGBA.raw | Bin 0 -> 16 bytes examples/raw_importer/raw_importer.c | 210 ++++++++++++++++++++ examples/raw_importer/raw_importer_REF.png | Bin 0 -> 9476 bytes examples/raw_importer/raw_importer_REV0.png | Bin 0 -> 3754 bytes examples/raw_importer/raw_importer_REV1.png | Bin 0 -> 4013 bytes examples/raw_importer/raw_importer_REV2.png | Bin 0 -> 3028 bytes 6 files changed, 210 insertions(+) create mode 100644 examples/raw_importer/image_2x2_RGBA.raw create mode 100644 examples/raw_importer/raw_importer.c create mode 100644 examples/raw_importer/raw_importer_REF.png create mode 100644 examples/raw_importer/raw_importer_REV0.png create mode 100644 examples/raw_importer/raw_importer_REV1.png create mode 100644 examples/raw_importer/raw_importer_REV2.png diff --git a/examples/raw_importer/image_2x2_RGBA.raw b/examples/raw_importer/image_2x2_RGBA.raw new file mode 100644 index 0000000000000000000000000000000000000000..1aa92cd865c1bdfe68e43cbacef67dcccf98222b GIT binary patch literal 16 Ycmey*!0`Y7RNepT6E^*~`Ookl08K&(VE_OC literal 0 HcmV?d00001 diff --git a/examples/raw_importer/raw_importer.c b/examples/raw_importer/raw_importer.c new file mode 100644 index 0000000..172db97 --- /dev/null +++ b/examples/raw_importer/raw_importer.c @@ -0,0 +1,210 @@ +/******************************************************************************************* +* +* raygui - raw image file importer +* +* This example has been created using raylib v1.7 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2017 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#define RAYGUI_IMPLEMENTATION +#include "raygui.h" + +#include + +char *GetFileName(char *path); +void GuiPanel(Rectangle bounds, char const *text); + +int main(int argc, char *argv[0]) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int SCREEN_WIDTH = 800; + const int SCREEN_HEIGHT = 450; + + Rectangle panel = { SCREEN_WIDTH/2 - 100, SCREEN_HEIGHT/2 - 390/2, 200, 390 }; + + char textImageWidth[16] = "\0"; + char textImageHeight[16] = "\0"; + char textImageSize[16] = "\0"; + + bool btnLoadPressed = false; + + int buttonToggleChannel = 3; + int buttonToggleDepth = 0; + char *arrayChannel[4] = { "1", "2", "3", "4" }; + char *arrayDepth[3] = { "8", "16", "32" }; + + // Image file info + int dataSize = 0; + char fileName[32] = "\0"; + + bool showImportPanel = false; + bool imageLoaded = false; + + float imageScale = 1.0f; + + InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "raw image importer"); + + Texture2D texture = { 0 }; + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // Check if a file is dropped + if (IsFileDropped()) + { + int fileCount = 0; + char **droppedFiles = GetDroppedFiles(&fileCount); + + // Check file extensions for drag-and-drop + if ((fileCount == 1) && IsFileExtension(droppedFiles[0], ".raw")) + { + FILE *imageFile = fopen(droppedFiles[0], "rb"); + fseek(imageFile, 0L, SEEK_END); + dataSize = ftell(imageFile); + fclose(imageFile); + + strcpy(fileName, GetFileName(droppedFiles[0])); + + showImportPanel = true; + } + + ClearDroppedFiles(); + } + + if (btnLoadPressed) + { + // Convert input textImageWidth, textImageHeight to int + int width = atoi(textImageWidth); + int height = atoi(textImageHeight); + int format = UNCOMPRESSED_R8G8B8A8; + + int channels = atoi(arrayChannel[buttonToggleChannel]); + int bpp = atoi(arrayDepth[buttonToggleDepth]); + + int headerSize = atoi(textImageSize); + + // Depending on channels and bit depth, select correct pixel format + if ((width != 0) && (height != 0) && (bpp == 8)) + { + switch (channels) + { + case 1: format = UNCOMPRESSED_GRAYSCALE; break; + case 2: format = UNCOMPRESSED_GRAY_ALPHA; break; + case 3: format = UNCOMPRESSED_R8G8B8; break; + case 4: format = UNCOMPRESSED_R8G8B8A8; break; + default: break; + } + + Image image = LoadImageRaw(fileName, width, height, format, headerSize); + texture = LoadTextureFromImage(image); + UnloadImage(image); + + showImportPanel = false; + btnLoadPressed = false; + imageLoaded = true; + } + } + + if (imageLoaded) + { + // Image zoom control + imageScale += (float)GetMouseWheelMove(); + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawRectangleLines(10, 10, SCREEN_WIDTH - 20, SCREEN_HEIGHT - 20, GuiLinesColor()); + + if (texture.id != 0) DrawTextureEx(texture, (Vector2){ SCREEN_WIDTH/2 - texture.width*imageScale/2, SCREEN_HEIGHT/2 - texture.height*imageScale/2 }, 0, imageScale, WHITE); + else DrawText("drag & drop RAW image file", 320, 180, 10, GRAY); + + if (showImportPanel) + { + DrawRectangle(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Fade(LIGHTGRAY, 0.5f)); + + DrawRectangleRec(panel, GuiBackgroundColor()); + DrawRectangleLines(panel.x, panel.y, panel.width, panel.height, GuiLinesColor()); + + GuiLabel((Rectangle){ panel.x + 10, panel.y + 10, 0, 0 }, FormatText("Import file: %s", fileName)); + GuiLabel((Rectangle){ panel.x + 10, panel.y + 30, 0, 0 }, FormatText("File size: %i bytes", dataSize)); + + // ----- Resolution panel----- + GuiPanel((Rectangle){ panel.x + 10, panel.y + 55, 180, 80 }, "Resolution"); + + GuiLabel((Rectangle){ panel.x + 20, panel.y + 80, 0, 0 }, "Width:"); + GuiLabel((Rectangle){ panel.x + 150, panel.y + 80, 0, 0 }, "pixels"); + + GuiTextBox((Rectangle){ panel.x + 60, panel.y + 75, 80, 20 }, textImageWidth, 16); + + GuiLabel((Rectangle){ panel.x + 20, panel.y + 105, 0, 0 }, "Height:"); + GuiLabel((Rectangle){ panel.x + 150, panel.y + 105, 0, 0 }, "pixels"); + + GuiTextBox((Rectangle){ panel.x + 60, panel.y + 100, 80, 20 }, textImageHeight, 16); + + // ----- Pixel data panel ----- + GuiPanel((Rectangle){ panel.x + 10, panel.y + 155, 180, 110 }, "Pixels Data"); + + GuiLabel((Rectangle){ panel.x + 20, panel.y + 170, 0, 0 }, "Channels:"); + GuiLabel((Rectangle){ panel.x + 20, panel.y + 215, 0, 0 }, "Bit Depth:"); + + buttonToggleChannel = GuiToggleGroup((Rectangle){ panel.x + 20, panel.y + 185, 38, 20 }, 4, arrayChannel, buttonToggleChannel); + buttonToggleDepth = GuiToggleGroup((Rectangle){ panel.x + 20, panel.y + 230, 51, 20 }, 3, arrayDepth, buttonToggleDepth); + + // ----- Header panel ----- + GuiPanel((Rectangle){ panel.x + 10, panel.y + 285, 180, 50 }, "Header"); + + GuiLabel((Rectangle){ panel.x + 20, panel.y + 305, 0, 0 }, "Size:"); + GuiLabel((Rectangle){ panel.x + 150, panel.y + 305, 0, 0 }, "bytes"); + + GuiTextBox((Rectangle){ panel.x + 60, panel.y + 300, 80, 20 }, textImageSize, 4); + + btnLoadPressed = GuiButton((Rectangle){ panel.x + 10, panel.y + 350, 180, 24 }, "Load RAW Image"); + } + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + if (texture.id != 0) UnloadTexture(texture); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +void GuiPanel(Rectangle bounds, char const *text) +{ + DrawLineEx((Vector2){ bounds.x + 1, bounds.y }, (Vector2){ bounds.x, bounds.y + bounds.height }, 1, GuiLinesColor()); + DrawLineEx((Vector2){ bounds.x, bounds.y + bounds.height }, (Vector2){ bounds.x + bounds.width, bounds.y + bounds.height }, 1, GuiLinesColor()); + DrawLineEx((Vector2){ bounds.x + bounds.width, bounds.y + bounds.height }, (Vector2){ bounds.x + bounds.width, bounds.y }, 1, GuiLinesColor()); + DrawLineEx((Vector2){ bounds.x, bounds.y }, (Vector2){ bounds.x + 10, bounds.y }, 1, GuiLinesColor()); + DrawLineEx((Vector2){ bounds.x + bounds.width, bounds.y }, (Vector2){ bounds.x + 20 + MeasureText(text, 10), bounds.y }, 1, GuiLinesColor()); + + DrawText(text, bounds.x + 14, bounds.y - 5, 10, GuiTextColor()); +} + +char *GetFileName(char *path) +{ + char *base = strrchr(path, '\\'); + + return base ? base + 1 : path; +} \ No newline at end of file diff --git a/examples/raw_importer/raw_importer_REF.png b/examples/raw_importer/raw_importer_REF.png new file mode 100644 index 0000000000000000000000000000000000000000..ada7ffe22b03187be986b24018a35dd354c6077c GIT binary patch literal 9476 zcmaKS1z1$;)-VVHg1`|3ln&__I)))71SF)phM|X{VMq}H5fzjYh7Kv|?t`QQ1JVuB zokQn09`Cu|x!?2Oe?NO>zx$n4d)2IWy*pA%Lz$S6nh*;Mi&*8Ef;Q$ljD>{_CAfnb zkq!08U@nh66%9RgV78td%2- z7?jWI7Yv^-)D?q`g$0uFb+rOJK|C3)A$ATfQp|get;~!LHd4$6BI^9=u1_KM4$u7D zAv%5j5H(27l6BFZM6yz7+2k;951O#~n#DGGAKz@G4e;v#i zZtga=Ky3x3fAPZHNio}ddb$Du03RP8J|7`In7bW7Kte*|7Y#u{UJL}U2i(Qe%9q#0 zgXM1u3J?#lyMwEz1I&f-7ey;;n3ty%Ge*+ij{tT3H(3{tf2j$hFo3U>D?osc|JNh^ z4XCdE{|ALa{|)WosSWvGdHxuFi)6=JuumK7QDJY4H zh|7zK3JD4bD2mAQE67QRJQWxJbrlm;_#0ON2KItNTs;5AwfSG%r~eiAmm@%3F`N}3 z?hf7%8zpxbl<}_z20HwASukw>n=HR^ZT`C~a{m<yZe+v0S~o`S5V%wp zy`7HIvTXaH7o(F!&14j1Pt^EuOEt=j^DFB+$94v9eJJtQOfIA-nROVaOF@d4QJL11 zf6*?RDQEf9aSbsCHP)F&Q-#e57s%^W33SkQzu)-fRS<6fc9Kw~kX;Mj740M; z6(od{vFMzAdnM2g92^`Zyf)*iQwSaO%0)|^mOCUCI|vZ8d^L}2 zHL~x1B)yzLN0}JnuiBdOawJ#GNKt8sKzjpnPC)GUnTyU_;mBxd zZKmR>oZ8vrA7UiDs8%x{pZ$uqq* zjZpL1>+Sp){rH0PL>2?sa|cW$$%bd~%Hi z`vsg`slhzhV-TdpSouV5o-eR{5i!{UI}(_SXC&{oAu14g37P*|gj!mCbePsSakYRG z&KIH{D!ivdky{kByMY6_6`jME5$gIVMIl7;4%qP-RNL_6IYsG!@CLC=;)-?l$~FQ}V$4Hd`=Vj+V38c3J;}LX zhW_b7S9uS>B6K8j`$VmdYQ9E2nkijc!2R=8g)^HS1>kT!8~;>;-Y<>ki~8L`mNhNn zhDC{S|J7c)A{&~7j;{X1!#~?u2Iy#mHa-~L0O*LefS&nkmG;i=EilJK!~UVeNVBm$ znNyI@@N}Tm@^JvmJ>WpDs%M* zF}5WdbBj4KQTA7${Ug?7;TiDwM8w8U>UWAp6>ezztpjnMW3jrIvYm%@F8vW(axZUz ztJ9YLj=vBxHd!?{h01UE{rbHwwuzZL*}(z5%rApIE@t0)_w)9ZM;gZP_T}QV%SE3{ zKKY&y*MXCSA?RxN7!S0Ff8{x@1Sv zYD(=rqugh9LSdwvsY&5|iSmhQEj|NY*G^R!S@#T}1mwi6?;c)B0%nZ7-JId&^iO2OAt5S~akNffEuQTKh|W$X1ebo$ z>$zug`MM^I1f{sfp%$I)o8B6ScTnX8G@Nqej-JwNAm1RdJ;0tcChhRL#x0$aTJ?H+ zxC%`zgqQ6$z3ESg0&_clMKaw&>O@U_1A{L91ONlGcPM;BvX;Me`}$8&0>u)aG;_`+ zCRI?G8`0#bBC`<@Dn5KNP{?v7oF{r;!)6Pv=By;(h%ojsk9*bY>1^y1QZrnFK6HHB z^~V*-!;{s3gh>gd%3A(QffD`%{?s(6)!Zr>S27~4hGy*HBx94N*1j%R38>*3U-y)A z-cHp?Mbw3jhwv=vlXShz8`8R#%qRH6YgK4@9b8YH|JIL6#9AGj>(9MRB5yH z=-knwK1mIS)kVk0{)RLD_Iz3{^waWGC{~1sS*t5KG4muPez2K~u}1WKfX+G;kL%@H5L077CmI~txqjTOjyH3$}{rFc(D=q zg;>t?`P6@*wjnk2q8#ps)qOT3Tf}ou)82}yO0V^Y z^G3hiHQaC|%VYV(_Y?F+Vmy8=7Y87BxvL zY$+3s@5)pBh|eY91L~O-)|FxooU_JKYEXoFne0a=aSv-s-}>8fYEm{s>RMd#W$U)V zl8y^oF?z zvAS4V3MLVS<*2_Ky+5=nVuMad0WS#!=^w2kq};UDH>nChi~9@h5MUXa`!TGscl@gd zw;B&U?7b7SmvHXWrC4*=R{pxKk`K2<=M)`9x}8Vxy--uOdB&n4}xyG|pgWQKJSP_r&icMDByVrPDQF6H)`x=5?RR!HR<2Z!c zak`j0`?DbW-)a6oZ48{=yvF@NFJ(;CeSWqS{S-=^3$nJh&gzQhCySJI+^@kx;%L!h zp>jZZBc>*wbxR%;46JfRA1-&OHAJrtEa=YRy&6j{kwRvJ5E27kLW{lkC{=q($32DR zOya*!7d|d{{o_vL>x4H^c2dje)1uSzDu9TLv8~8Ey?>Iz7}i_XDixe z7LtzK_iM8P^MQins>CQr(EfTFUE9nLGNS@sy%(<06XecaO$-ZLx|h6ODM6n4sg$&C zOHP?Q^`I`RF(8tlC|SC+P*d-W_p_9yI*W;TT1KRFufxWXl>GYl@&V;z+nyo}AmJE4t9W2jS+vt7&gWd}s(& z3&vlc(2_q$tJO>&e~665t8+*VTS~H6>Ro;KW+s@RG(*#BjqThFCz}6t;xZVYms(m9 zg?3a;1s1f5{frUUbO~rYf>%GERrX_$@~h&T({l?@;}RRDu`a)0kf5O1FiWe=G42#5 zgJ<#)0NrJCLCDZTRbP%jp0gninhr_`f7bzlN9aOn_l~gFhg`(g4L_mSe@*|c2Uarg zVFt+reXM#+`!nT(aozlh51V*@`&Yi%ij{o&s#9}xykGxCne}kDHcfuy@dR$3d0RQO z5|1{cm}?u#t3&T_S`OU!$ka3@4v$0O>U>s1wpdXlyYq1pebAvl2-jhgGSesJk(z-%ABxs(PXhuPS*C7v`^yA;N3*iJ*U|9Wn<;DXuAmgjK@F?(vkXKe`XE^_;y?VXR@g&QfsRxDtj1-L zPU@i&A5a8Thd)74QzU5=5T{zShTr?bpQy`%Vy)KG)Vmt&b1bbD$r85-y(Or6+mbo3 zM*e;|gUy{$$J_x)N$v0?l(h*eXpZvt`UkTF`W30kSeW80lH&>l^Y*4h;c^u>wY9aq ze@`q-p8pC}wDK?;3se35-+B&-lOYhF7ww{;cRCRx!$Vip)!@cHFLbpge5L?J8PK_+~s%@7EbrMxDe>i-v<@q z1k_e^G)xu8p4ccEEE|1nR0=hHkoM!1;K8~$xuW-I3ZYje{+6REH(o;5mi@`k)y(}y zuD=p{G$yf6Mf{bIQ8QI@ZV>%t?^1{OyxMum#L{GSrgSM^1%#CEue{!8u`y0X;je8e zWYDUx@*skgVeYEjM!!EcW#)uHsG{y|&DVoE(HC_t9=AWva>l2D$c{LN8~2n4u9n{3 z-e7S1ij$Yi+M|hO6F-}fiDlIf=R~T}SF8+gc+TqYM5WM=49|7;tSS-ZSWxSaF!?OJ2|~O1g9(0EU0g6U(@Pj2*b?;(PYO@}12`|R!2QGyj%L1_2hxL=m*%cS z%^P*bmxv&*N(duiQif$chLpN*KQ)Z1T%x3ezq$H6xhg;s)wN($qz}0vl-hFfx|7j_ zy7Mul@c3UwlD*qiGn!@EhK+^fepT^W9^2OhW3T^MLSZ4NaaqGBURnDty%#Gy9-T%q zJ}f;kFPAPd6KEtTH>|`x`OJ4BbvhH9XPZ`i*Jsy#dLUp`h#~0AijGUORIKFN*j(iO ztaidG1I7%#?xh0|8K)|xd_h$tLP{*5_82!dQWhwfI`l3{{hd#ntBW<0a~e~28#BMO z?jMIk(_G~|H=q1Q^kC~fERtRWM=x57t}e?djcW_#5P6}>8S2HV4vH(FX_b}{>g0_F z3H)^5NlHtVSvyt2+HAr%nxQUA#o&pu!9j$WF=fMx;%t7)^PQyPkcWu;hN@lm=<<=G z`t6|lZP z-I?B4$#30P+>qrEkAC@8QVgo+-EHQ*!YNlBP(c)!24(mX%R4bZK0d9Y?bqzm-`d#p zIHiVbPc~-;$)eT`B%gU#?Il-|_cBE> z5;=CU4b+(WSn=_G@-_KZzr#AaE-+Wv?j^*Rnao!H78T{k0j3sSo`j=5@Gs)LH5io{ zKr0IsHP4N`sgRF5eBrE6H~(C_WRoHJGnr9q0sq(;-oVsAWp!}j=iQI|P)K#$rln{w zotKPb;B+eNIJOnJdgM}K*L5CVUXx~U-&WngKvy3h|E|ATjh8e2A6c)0)*YwHCIr-9 zNHo_9XpL%^%dHtYGtAd~DEQ%>K1Pgo)(ZtsH?8LtV*+>bkT&i z{j7nWz3=~Xr8jXt`1U&ZYKcK?#)lZUi|gjSz|z`UpY9KI2Ig?q>s$y|{c5t)m%KbC5%Si{*}eQu>D%*xy_tG+VNnTl z>Y#=37c#EA>h(1WTL*`Y)7IPTo*n{`c?7KGJiatwWy}PY+gkOUwY|N)Dq-_cjY`-k zZQW|^$!7t@5@R`%Z_w9z6%fAS2fz zoRd-FnnqY9ia=5KdVBhKZ0t<7ht<}==KF;zL;_BVNo}BW=Z5PwJAJxM=>GB_(DwzP zO{yp{!e6FH){i9Hl*4E>cue*BDY^8XEDYb^ZBOSmh&|+}>#D4x101y*e)e;cab4f*x!uarw5F=H8Z|YiS+iNYfv+zXPNwC-wFTDx z$IIp=&8O!6C&hH9(P1aTb+xQkkv{&?my-j(cz;@Dmp-^>CLred4i)ChR^@9sF{a(A zSSSQjxHro2QpQlGe8(hZtL`uVB#ZNk(Ek=0w>`zDuv(Q(KxmdlGoDsN=QdQVW~E zxw+h1E0A?6AgPR>!|!7RO;(ac&(>Fd@2Z)dofVt&1q)L*2b>G4?EH#^PC$@cutSn+ ze#+Qp@b?(9Imfmb5U>^%TbrGy`2zMPx)1fbGblgqL>s^xv{OAkgsQKoux?C1Iuu_6 z9ygify<^tJsV$B2A5&ZF56Wnm6)GKRXGs*iYWU+mo}I02%gu2qgLHuJ?alQFI=h8V z!l=S~QS5$Ys;Z5NS6hsCWmDt94HNV>>^3`Yzp242??7H)FQH#!EM?#p%!)Ku;JYKw|ytGzW z|M-)1ZkwQVd(`<#{GGNOtx`E7NhlLZHWwpF_I**!4y%AIllh7gGPg$-*P8|f8U_Z5 zZV;{+;Jn=hN_6Eayd3(08;&=W7S@pbrpl5Qub!wdyMFf6oW@_V>9%F>rrVpR5XMy0 zihS!6<0UhwYGN2vG1}VZd?h!&FuOXXpGFr4{pr|h8Y7-c++Yjvqmz=>AL}! z{07A!Qkzso-1^A&41|%+T-s$9{qzHW?;R|Mm7(v7dcvj_rC#6fkcCkD=d6H2sDZ^@ z8ibK56*?ByL3`B`65b}P<{5y|>6XjgMvJp=REN6ze$96MkBncf=^AN1VsFz_R|b;v zp%RkQ!j!YZ+7p)b9PLe@;RU}K0>gZ&0wZ?gK@wU|31I4h9-R)u&9jm+hOt@i=KR-q zz1P5n*V7&rxr?HzdVf8I1W9|sNWe@jXmnFmpurRGIj-IFvjBH~n&=$@?o4RpO>z|+ z5!GH+o{I4wM)UsIx**u;)Z%xwPx}px-gPy91{;DUOXkhPyg5dv--^EjEmn3|iO1~H zno}7O_SnMPp<|~fNA;wpcy=Q;1IBOLdsw6|#qYlt8lr)J^Vt=c5IEVaR~s)a_L>ip zlti39>iH4KDB4nW($-Hm`iJ@XB7X{hx0QHiv)}g7+kjA9J7-anr}G9h{M z-x;NxGQt(BQw+vDN%XxNkH3IKNZP%NF<+Cb6n%GcwAR`lBR;hE3>yvS*b$DnY8L|o zW{0bzi?0{7F~t%?gq1ObCSt)dzo(CL@Ns=oL0xHUo>i!jDCU>pK_Nd?wTy70lbIlP z|1BdC*U+vS_O0yn?zivTe@N9t)po_R`v}jezc#7PCv1G-vV?2*kSZb*G~f?;H+wrl zVkV;rKhjU`6vT6JEiz0}lBHD|#eCqhv|Vg7F6F?=K%o{5i$rBwC8@z@0*`%Ver;DF zaeg;ewCMAFOr`XaQd1SxLR7h7uCA_NFb?nCLQC|_75yEoi+_UtV+o$D4X-!U)Z~fa z##^b6kCGmlKYD;6D;#}ThaDG_ntx%$J(TFDEYv?uXhBOfZcu2#QA+*he(#Vo*eqMF zgaOmMGfS(qONnGA({-)lW}@;-tzE$^)GqQlHoNtT@d;a5y{^sdG`^2qfD$-ON{uf?f-RhOe)EM7-1FlB&}E zOiEP8OFsO=oxSJ{k5FQtKw#2NO$PQQ+=R8+-Zr;;8dxZ9b3sFWuSzvg9>(}n&yjW2 zB-hyZ7t|cbG>IVBvkGtRefRI`0P|H-O?q2}thl z3eM6|?cBM?7AvQj)M|e$X|WAPCrY5dl1@2!BN9!_5}xvk-{e2+WSRBiOy$&lRjr54 zpN%UhyV0T7Pq@8YxCtGy_FoHb5+6?)G9f^uMDdZNC0B^i?j9=*ZM-p<}c1N+TrYiQX3Kx=k%!rUvG%VI zd7Dw3jYvh6h^8L~kTW06{@Myrqobj(X3yzH)DGB+;$7Mr04&M^X0zT#^MfkfOf+#9 zag>&dhf|jmmvAcHGrUP0Sz);xpB)_Q=!$NnHUd78I+UnS;`Cpb6m1NCR!s?c$6q|B zLjhzs*U)vT-5@|{vE~1KPoWjgyroD3bXj|8u4!CUS--J?sqJ{Ft3?}~d3yw=ed0G| z;RR*3EAB)d4i?=mPzo*SW@Mja#0dFK-4M-5hCE@gu$KX_C1d1>p-DWfZI=%Wio zuCHOk+x1Ch96u|zow*Ymi??ZTZd&@WVNMDg;WjxYs=%VKb8$5xc&actk=H!~|9GTg zgh%c5_`upZ8q{*Nf3@=EAw5H-Qe46bO`mc4E+uA_z-&-x`Uk=m27a*fEe`sngs`>f zn=-)*rvZSyN-ekO;5Ilv!1SP8v(`kXc?u z%Lh*GnlHWG-IVQv)Z(9vU(o01OXwKVD8CZJ``sN#&P_L9_M-cUwKB?mOcQ(;M)Z6B z|2BRwy`mb|zl+w9%L&T3XIsn0OQ|Cl zJtPw#EChZ^{iB920vgL-CT=s+@%g`DVIiF;DWhj{_E!@5dcvs8FAmj}DZLmxw=zIl zf~Gp86=15n-O{HcJNhBK^!3*T19XjN?GfH`@C?&${+H}|^x`Ld*yl?jb|0i%Hw&mJ z-wy@s8)&v<>xUf5*1z_tHP^-84SIRa z=fpgpX4Cbb;)7I=c7~-(v1|nI(L%qa-3rb8~Bi^6dDlOYZ3pQh?tX8Z&yJa@{t^O%Q1&{`_f4`&m6Do(kgD{Xl9==s>$0*1WO`S+)F&~Edce=;q@PDN7 rU+N7B|FUv)hQhqj0Kc(#iH%iBPY-|b+VjP)_mWf;H55wZEnoc)R1GRz literal 0 HcmV?d00001 diff --git a/examples/raw_importer/raw_importer_REV0.png b/examples/raw_importer/raw_importer_REV0.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0fc99c91e79ba1afbf348b4746ea2957fde3d9 GIT binary patch literal 3754 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
E!UBV9;>T03ZvZyBB~0+&$?5 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 EFUhvpsQ>@~ literal 0 HcmV?d00001 diff --git a/examples/raw_importer/raw_importer_REV2.png b/examples/raw_importer/raw_importer_REV2.png new file mode 100644 index 0000000000000000000000000000000000000000..0797528fa01a80997620197ddbf2874b0ed6a8ca GIT binary patch literal 3028 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 JC_U~S|34BIjOqXY literal 0 HcmV?d00001