From 023563f7139715c97e3cb62c62fe417719e57904 Mon Sep 17 00:00:00 2001 From: elee Date: Fri, 25 Mar 2022 00:14:03 -0500 Subject: [PATCH] file reading --- .gitignore | 10 ++ common/nori/animation.go | 139 +++++++++++++++++++++++++++ common/nori/blend.go | 18 ++++ common/nori/image.go | 71 ++++++++++++++ common/nori/nori.go | 40 ++++++++ common/nori/nori_test.go | 30 ++++++ common/nori/nori_test/test1.nri | Bin 0 -> 198462 bytes common/nori/nori_test/test2.nri | Bin 0 -> 263140 bytes common/nori/reader.go | 165 ++++++++++++++++++++++++++++++++ go.mod | 3 + 10 files changed, 476 insertions(+) create mode 100644 .gitignore create mode 100644 common/nori/animation.go create mode 100644 common/nori/blend.go create mode 100644 common/nori/image.go create mode 100644 common/nori/nori.go create mode 100644 common/nori/nori_test.go create mode 100644 common/nori/nori_test/test1.nri create mode 100644 common/nori/nori_test/test2.nri create mode 100644 common/nori/reader.go create mode 100644 go.mod diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b9c917 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +bin/ +out/ +dist/ + + +*.exe +*.out +*.bin + +*test.png diff --git a/common/nori/animation.go b/common/nori/animation.go new file mode 100644 index 0000000..d9bafb7 --- /dev/null +++ b/common/nori/animation.go @@ -0,0 +1,139 @@ +package nori + +import ( + "bufio" + "encoding/binary" + "io" +) + +type Frame struct { + Duration uint32 + PlaneCount uint32 + Planes []*Plane + CoordinateCount uint32 + Coordinates [][2]uint32 + Unknown1 string + Sound_effect string + Unknown2 string + Camp CampSection +} +type CampSection struct { + Params [7]uint32 + Array []byte + Extra string +} + +type Animation struct { + Title string + + // std::vector frame_offsets + FrameCount uint32 + Frames []*Frame +} + +func (a *Animation) Decode(rd *bufio.Reader, version int) error { + if err := binary.Read(rd, end, &a.FrameCount); err != nil { + return err + } + a.Frames = make([]*Frame, int(a.FrameCount)) + for i := range a.Frames { + cf := &Frame{} + a.Frames[i] = cf + if err := binary.Read(rd, end, &cf.Duration); err != nil { + return err + } + + if err := binary.Read(rd, end, &cf.PlaneCount); err != nil { + return err + } + + cf.Planes = make([]*Plane, int(cf.PlaneCount)) + for i := range cf.Planes { + cp := &Plane{} + cf.Planes[i] = cp + if err := binary.Read(rd, end, &cp.PlaneX); err != nil { + return err + } + + if err := binary.Read(rd, end, &cp.PlaneY); err != nil { + return err + } + + if err := binary.Read(rd, end, &cp.Opacity); err != nil { + return err + } + if err := binary.Read(rd, end, &cp.RenderFlag); err != nil { + return err + } + if err := binary.Read(rd, end, &cp.FlagParam); err != nil { + return err + } + } + if version != 300 { + if err := binary.Read(rd, end, &cf.CoordinateCount); err != nil { + return err + } + cf.Coordinates = make([][2]uint32, cf.CoordinateCount) + for i := range cf.Coordinates { + if err := binary.Read(rd, end, cf.Coordinates[i]); err != nil { + return err + } + } + } + switch version { + case 300, 301: + if _, err := rd.Discard(144); err != nil { + return err + } + case 302, 303: + if _, err := rd.Discard(96); err != nil { + return err + } + } + if version >= 302 { + // entry blocks + if _, err := rd.Discard(28 * 6); err != nil { + return err + } + } + // unknown1 + if _, err := rd.Discard(44); err != nil { + return err + } + //sound_effect + if _, err := rd.Discard(18); err != nil { + return err + } + // unknown2 + if _, err := rd.Discard(18); err != nil { + return err + } + var cast uint32 + + if err := binary.Read(rd, end, &cast); err != nil { + return err + } + if version > 303 && (cast > 1) { + cf.Camp = CampSection{} + if err := binary.Read(rd, end, &cf.Camp.Params); err != nil { + return err + } + sz := int(cf.Camp.Params[1]) * int(cf.Camp.Params[2]) + cf.Camp.Array = make([]byte, sz) + if _, err := io.ReadFull(rd, cf.Camp.Array); err != nil { + return err + } + } + } + return nil +} + +type Plane struct { + Bitmap_id uint32 + PlaneX int32 + PlaneY int32 + Opacity uint32 + Blend BlendMode + FlagParam uint32 + RenderFlag uint32 +} diff --git a/common/nori/blend.go b/common/nori/blend.go new file mode 100644 index 0000000..d5188ea --- /dev/null +++ b/common/nori/blend.go @@ -0,0 +1,18 @@ +package nori + +type BlendMode uint32 + +var ( + BlendMode_None BlendMode = 0 + BlendMode_Alpha BlendMode = 1 + // Blend_ALPHA + BlendMode_InvertMul BlendMode = 2 + // Color_Invert | Blend_MUL + BlendMode_Unknown3 BlendMode = 3 + BlendMode_Add BlendMode = 4 + BlendMode_InvertMul5 BlendMode = 5 + // Color_Invert | Blend_MUL + BlendMode_Mul BlendMode = 6 + BlendMode_Mul7 BlendMode = 7 + BlendMode_Add8 BlendMode = 8 +) diff --git a/common/nori/image.go b/common/nori/image.go new file mode 100644 index 0000000..b5b6a20 --- /dev/null +++ b/common/nori/image.go @@ -0,0 +1,71 @@ +package nori + +import ( + "bufio" + "encoding/binary" + "fmt" + "image" + "image/color" + "io" +) + +type Image struct { + Bpp uint32 + Count uint32 + Delay uint32 + OffsetX int32 + OffsetY int32 + + Width uint32 + Height uint32 + + Size uint32 + Data []byte + + Frame image.Image +} + +func (i *Image) Decode(rd *bufio.Reader) error { + cf := image.NewRGBA64(image.Rect(0, 0, int(i.Width), int(i.Height))) + i.Frame = cf + switch i.Bpp { + case 8: + rd.Discard(int(i.Size)) + return fmt.Errorf("bpp = 8, but no palette") + case 16: + var bgr uint16 + for idx := 0; idx < int(i.Size/2); idx++ { + if err := binary.Read(rd, end, &bgr); err != nil { + return err + } + red := uint8(((0x7c00 & bgr) >> 10) * 255 / 31) + green := uint8(((0x3e0 & bgr) >> 5) * 255 / 31) + blue := uint8((0x1f & bgr) * 255 / 31) + if red != 0 && blue != 0 && green != 0 { + } + col := &color.RGBA{ + red, green, blue, + 0xff, + } + cf.Set(idx%int(i.Width), idx/int(i.Width), col) + } + return nil + case 24: + i.Data = make([]byte, i.Size) + for idx := 0; idx < int(i.Size/3); idx++ { + rgb := [3]byte{} + _, err := io.ReadFull(rd, rgb[:]) + if err != nil { + return err + } + col := &color.RGBA{ + rgb[0], rgb[1], rgb[2], + 0xff, + } + cf.Set(idx%int(i.Width), idx/int(i.Width), col) + } + return nil + default: + return fmt.Errorf("unsupported bpp, %d", i.Bpp) + } +} diff --git a/common/nori/nori.go b/common/nori/nori.go new file mode 100644 index 0000000..4544e1c --- /dev/null +++ b/common/nori/nori.go @@ -0,0 +1,40 @@ +package nori + +type PaletteSection struct { + Version uint32 + Param01 uint32 + Param02 uint32 + Param03 uint32 + Param04 uint32 + Divided bool + DataLength uint32 + // Graphics::Palette color_data +} + +type GawiSection struct { + Version uint32 + Bpp uint32 + IsCompressed bool + Params [4]uint32 + BmpCount uint32 + Size uint32 + + HasPalette bool + Palette *PaletteSection + // std::vector bmp_offsets + Images []*Image +} + +type Nori struct { + Version uint32 + Params [5]uint32 + AnimationCount uint32 + SizeNoGawi uint32 + TotalSize uint32 + + Gawi *GawiSection + Animations []*Animation + AnimationByKey map[string]*Animation + + lastSignature [4]byte +} diff --git a/common/nori/nori_test.go b/common/nori/nori_test.go new file mode 100644 index 0000000..f18e194 --- /dev/null +++ b/common/nori/nori_test.go @@ -0,0 +1,30 @@ +package nori + +import ( + "os" + "testing" +) + +func TestParseFile1(t *testing.T) { + rd, err := os.OpenFile("./nori_test/test1.nri", os.O_RDONLY, 0666) + if err != nil { + t.Fatalf("open file: %s", err) + } + nori, err := NewReader(rd).Decode() + if err != nil { + t.Fatalf("decode: %s", err) + } + t.Logf("\n nori: %+v\n gawi: %+v", nori, nori.Gawi) +} + +func TestParseFile2(t *testing.T) { + rd, err := os.OpenFile("./nori_test/test2.nri", os.O_RDONLY, 0666) + if err != nil { + t.Fatalf("open file: %s", err) + } + nori, err := NewReader(rd).Decode() + if err != nil { + t.Fatalf("decode: %s", err) + } + t.Logf("\n nori: %+v\n gawi: %+v", nori, nori.Gawi) +} diff --git a/common/nori/nori_test/test1.nri b/common/nori/nori_test/test1.nri new file mode 100644 index 0000000000000000000000000000000000000000..93e2ee39cdbf77bf1848c9c8a57f294c63d26737 GIT binary patch literal 198462 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 QZ5n=*<9`Wqt||Nf2h1~(kN^Mx literal 0 HcmV?d00001 diff --git a/common/nori/nori_test/test2.nri b/common/nori/nori_test/test2.nri new file mode 100644 index 0000000000000000000000000000000000000000..aa8f8616ec2ca34f6708055a49293190ddc8b2bc GIT binary patch literal 263140 zcmeFaUyL2sb+2jr=7EezM#2>{paD`KuPIPWNV(gh1a<&rns?A6HccAj0AZ*MB~d2j zm_w;)3XE(~A_sbiMus5+R|#yyKr9M=5R_pe33|q;_y7Hy-}>DDIDT~h@27Nkwx(1d>Hp`?{Z>Bt-r6sGj$+TI{r`{-{x2oz{ND4z zaGRL~c5eK=jWbKBR695BoK^bSls!zl+9WVr`r70(B(hB^!?2l2U?B)BuQa5wl*aIQ zdI>Bvf#ns4G?vmB9=A(isVG^h>$JCW7`mJ#u$We`t=&Tw+oZC(!vN2+F9r$L&j>DRX5*twr{mV4Yvp%6I_NnGx<^{U@WqHsuJ zFD)Rbe6riV7!oYMV7u_;yXLoZ-`1+Ou({T8AcN&;|Mt{l>t||rTUaTP>Eg?@E9VfC}7 zZ2HGGQ!oGX>Dp7qm&ehv_E5$5i;EIg=25@4x5t&C<#C&Qri*XOvz)`GZ%?F%qq0Tq zp-Ry&t}J6^9`|m2drXAJQ7_3%pQ2aJ)rnL7>9b_ zTQ1Y5=$&`@#!TNTQuIpID}2adZwd60nWS9K6}C~+D|cJkK?+mr``5U4+k3_I3h#fN zl@;4d2ED?2lN)j&?{uU_>OneE%jVX)-nn|m43cc-Ti0Gv=oQ}odgRj9Kiy!)x^3)d z+k#$sdWFxn{6SCOOAful`?Z%m-uk5*+&H(6{p?!ND@U*J*_FN$QnyQ@J+xnY$>FVE zy1|Zf3)#=6CGF|kLuXU&%1PTUi}ujottP#<-l!Wn#J>OnlJ=b8Jb+>3{(&?6s+udEFV^;6JT_(L{SeKO2b%)hM2KlT_ zJ~NSy)0Fq9<hniOn>Fa^Bt+wY+y5ESWlm?Pc{YWi`e$ zWz;Uox@4559>!U-tnL(p6Vj_Kz1pspDRxNVT=d+Oc$+NCa(io{SyGv6(2jexrFZMq z!e+ka`Jl;RDeK#mRr9=F7h>yoyyJU?JARP%z1z~e{c2yCvpgQ8*59tWmhvi(yX!-2 zJB2IDFZXUuKM6ER>@BNq$qqwGnNKIV-ddP0=b*{CcYAurxQ$NXy~Bt5{t~dfyzia5 zcZ%LIy-Qo(G4pAW^3JD(}Vsonggwh|>yn|k#@rq_dV&prS2S6F!|<}0)LX>7U5 zbH1&bZ~o;fm&L2sd?hyD{EOGJ`IJnn=99ndch9e!)slNC@or7eUnWBiyQSJcWGM4e zJ_{j@vb^E((o0~_bvWqtUwVx%-zyHTE(f>f%a?}RS+haa=b+a6cItXLUwcsXIrDmx zQrmLY!%C~0Wj@n+4AKvx3}#mE*-B#&C9!<#JR9lHOrOiIt<%+eHZoX#ty@Vonwci1 z)93P)Nbj1@tmVtMWh<{{(`lr)E(bvtZMBaU4`zR35ad3WI`-2`n;z$KjoX!{Y+Lv7 z?W)!Ay6qC^)=(MJo@e=mQs=0Z&dPSw<0IwpXn9JYTX%I0*3WKl8>X*I*_zv1*WuM? zD}kBoZh8)8d+phzpXt@zp4pT=Ondt!FdMzil!b+E)$FdT7ANzZ9J`$L{&SsxuY3s+;%2CXGu0G7WR1%nr#+Hu6rMuEn$$NO6g_OWj z@v&6bSxDIo%UU`KEDaw^bCso&+VDyXFM*|CWGSw(@RAvpxRerD3PzUV8cQj&;k6cC z0!zWjLS18_%2{|RuHF(CN+%0dPCrd7g_i33M~p9kMzkF>K}Sl|Y@l`q}NR+3@PC zO9H`O9IY-13|qTABw+r$Ummp@)?&3u!2Ef?+S)&C@A8m<_#0BVJhZWzYXO5p4p%b) z%cJc>4wr`>R(mam9Ikc(mPh-C94-$%toB+AIb7`oERXiX;qdP?Ee~C+-dc#lA&0A% zfaTHhA&1LD539Wv=5S~cS33!}v;9G#I9#~525)DphSwe}2|!^G*KG_U$#Sr|Earo_`oRlz?Yn`qAUK-qLc4{`=nfhcQD5%#_6blIl+&vHkN8V}}x$ z35he2Qa=`Fl7EmEZcsU}iDOT=|+< z-7Q=UW)`E&)vcwK-};4NCQ8v!oX=K*bI&>3D-F{xv;^j^yCyYrE2+%oWAA6z*16@H z-8F`(7f%9n)1PyBPyNc{nbo(ML+AX?_L<6D^31G`!&FNnfw^eVd78X5&!=laGri9F zZN~H~X}0P6l{JjJeG-_h9wU8|mgaf?Hg%^~2*2L?mr!5%GhNzY{PLE7b;Wy@ZJOQG2>!=%7fzdW?O0%_E*8(s&=~yF((bJZei+%L>=ZR|!|8CzbjOrhg4*2mqch9QF_0qe2cch|o= zmXPjr4rz;R3v>Fmy|3AfbGY`z&bH)ciNo{TF9GYYTf1f599xD>ckGgtu6{OMUdOlP za$Vv+XiMc1hWo*gK&iuS4Z96xDu+$KFLRa0)937$qPwK-kbe1xam!Hx-8$?JnQOhv zlFH+`mZyB(C3T0)?+U}*OD}8>qoX7wXyNml)gGL)kEJG0WuRNW=J>@wBx zcrYX&9-4J+({VFR_j!}8-eu1$W%m{8AXg9j8L6{ZKWmd=^9n=H+$N>f9yVJ_n%p^m zFF86s_PtUL!&kQif)F3|l1E#-!@O_ib-4D;*x~t50;L4{(^8ME`_*P#J=QA~NL5~M zcs!IqF9`%u^%N2AqyF)2vGuUw*-!%gB_Pu3X-uE@^;pgv)1A9Jq&xR8WGI1d33QXw zo3b)@nabhaWjSWJA4*_43DoInU;j)0`xw)X7B5)+?XuCP4jKv|NX#p@*}=&o86VCyGpaP*`_Cd zTP^#SQ|4&aV7BM|uQc1z1}FU__whVA{Jny(-YqY+RUY@w(H=8%P0c)IT&b*Cc^oO4 zM`fzHT(PaZX4pzUmkj6E%9-n-nbPO8y*~M-&oi@B&2n6)a^Fl-KQB}2xE?>-vxO*Q zw%5G9=`F$e)WT)NzJFi>zEVAh&m23Ky~>zN&Oyzy za8h$gGne7?Ioe6FtjX`=wtc^NU%NY>WBQj}=2H%b%s#(!#@=N_$jUx)d*?ICa~YCU z{cL*aIenYf9oMTA;(Nsr-Yeeaw#6&1ci!&nIY-3If8-oBj8a$bQM7jc9F|h*)=U{& zKPIimr}Y?z_AX6%o4Mk=JznMcH&W|JdD?R})0R2vakI%^&lzP_G|zMV*jD=T3bQ8I z&u6sUCiAwiUaeQ!wj6}T)}6mCPd!z4iYQM<_4Kxb-T9j7eBQ4Vr>N%I(gOtY- zoVm<jLdcBO9=WgaJ z&sBq{Z5g+6j?4DV&nrtN-Fnj%W+E}?^}fubFqPH)Tc+%F+?~t!jLNR(i?BGVr>LK` zr<(tr9V~N&_N&xuGKgpOwk-~aA<6y{3K_>yGDnMkipQy#mVGK}N;=2ZRnz48!V&sh(t z=WC`_&U%jCVfE|Gkn>7cbgVoZq`Se4e|A3AF?DY&Nylh=?<;un%P;i zl(uuiV(TuqnWwGB-MMBGQZLzcm`Tn-NYmDydW+}Yie@>@bCv8G#J;>@Gf(rpOgrD> zdfBQ^y-bD0Z#|Z?dKn6t&ohCzLbGJoB2o|Kj8)gT=AYDssS=h_-dD)TnaiHlnFi&ZIY zDa!Kaf84(|W%+G&=??1-Da+`8T(3)aNfF<_oaG(cuN4ueqq(+(+-2V8IdN@a%{;2b zbScYRb3KkLO?S1n`0lXT^|k9)Z=Q9xDN=OD4MxaxEr|H;quI2O+>yS1rtr3~$T6M0 zEK@GTaoO7b<+atj8P+`SRbqM7UdQcuBXxWH@(!K8_K~9Z(M;M%?nqZZQ+QigSqdX3yU0) zM)hdMEd2S*uhU)gdPx1OyQaF*%znFbM@U&hgf91^sCECEM!K0C^)8FtjxCQB)*a%s z^}Xs)54+uG&ANA=_nNU$Yo`01dHc$eW}fTzrJQSh%Y6Ng+ge8Y2(O<_KT3(5%kije zO?j-kc8Apa7{u4Nxwo+_XYQpeP0od?YgtbFaoHYH^g3_GmFWiIxY_!8otv?}&+GZ- zc2<@?w-S~n*TUDcEV2J_*}`VZGH%e0`?sYT+jhQ?Ev}cpkR>lvS&Lc2dfDw~WjmTF z%DBNhuD7OM|9V{aSv~c_oRwEum=YJRl(KGhAGui9s9&*u&3fFz)!_D&RJNvBgEFpu z+)TNU=Sz2`+0=SzYgNBmoYiX_;dMgmsRrfDt!b~XW4&)rwXmVSmi7x<_S{OlT{SAN z+g5YOx5W*^<}U%u*ZcXGIQJ4<2k+-z(lF;BO2B&e{&uv%*Y^H))M0qd+bscWKlV#m zqqwS%mh$SuYb`Gcn1R?YMg8JxK3a;a4zIDCC14Wj`^Bnp{VG0Ntg8*n9V`i$hvt4E zThT1r=L>m_VOfJO0dvv4pKsf`OLWM5OCIK5nG!G`z4o(db+0lUKAWhIb?=apHc<=7Do8P;eP5ZT*>zm^Ub)MmVD1rG&;Oz&@ zo5-s($Jyl8*c?lqw;vdiI6v91?%c9xL0wQbxfSZp@BV1?wFgIcmf>f%dm~NQ$<-~% zVe4ln0sGna?iO3Y6z6btX8YLvqdN&7-8s6G5MrF}$}S(B*-m;hJiA&9Q?EV=m^>3@ zs!WvVTe}(dlxFQ_;)1^`yErfZ!=fp~FRwnS4qH4E2?Tqk)q|&?Pxfze>y=$fBR=2V zB^Dt~>6^c@heJy^6FscPG-l6KwUcB^R`N#}{E5V{drbm$jwKv=5^imF%_K zFU{e2;Mx$9VSGS-pL;JD}9Xnp08wOpEl`QLF+nN$EH9=q4 zuBHXlIpmZ)nWP}C9^!EJb@mh^`!^)8shO33Zi@pK@}>NW2QvgQ#Opu5@9rAid2@u> z=IOSZBjjT%nRdzcyylPo<%^!`TaY%SK*{U`I+sHe*<%ip5vXv~F zLNO?d$aQ&!qNgaTg~DKPRe4#xq1lkMRUp8&t(JdnH<9of0-S6$=d&ll4 zlwZP*{adz=@BQJn^SjMq$sn9*uF`SU-ZEm-c?=^{mTN1gr?Q2lV|3} z?tk&2-rJAvVS~gbg=OE5D{)PQ@eIW*4sGB{7wsj?IBCaGdvj=^Dm>J9*n!>UBKN__^*0pVg#UCuHN1z(whgX^oR&RSmpJzbO zcs!Gp_hoj4?basf`{6dTSCSWYP8<>^Iy?3c^6Fcn@#hDA{P^R4a`9_h4wymugV5&Z z!aPOs7)Z6$jLhoQ*h*@7oj&x7cCmY!dz;+q8J4RXuWmfLrOBQdw5^MC`(;^3NGs|4 z`GItP^fzDs&9lFG_Wzyw@l=yR?gQ1L9D(~Tp_Xqyu#)t!I@@CUVn*2nVsYTmmhbAu zJsTM3mL3<@uy$;s%x4PYOccKO5VU=EG#Kpg_x0agN?XO?mOuIDeat#Cn=S5C578L( zsg^?m2b)^c$Jm1Z{A!cFW%+Jx!t&vFgFaJe-on=T$YYNeAHwQEAH@Cq0Nz+3I)}<+ z0~3S)?NYLX$rqQNSoQGCkLsqn4hbA=_U?J1q|eV_gFufsU=P0weazw6+QHeyubDsD zIs0a(B38XWk;iyL|3AB5_At|j55@*&JNVP_|N+^E5n?OY8Le@2^`MG3>J$)pL%`rzP5ep^&;#>MnfAo7!304fZ5%!BqooLlD<7#Jl7okKM_bT&(yW=Kfd?k*BD!{r8z!rsh?L7 z$UIE`-_`f)@RxdoIrYV_z4*{aqwO|O^qIh6KX4ET>_uPQ_ThI$UwGQEeqjMcVjGQ& zjy1;Z@R#SBAu@a3+T1HhV~3dtvqTettkCcAkPT?^hrB*7?&J45k?wJ)H|LZ1%Jt5;#coh4)2o z*b<&}VPP0`Xv`t{{&}B97j@eQS&*n-TgbX6CdXg@0W*ZLb)LcHRS45qzhH3&1nLeN z+Q8*Zp?ZE^MyXzH|&Iplf_7O?cv>ienZmk7*rFu`B4eht3rwB?>5 zy+e><#8mFg%)$tsy}TQ-TBcdZNody)&fq9oZSEN-hN(Z z?dFM*PY!Q=#`+mQckNWa^iA0>|MQ6vY@g^8hg+Yye5_X+Pwu~ViuBh`o!mdOw(-OR z&d?Q`zlg?4XXs;0;ZbeM#NSk7WVnfvd3wmW{2+T$~s5aiy}~hz0!YD04Bo zk60l{i_UE44Pmv6k<@GmoL-ibTd{j#9k35upP9|QKQkTO&Q$ORecII4@pE5#s;!mS z%B|1HPR^7-tliBKX-KP^wZfgA-}&7~Q=iW>epo-Rbs4)~77#1fd-EDASv!q681;%A zoqL@#&ouh5cL^&g+xPPWrce9I0wz03+3E$J-z|U3Z;Y$#gAcBsUZbK9$#XZi-R~14 zUwX>=2>q-~{$&47JpaZ;wwEr#ST}*lZ2a6yDIS@i<<;8h= zf(6vq&9Q$X&UcqBV88y0Bs4Md`U&o3WQkAh_9hb}=;WnJAEZJjSitF}-qgZ!KA+rr z{Wvy_)*%h?*G}N&W7kfR#{6|lt=UqnA6mjwnLzl%BSW8v>dl|xHNR44R4WZ&Q2jj- zNPmy5!(D#vmOXH}(lmUok03NzKsG%crWCxce7M4h(=*|Z@1++g{-R~@M=Pg)OY`LZ z;P0i2*G^qNR+pUUYx0M!ynejRR@QS5*4e~}`gGh~@JFk~W799t8^K1NcpmHb`ibfI z6MbtpcfVU}`sllVd~cAYBXNmk?A~NE#id3e;h){>EBLeJgRJQNH9c{4&Rlce5@+HN zo*~c_CMy5%#fO;hp#@k!_x`xUWDRH12ZTQelr-sam&|BPC_SJNte^UR*G{c0>!(&v zj9>%R4-|WD^U3|;OVm@8g}inO0;lIMY@X(7^*$q>SJqEn)}(nK)S+kjXoqno56qkk zy~N;8NBCpgLD|BJN3kWwir!#t4WN0AeM%`y2;CY5kKIqb7|&w?<6TWzLWtzfD~W0z z%l=(EC2v#rs%tl&+#j|;6pFs<$5$eK$YydYeLIgXbkAv=v29$E6n(OgZ>0N?`*+)T zQ?BK?tY6tT()f^ZuYIowk_9X|vqzTaB{d@xjgKE6g})z<$#&L9$zsn>-sr)J#LD_% z=j#9AOg=dI->`Mn6S@?OO{5=aw&@Yt0>1X(%`{hq*Y&sBG#fa*1>81{{Kn6jzaVh! z=56D)1b7-YdfW67SDNQ7X}RZxHAyBANKe=H54l`E#@xHcy+J1Sub#ho=G89h`)TGG zZ9(7p-7o|}^yX#v#G36Kd)YdL+Y-9ZXb%jD^21`U<1O?2aW#WSe^8{EKA4k@Bc|&0 zky>MCj?8Q#*kA9cVi^zF2g8~-dtlC|vw+CjBMkg2l<^EIW?Yc9Yyh%e)AwF)%6>4< zvHaX=vT{fTudLCD$HtJ!_=EemUn^z(um{!(9BS4jtRM71l4)zw_jqEnz8!t|<9lrZ z#U6h6pZC4^5MI}#5YNHLXJ-E^+GOoSq50E@qeGtZR3l%kVjc+xnb<;zr(T+i)*Ys{ zV(-Oc|5ee*Pvc)~Ae(KSdP2~L24wmAd-HyJ7_2xEs8NR6k3F=6Bqd4Z^%M0zbF-aT zzo1V?kQmlazW1ZiACI};=RFjv--orUGbp=P{_5%5mIMF1?_!#VVbxVo=y7Xh>%#h( zy=?oEg{#q5QJZ{swv6)Pc{WDY5npTzh!1w_*sH%G3)qjq%g1B^>2H_v<({|1<$23K zcvH$N?|kiMW?3u&SmRFgCYw0@=(lP8WCKg;7)*i7MAK-)n3Tjdv{xwOomVzGlT$WvcgK+VO} z3G6=)$bF71@xz|!E9Fh!Z)MK6)LChsVF4NchfGAD?ne2IYp0sI%5$urG$HzAA8h?Z zi&j^Cl*h8A-{n}GVIjp>FaBizNF$rblM{TSyrjISe5fs*_VUUlfgbrP#_Td8b}A8C zmgc9y%)`VzCJTrkmJcrF(mduqrXM4Znu zv!zX`@^y`}?^m~e*fq#vv;8ZrpM5Xv5zeZ>Jsa|GK0dm|REo_yp??3|3~K(x)OlY} zroLS<#~kdLS*7+_?Bi*$Eg&t0yyyk?w}AJ&z-Sj=f(;aR@;CHz*kZnqp1JhYE$=}N z@p%8l^FiR+&EbKO2ey!B9?*B~)O0fedgd#eSK0;5I*UH9Erp)a`azrtg}*%;`1TdQ ztdfa1@oNHYA34VY+Wz4y@uKFAeXs{``%LBmMWFiB<$MgZ#q%YvQd(&QUO!HY7+Huh&#>zW z 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

mC&;xUCFxEED-2O2m!?@gK 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 literal 0 HcmV?d00001 diff --git a/common/nori/reader.go b/common/nori/reader.go new file mode 100644 index 0000000..23a1deb --- /dev/null +++ b/common/nori/reader.go @@ -0,0 +1,165 @@ +package nori + +import ( + "bufio" + "encoding/binary" + "fmt" + "io" +) + +var end = binary.LittleEndian + +type Reader struct { + nori *Nori + + r *bufio.Reader +} + +func NewReader(rd io.Reader) *Reader { + o := &Reader{ + nori: &Nori{}, + r: bufio.NewReader(rd), + } + return o +} + +func (n *Reader) Decode() (*Nori, error) { + if _, err := io.ReadFull(n, n.nori.lastSignature[:]); err != nil { + return nil, err + } + if sig, target := string(n.nori.lastSignature[:]), "NORI"; sig != target { + return nil, fmt.Errorf("expected header %s, got %s", target, sig) + } + if err := binary.Read(n, end, &n.nori.Version); err != nil { + return nil, err + } + if err := binary.Read(n, end, n.nori.Params[:]); err != nil { + return nil, err + } + if err := binary.Read(n, end, &n.nori.AnimationCount); err != nil { + return nil, err + } + if err := binary.Read(n, end, &n.nori.SizeNoGawi); err != nil { + return nil, err + } + if err := binary.Read(n, end, &n.nori.TotalSize); err != nil { + return nil, err + } + if err := n.decodeGawi(); err != nil { + return nil, err + } + return n.nori, nil +} + +func (n *Reader) decodeGawi() error { + g := &GawiSection{} + n.nori.Gawi = g + if _, err := io.ReadFull(n, n.nori.lastSignature[:]); err != nil { + return err + } + if sig, target := string(n.nori.lastSignature[:]), "GAWI"; sig != target { + return fmt.Errorf("bad sig: want %s, got %s", target, sig) + } + if err := binary.Read(n, end, &g.Version); err != nil { + return err + } + if g.Version != 300 { + return fmt.Errorf("bad ver: want 300, got %d", g.Version) + } + if err := binary.Read(n, end, &g.Bpp); err != nil { + return err + } + good := false + for _, v := range [3]uint32{8, 16, 24} { + if g.Bpp == v { + good = true + } + } + if !good { + return fmt.Errorf("bad bpp: %d", g.Bpp) + } + var container uint32 + if err := binary.Read(n, end, &container); err != nil { + return err + } + g.IsCompressed = (container == 1) + if err := binary.Read(n, end, &container); err != nil { + return err + } + g.HasPalette = (container > 0) + + if err := binary.Read(n, end, g.Params[:]); err != nil { + return err + } + if err := binary.Read(n, end, &g.BmpCount); err != nil { + return err + } + if err := binary.Read(n, end, &g.Size); err != nil { + return err + } + if g.HasPalette { + n.decodePalette() + } + if _, err := n.r.Discard(4 * int(g.BmpCount)); err != nil { + return err + } + g.Images = make([]*Image, int(g.BmpCount)) + for i := range g.Images { + g.Images[i] = &Image{Bpp: g.Bpp} + if err := n.decodeImage(g.Images[i]); err != nil { + return err + } + } + if _, err := n.r.Discard(4 * int(n.nori.AnimationCount)); err != nil { + return err + } + n.nori.Animations = make([]*Animation, n.nori.AnimationCount) + return nil +} + +func (n *Reader) decodePalette() error { + if sig, target := string(n.nori.lastSignature[:]), "PAL_"; sig != target { + return fmt.Errorf("bad sig: want %s, got %s", target, sig) + } + return nil +} +func (n *Reader) decodeImage(img *Image) error { + if err := binary.Read(n, end, &img.Count); err != nil { + return err + } + if img.Count != 1 { + return fmt.Errorf("img count should be 1") + } + + if err := binary.Read(n, end, &img.Size); err != nil { + return err + } + + if err := binary.Read(n, end, &img.Width); err != nil { + return err + } + + if err := binary.Read(n, end, &img.Height); err != nil { + return err + } + + if err := binary.Read(n, end, &img.Delay); err != nil { + return err + } + + if err := binary.Read(n, end, &img.OffsetX); err != nil { + return err + } + + if err := binary.Read(n, end, &img.OffsetY); err != nil { + return err + } + if err := img.Decode(n.r); err != nil { + return err + } + return nil +} + +func (n *Reader) Read(b []byte) (int, error) { + return n.r.Read(b) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f62b7f0 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.tuxpa.in/a/gotagonist + +go 1.18