gfxd_rs/
arg_type.rs

1/* SPDX-FileCopyrightText: © 2025 Decompollaborate */
2/* SPDX-License-Identifier: MIT OR Apache-2.0 */
3
4use core::{convert::TryFrom, fmt};
5
6/// The type of an Gfx argument.
7#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
8#[allow(non_camel_case_types)]
9pub enum ArgType {
10    /// generic word
11    Word = 0,
12    /// command opcode (G_*)
13    Opcode = 1,
14    /// integer coordinate
15    Coordi = 2,
16    /// fractional (q10.2) coordinate
17    Coordq = 3,
18    /// palette index
19    Pal = 4,
20    /// tlut pointer
21    Tlut = 5,
22    /// texture image pointer
23    Timg = 6,
24    /// tmem address
25    Tmem = 7,
26    /// tile index
27    Tile = 8,
28    /// texture format
29    Fmt = 9,
30    /// texture pixel size
31    Siz = 10,
32    /// integer dimension (width / height)
33    Dim = 11,
34    /// clamp and mirror flags
35    Cm = 12,
36    /// tile mask
37    Tm = 13,
38    /// tile shift
39    Ts = 14,
40    /// texture dxt
41    Dxt = 15,
42    /// generic tag
43    Tag = 16,
44    /// pipeline mode
45    Pm = 17,
46    /// color component
47    Colorpart = 18,
48    /// color
49    Color = 19,
50    /// lod fraction (q0.8)
51    Lodfrac = 20,
52    /// color image pointer
53    Cimg = 21,
54    /// depth image pointer
55    Zimg = 22,
56    /// alpha compare mode
57    Ac = 23,
58    /// alpha dither mode
59    Ad = 24,
60    /// color dither mode
61    Cd = 25,
62    /// color combiner preset index
63    Ccpre = 26,
64    /// color mux operand (a)
65    Ccmuxa = 27,
66    /// color mux operand (b)
67    Ccmuxb = 28,
68    /// color mux operand (c)
69    Ccmuxc = 29,
70    /// color mux operand (d)
71    Ccmuxd = 30,
72    /// alpha mux operand (a, b, or d)
73    Acmuxabd = 31,
74    /// alpha mux operand (c)
75    Acmuxc = 32,
76    /// color convert operand
77    Cv = 33,
78    /// texture convert mode
79    Tc = 34,
80    /// cycle type
81    Cyc = 35,
82    /// depth source mode
83    Zs = 36,
84    /// combine key mode
85    Ck = 37,
86    /// combine key scale
87    Keyscale = 38,
88    /// combine key width
89    Keywidth = 39,
90    /// integer depth
91    Zi = 40,
92    /// cycle 1 render mode
93    Rm1 = 41,
94    /// cycle 2 render mode
95    Rm2 = 42,
96    /// scissor mode
97    Sc = 43,
98    /// texture detail mode
99    Td = 44,
100    /// texture filter mode
101    Tf = 45,
102    /// texture LOD mode
103    Tl = 46,
104    /// textuure LUT mode
105    Tt = 47,
106    /// texture perspective mode
107    Tp = 48,
108    /// texture line size
109    Line = 49,
110    /// vertex index
111    Vtx = 50,
112    /// vertex flag
113    Vtxflag = 51,
114    /// display list pointer
115    Dl = 52,
116    /// raw depth value (q16.16)
117    Zraw = 53,
118    /// display list flag
119    Dlflag = 54,
120    /// clip ratio
121    Cr = 55,
122    /// element count
123    Num = 56,
124    /// fog factor
125    Fogz = 57,
126    /// fog position (0 - 1000)
127    Fogp = 58,
128    /// matrix pointer
129    Mtxptr = 59,
130    /// geometry mode
131    Gm = 60,
132    /// matrix moveword offset
133    Mwo_matrix = 61,
134    /// line width (1.5 + q7.1)
135    Linewd = 62,
136    /// microcode text pointer
137    Uctext = 63,
138    /// microcode data pointer
139    Ucdata = 64,
140    /// data size
141    Size = 65,
142    /// lookat pointer
143    Lookatptr = 66,
144    /// matrix param
145    Mtxparam = 67,
146    /// matrix param (stack select only)
147    Mtxstack = 68,
148    /// vertex moveword offset
149    Mwo_point = 69,
150    /// w-component scale (perspnorm)
151    Wscale = 70,
152    /// segment number
153    Seg = 71,
154    /// segment pointer
155    Segptr = 72,
156    /// dereferenced LightsM (0-7 or n) pointer
157    Lightsn = 73,
158    /// light count (NUMLIGHTS_*)
159    Numlights = 74,
160    /// light number (LIGHT_*)
161    Lightnum = 75,
162    /// diffuse or ambient light pointer
163    Lightptr = 76,
164    /// texture coordinate scale
165    Tcscale = 77,
166    /// on-off value
167    Switch = 78,
168    /// vertex coordinate (q10.5)
169    St = 79,
170    /// vertex coordinate delta (q5.10)
171    Stdelta = 80,
172    /// vertex pointer
173    Vtxptr = 81,
174    /// viewport pointer
175    Vpptr = 82,
176    /// generic dram address
177    Dram = 83,
178    /// othermode lo shift
179    Sftlo = 84,
180    /// othermode lo value
181    Othermodelo = 85,
182    /// othermode hi shift
183    Sfthi = 86,
184    /// othermode hi value
185    Othermodehi = 87,
186    /// moveword index
187    Mw = 88,
188    /// moveword offset
189    Mwo = 89,
190    /// clip ratio moveword offset
191    Mwo_clip = 90,
192    /// light color moveword offset
193    Mwo_lightcol = 91,
194    /// movemem index
195    Mv = 92,
196    /// movemem offset
197    Mvo = 93,
198    /// dmem address
199    Dmem = 94,
200    /// dma io flag
201    Dmaflag = 95,
202}
203
204impl ArgType {
205    /// An string represation of the argument type.
206    #[must_use]
207    pub const fn as_str(&self) -> &'static str {
208        match self {
209            Self::Word => "Word",
210            Self::Opcode => "Opcode",
211            Self::Coordi => "Coordi",
212            Self::Coordq => "Coordq",
213            Self::Pal => "Pal",
214            Self::Tlut => "Tlut",
215            Self::Timg => "Timg",
216            Self::Tmem => "Tmem",
217            Self::Tile => "Tile",
218            Self::Fmt => "Fmt",
219            Self::Siz => "Siz",
220            Self::Dim => "Dim",
221            Self::Cm => "Cm",
222            Self::Tm => "Tm",
223            Self::Ts => "Ts",
224            Self::Dxt => "Dxt",
225            Self::Tag => "Tag",
226            Self::Pm => "Pm",
227            Self::Colorpart => "Colorpart",
228            Self::Color => "Color",
229            Self::Lodfrac => "Lodfrac",
230            Self::Cimg => "Cimg",
231            Self::Zimg => "Zimg",
232            Self::Ac => "Ac",
233            Self::Ad => "Ad",
234            Self::Cd => "Cd",
235            Self::Ccpre => "Ccpre",
236            Self::Ccmuxa => "Ccmuxa",
237            Self::Ccmuxb => "Ccmuxb",
238            Self::Ccmuxc => "Ccmuxc",
239            Self::Ccmuxd => "Ccmuxd",
240            Self::Acmuxabd => "Acmuxabd",
241            Self::Acmuxc => "Acmuxc",
242            Self::Cv => "Cv",
243            Self::Tc => "Tc",
244            Self::Cyc => "Cyc",
245            Self::Zs => "Zs",
246            Self::Ck => "Ck",
247            Self::Keyscale => "Keyscale",
248            Self::Keywidth => "Keywidth",
249            Self::Zi => "Zi",
250            Self::Rm1 => "Rm1",
251            Self::Rm2 => "Rm2",
252            Self::Sc => "Sc",
253            Self::Td => "Td",
254            Self::Tf => "Tf",
255            Self::Tl => "Tl",
256            Self::Tt => "Tt",
257            Self::Tp => "Tp",
258            Self::Line => "Line",
259            Self::Vtx => "Vtx",
260            Self::Vtxflag => "Vtxflag",
261            Self::Dl => "Dl",
262            Self::Zraw => "Zraw",
263            Self::Dlflag => "Dlflag",
264            Self::Cr => "Cr",
265            Self::Num => "Num",
266            Self::Fogz => "Fogz",
267            Self::Fogp => "Fogp",
268            Self::Mtxptr => "Mtxptr",
269            Self::Gm => "Gm",
270            Self::Mwo_matrix => "Mwo_matrix",
271            Self::Linewd => "Linewd",
272            Self::Uctext => "Uctext",
273            Self::Ucdata => "Ucdata",
274            Self::Size => "Size",
275            Self::Lookatptr => "Lookatptr",
276            Self::Mtxparam => "Mtxparam",
277            Self::Mtxstack => "Mtxstack",
278            Self::Mwo_point => "Mwo_point",
279            Self::Wscale => "Wscale",
280            Self::Seg => "Seg",
281            Self::Segptr => "Segptr",
282            Self::Lightsn => "Lightsn",
283            Self::Numlights => "Numlights",
284            Self::Lightnum => "Lightnum",
285            Self::Lightptr => "Lightptr",
286            Self::Tcscale => "Tcscale",
287            Self::Switch => "Switch",
288            Self::St => "St",
289            Self::Stdelta => "Stdelta",
290            Self::Vtxptr => "Vtxptr",
291            Self::Vpptr => "Vpptr",
292            Self::Dram => "Dram",
293            Self::Sftlo => "Sftlo",
294            Self::Othermodelo => "Othermodelo",
295            Self::Sfthi => "Sfthi",
296            Self::Othermodehi => "Othermodehi",
297            Self::Mw => "Mw",
298            Self::Mwo => "Mwo",
299            Self::Mwo_clip => "Mwo_clip",
300            Self::Mwo_lightcol => "Mwo_lightcol",
301            Self::Mv => "Mv",
302            Self::Mvo => "Mvo",
303            Self::Dmem => "Dmem",
304            Self::Dmaflag => "Dmaflag",
305        }
306    }
307
308    /// Convert an integer value to an argument type.
309    #[must_use]
310    pub const fn from_u32(value: u32) -> Option<Self> {
311        match value {
312            0 => Some(Self::Word),
313            1 => Some(Self::Opcode),
314            2 => Some(Self::Coordi),
315            3 => Some(Self::Coordq),
316            4 => Some(Self::Pal),
317            5 => Some(Self::Tlut),
318            6 => Some(Self::Timg),
319            7 => Some(Self::Tmem),
320            8 => Some(Self::Tile),
321            9 => Some(Self::Fmt),
322            10 => Some(Self::Siz),
323            11 => Some(Self::Dim),
324            12 => Some(Self::Cm),
325            13 => Some(Self::Tm),
326            14 => Some(Self::Ts),
327            15 => Some(Self::Dxt),
328            16 => Some(Self::Tag),
329            17 => Some(Self::Pm),
330            18 => Some(Self::Colorpart),
331            19 => Some(Self::Color),
332            20 => Some(Self::Lodfrac),
333            21 => Some(Self::Cimg),
334            22 => Some(Self::Zimg),
335            23 => Some(Self::Ac),
336            24 => Some(Self::Ad),
337            25 => Some(Self::Cd),
338            26 => Some(Self::Ccpre),
339            27 => Some(Self::Ccmuxa),
340            28 => Some(Self::Ccmuxb),
341            29 => Some(Self::Ccmuxc),
342            30 => Some(Self::Ccmuxd),
343            31 => Some(Self::Acmuxabd),
344            32 => Some(Self::Acmuxc),
345            33 => Some(Self::Cv),
346            34 => Some(Self::Tc),
347            35 => Some(Self::Cyc),
348            36 => Some(Self::Zs),
349            37 => Some(Self::Ck),
350            38 => Some(Self::Keyscale),
351            39 => Some(Self::Keywidth),
352            40 => Some(Self::Zi),
353            41 => Some(Self::Rm1),
354            42 => Some(Self::Rm2),
355            43 => Some(Self::Sc),
356            44 => Some(Self::Td),
357            45 => Some(Self::Tf),
358            46 => Some(Self::Tl),
359            47 => Some(Self::Tt),
360            48 => Some(Self::Tp),
361            49 => Some(Self::Line),
362            50 => Some(Self::Vtx),
363            51 => Some(Self::Vtxflag),
364            52 => Some(Self::Dl),
365            53 => Some(Self::Zraw),
366            54 => Some(Self::Dlflag),
367            55 => Some(Self::Cr),
368            56 => Some(Self::Num),
369            57 => Some(Self::Fogz),
370            58 => Some(Self::Fogp),
371            59 => Some(Self::Mtxptr),
372            60 => Some(Self::Gm),
373            61 => Some(Self::Mwo_matrix),
374            62 => Some(Self::Linewd),
375            63 => Some(Self::Uctext),
376            64 => Some(Self::Ucdata),
377            65 => Some(Self::Size),
378            66 => Some(Self::Lookatptr),
379            67 => Some(Self::Mtxparam),
380            68 => Some(Self::Mtxstack),
381            69 => Some(Self::Mwo_point),
382            70 => Some(Self::Wscale),
383            71 => Some(Self::Seg),
384            72 => Some(Self::Segptr),
385            73 => Some(Self::Lightsn),
386            74 => Some(Self::Numlights),
387            75 => Some(Self::Lightnum),
388            76 => Some(Self::Lightptr),
389            77 => Some(Self::Tcscale),
390            78 => Some(Self::Switch),
391            79 => Some(Self::St),
392            80 => Some(Self::Stdelta),
393            81 => Some(Self::Vtxptr),
394            82 => Some(Self::Vpptr),
395            83 => Some(Self::Dram),
396            84 => Some(Self::Sftlo),
397            85 => Some(Self::Othermodelo),
398            86 => Some(Self::Sfthi),
399            87 => Some(Self::Othermodehi),
400            88 => Some(Self::Mw),
401            89 => Some(Self::Mwo),
402            90 => Some(Self::Mwo_clip),
403            91 => Some(Self::Mwo_lightcol),
404            92 => Some(Self::Mv),
405            93 => Some(Self::Mvo),
406            94 => Some(Self::Dmem),
407            95 => Some(Self::Dmaflag),
408            _ => None,
409        }
410    }
411
412    /// Convert this argument type to a plain integer.
413    #[must_use]
414    pub const fn to_u32(&self) -> u32 {
415        match self {
416            Self::Word => 0,
417            Self::Opcode => 1,
418            Self::Coordi => 2,
419            Self::Coordq => 3,
420            Self::Pal => 4,
421            Self::Tlut => 5,
422            Self::Timg => 6,
423            Self::Tmem => 7,
424            Self::Tile => 8,
425            Self::Fmt => 9,
426            Self::Siz => 10,
427            Self::Dim => 11,
428            Self::Cm => 12,
429            Self::Tm => 13,
430            Self::Ts => 14,
431            Self::Dxt => 15,
432            Self::Tag => 16,
433            Self::Pm => 17,
434            Self::Colorpart => 18,
435            Self::Color => 19,
436            Self::Lodfrac => 20,
437            Self::Cimg => 21,
438            Self::Zimg => 22,
439            Self::Ac => 23,
440            Self::Ad => 24,
441            Self::Cd => 25,
442            Self::Ccpre => 26,
443            Self::Ccmuxa => 27,
444            Self::Ccmuxb => 28,
445            Self::Ccmuxc => 29,
446            Self::Ccmuxd => 30,
447            Self::Acmuxabd => 31,
448            Self::Acmuxc => 32,
449            Self::Cv => 33,
450            Self::Tc => 34,
451            Self::Cyc => 35,
452            Self::Zs => 36,
453            Self::Ck => 37,
454            Self::Keyscale => 38,
455            Self::Keywidth => 39,
456            Self::Zi => 40,
457            Self::Rm1 => 41,
458            Self::Rm2 => 42,
459            Self::Sc => 43,
460            Self::Td => 44,
461            Self::Tf => 45,
462            Self::Tl => 46,
463            Self::Tt => 47,
464            Self::Tp => 48,
465            Self::Line => 49,
466            Self::Vtx => 50,
467            Self::Vtxflag => 51,
468            Self::Dl => 52,
469            Self::Zraw => 53,
470            Self::Dlflag => 54,
471            Self::Cr => 55,
472            Self::Num => 56,
473            Self::Fogz => 57,
474            Self::Fogp => 58,
475            Self::Mtxptr => 59,
476            Self::Gm => 60,
477            Self::Mwo_matrix => 61,
478            Self::Linewd => 62,
479            Self::Uctext => 63,
480            Self::Ucdata => 64,
481            Self::Size => 65,
482            Self::Lookatptr => 66,
483            Self::Mtxparam => 67,
484            Self::Mtxstack => 68,
485            Self::Mwo_point => 69,
486            Self::Wscale => 70,
487            Self::Seg => 71,
488            Self::Segptr => 72,
489            Self::Lightsn => 73,
490            Self::Numlights => 74,
491            Self::Lightnum => 75,
492            Self::Lightptr => 76,
493            Self::Tcscale => 77,
494            Self::Switch => 78,
495            Self::St => 79,
496            Self::Stdelta => 80,
497            Self::Vtxptr => 81,
498            Self::Vpptr => 82,
499            Self::Dram => 83,
500            Self::Sftlo => 84,
501            Self::Othermodelo => 85,
502            Self::Sfthi => 86,
503            Self::Othermodehi => 87,
504            Self::Mw => 88,
505            Self::Mwo => 89,
506            Self::Mwo_clip => 90,
507            Self::Mwo_lightcol => 91,
508            Self::Mv => 92,
509            Self::Mvo => 93,
510            Self::Dmem => 94,
511            Self::Dmaflag => 95,
512        }
513    }
514}
515
516impl fmt::Display for ArgType {
517    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
518        write!(f, "{}", self.as_str())
519    }
520}
521
522impl From<gfxd_sys::arg_type::ArgType> for ArgType {
523    fn from(value: gfxd_sys::arg_type::ArgType) -> Self {
524        match value {
525            gfxd_sys::arg_type::gfxd_Word => Self::Word,
526            gfxd_sys::arg_type::gfxd_Opcode => Self::Opcode,
527            gfxd_sys::arg_type::gfxd_Coordi => Self::Coordi,
528            gfxd_sys::arg_type::gfxd_Coordq => Self::Coordq,
529            gfxd_sys::arg_type::gfxd_Pal => Self::Pal,
530            gfxd_sys::arg_type::gfxd_Tlut => Self::Tlut,
531            gfxd_sys::arg_type::gfxd_Timg => Self::Timg,
532            gfxd_sys::arg_type::gfxd_Tmem => Self::Tmem,
533            gfxd_sys::arg_type::gfxd_Tile => Self::Tile,
534            gfxd_sys::arg_type::gfxd_Fmt => Self::Fmt,
535            gfxd_sys::arg_type::gfxd_Siz => Self::Siz,
536            gfxd_sys::arg_type::gfxd_Dim => Self::Dim,
537            gfxd_sys::arg_type::gfxd_Cm => Self::Cm,
538            gfxd_sys::arg_type::gfxd_Tm => Self::Tm,
539            gfxd_sys::arg_type::gfxd_Ts => Self::Ts,
540            gfxd_sys::arg_type::gfxd_Dxt => Self::Dxt,
541            gfxd_sys::arg_type::gfxd_Tag => Self::Tag,
542            gfxd_sys::arg_type::gfxd_Pm => Self::Pm,
543            gfxd_sys::arg_type::gfxd_Colorpart => Self::Colorpart,
544            gfxd_sys::arg_type::gfxd_Color => Self::Color,
545            gfxd_sys::arg_type::gfxd_Lodfrac => Self::Lodfrac,
546            gfxd_sys::arg_type::gfxd_Cimg => Self::Cimg,
547            gfxd_sys::arg_type::gfxd_Zimg => Self::Zimg,
548            gfxd_sys::arg_type::gfxd_Ac => Self::Ac,
549            gfxd_sys::arg_type::gfxd_Ad => Self::Ad,
550            gfxd_sys::arg_type::gfxd_Cd => Self::Cd,
551            gfxd_sys::arg_type::gfxd_Ccpre => Self::Ccpre,
552            gfxd_sys::arg_type::gfxd_Ccmuxa => Self::Ccmuxa,
553            gfxd_sys::arg_type::gfxd_Ccmuxb => Self::Ccmuxb,
554            gfxd_sys::arg_type::gfxd_Ccmuxc => Self::Ccmuxc,
555            gfxd_sys::arg_type::gfxd_Ccmuxd => Self::Ccmuxd,
556            gfxd_sys::arg_type::gfxd_Acmuxabd => Self::Acmuxabd,
557            gfxd_sys::arg_type::gfxd_Acmuxc => Self::Acmuxc,
558            gfxd_sys::arg_type::gfxd_Cv => Self::Cv,
559            gfxd_sys::arg_type::gfxd_Tc => Self::Tc,
560            gfxd_sys::arg_type::gfxd_Cyc => Self::Cyc,
561            gfxd_sys::arg_type::gfxd_Zs => Self::Zs,
562            gfxd_sys::arg_type::gfxd_Ck => Self::Ck,
563            gfxd_sys::arg_type::gfxd_Keyscale => Self::Keyscale,
564            gfxd_sys::arg_type::gfxd_Keywidth => Self::Keywidth,
565            gfxd_sys::arg_type::gfxd_Zi => Self::Zi,
566            gfxd_sys::arg_type::gfxd_Rm1 => Self::Rm1,
567            gfxd_sys::arg_type::gfxd_Rm2 => Self::Rm2,
568            gfxd_sys::arg_type::gfxd_Sc => Self::Sc,
569            gfxd_sys::arg_type::gfxd_Td => Self::Td,
570            gfxd_sys::arg_type::gfxd_Tf => Self::Tf,
571            gfxd_sys::arg_type::gfxd_Tl => Self::Tl,
572            gfxd_sys::arg_type::gfxd_Tt => Self::Tt,
573            gfxd_sys::arg_type::gfxd_Tp => Self::Tp,
574            gfxd_sys::arg_type::gfxd_Line => Self::Line,
575            gfxd_sys::arg_type::gfxd_Vtx => Self::Vtx,
576            gfxd_sys::arg_type::gfxd_Vtxflag => Self::Vtxflag,
577            gfxd_sys::arg_type::gfxd_Dl => Self::Dl,
578            gfxd_sys::arg_type::gfxd_Zraw => Self::Zraw,
579            gfxd_sys::arg_type::gfxd_Dlflag => Self::Dlflag,
580            gfxd_sys::arg_type::gfxd_Cr => Self::Cr,
581            gfxd_sys::arg_type::gfxd_Num => Self::Num,
582            gfxd_sys::arg_type::gfxd_Fogz => Self::Fogz,
583            gfxd_sys::arg_type::gfxd_Fogp => Self::Fogp,
584            gfxd_sys::arg_type::gfxd_Mtxptr => Self::Mtxptr,
585            gfxd_sys::arg_type::gfxd_Gm => Self::Gm,
586            gfxd_sys::arg_type::gfxd_Mwo_matrix => Self::Mwo_matrix,
587            gfxd_sys::arg_type::gfxd_Linewd => Self::Linewd,
588            gfxd_sys::arg_type::gfxd_Uctext => Self::Uctext,
589            gfxd_sys::arg_type::gfxd_Ucdata => Self::Ucdata,
590            gfxd_sys::arg_type::gfxd_Size => Self::Size,
591            gfxd_sys::arg_type::gfxd_Lookatptr => Self::Lookatptr,
592            gfxd_sys::arg_type::gfxd_Mtxparam => Self::Mtxparam,
593            gfxd_sys::arg_type::gfxd_Mtxstack => Self::Mtxstack,
594            gfxd_sys::arg_type::gfxd_Mwo_point => Self::Mwo_point,
595            gfxd_sys::arg_type::gfxd_Wscale => Self::Wscale,
596            gfxd_sys::arg_type::gfxd_Seg => Self::Seg,
597            gfxd_sys::arg_type::gfxd_Segptr => Self::Segptr,
598            gfxd_sys::arg_type::gfxd_Lightsn => Self::Lightsn,
599            gfxd_sys::arg_type::gfxd_Numlights => Self::Numlights,
600            gfxd_sys::arg_type::gfxd_Lightnum => Self::Lightnum,
601            gfxd_sys::arg_type::gfxd_Lightptr => Self::Lightptr,
602            gfxd_sys::arg_type::gfxd_Tcscale => Self::Tcscale,
603            gfxd_sys::arg_type::gfxd_Switch => Self::Switch,
604            gfxd_sys::arg_type::gfxd_St => Self::St,
605            gfxd_sys::arg_type::gfxd_Stdelta => Self::Stdelta,
606            gfxd_sys::arg_type::gfxd_Vtxptr => Self::Vtxptr,
607            gfxd_sys::arg_type::gfxd_Vpptr => Self::Vpptr,
608            gfxd_sys::arg_type::gfxd_Dram => Self::Dram,
609            gfxd_sys::arg_type::gfxd_Sftlo => Self::Sftlo,
610            gfxd_sys::arg_type::gfxd_Othermodelo => Self::Othermodelo,
611            gfxd_sys::arg_type::gfxd_Sfthi => Self::Sfthi,
612            gfxd_sys::arg_type::gfxd_Othermodehi => Self::Othermodehi,
613            gfxd_sys::arg_type::gfxd_Mw => Self::Mw,
614            gfxd_sys::arg_type::gfxd_Mwo => Self::Mwo,
615            gfxd_sys::arg_type::gfxd_Mwo_clip => Self::Mwo_clip,
616            gfxd_sys::arg_type::gfxd_Mwo_lightcol => Self::Mwo_lightcol,
617            gfxd_sys::arg_type::gfxd_Mv => Self::Mv,
618            gfxd_sys::arg_type::gfxd_Mvo => Self::Mvo,
619            gfxd_sys::arg_type::gfxd_Dmem => Self::Dmem,
620            gfxd_sys::arg_type::gfxd_Dmaflag => Self::Dmaflag,
621        }
622    }
623}
624
625impl From<ArgType> for gfxd_sys::arg_type::ArgType {
626    fn from(value: ArgType) -> gfxd_sys::arg_type::ArgType {
627        match value {
628            ArgType::Word => gfxd_sys::arg_type::gfxd_Word,
629            ArgType::Opcode => gfxd_sys::arg_type::gfxd_Opcode,
630            ArgType::Coordi => gfxd_sys::arg_type::gfxd_Coordi,
631            ArgType::Coordq => gfxd_sys::arg_type::gfxd_Coordq,
632            ArgType::Pal => gfxd_sys::arg_type::gfxd_Pal,
633            ArgType::Tlut => gfxd_sys::arg_type::gfxd_Tlut,
634            ArgType::Timg => gfxd_sys::arg_type::gfxd_Timg,
635            ArgType::Tmem => gfxd_sys::arg_type::gfxd_Tmem,
636            ArgType::Tile => gfxd_sys::arg_type::gfxd_Tile,
637            ArgType::Fmt => gfxd_sys::arg_type::gfxd_Fmt,
638            ArgType::Siz => gfxd_sys::arg_type::gfxd_Siz,
639            ArgType::Dim => gfxd_sys::arg_type::gfxd_Dim,
640            ArgType::Cm => gfxd_sys::arg_type::gfxd_Cm,
641            ArgType::Tm => gfxd_sys::arg_type::gfxd_Tm,
642            ArgType::Ts => gfxd_sys::arg_type::gfxd_Ts,
643            ArgType::Dxt => gfxd_sys::arg_type::gfxd_Dxt,
644            ArgType::Tag => gfxd_sys::arg_type::gfxd_Tag,
645            ArgType::Pm => gfxd_sys::arg_type::gfxd_Pm,
646            ArgType::Colorpart => gfxd_sys::arg_type::gfxd_Colorpart,
647            ArgType::Color => gfxd_sys::arg_type::gfxd_Color,
648            ArgType::Lodfrac => gfxd_sys::arg_type::gfxd_Lodfrac,
649            ArgType::Cimg => gfxd_sys::arg_type::gfxd_Cimg,
650            ArgType::Zimg => gfxd_sys::arg_type::gfxd_Zimg,
651            ArgType::Ac => gfxd_sys::arg_type::gfxd_Ac,
652            ArgType::Ad => gfxd_sys::arg_type::gfxd_Ad,
653            ArgType::Cd => gfxd_sys::arg_type::gfxd_Cd,
654            ArgType::Ccpre => gfxd_sys::arg_type::gfxd_Ccpre,
655            ArgType::Ccmuxa => gfxd_sys::arg_type::gfxd_Ccmuxa,
656            ArgType::Ccmuxb => gfxd_sys::arg_type::gfxd_Ccmuxb,
657            ArgType::Ccmuxc => gfxd_sys::arg_type::gfxd_Ccmuxc,
658            ArgType::Ccmuxd => gfxd_sys::arg_type::gfxd_Ccmuxd,
659            ArgType::Acmuxabd => gfxd_sys::arg_type::gfxd_Acmuxabd,
660            ArgType::Acmuxc => gfxd_sys::arg_type::gfxd_Acmuxc,
661            ArgType::Cv => gfxd_sys::arg_type::gfxd_Cv,
662            ArgType::Tc => gfxd_sys::arg_type::gfxd_Tc,
663            ArgType::Cyc => gfxd_sys::arg_type::gfxd_Cyc,
664            ArgType::Zs => gfxd_sys::arg_type::gfxd_Zs,
665            ArgType::Ck => gfxd_sys::arg_type::gfxd_Ck,
666            ArgType::Keyscale => gfxd_sys::arg_type::gfxd_Keyscale,
667            ArgType::Keywidth => gfxd_sys::arg_type::gfxd_Keywidth,
668            ArgType::Zi => gfxd_sys::arg_type::gfxd_Zi,
669            ArgType::Rm1 => gfxd_sys::arg_type::gfxd_Rm1,
670            ArgType::Rm2 => gfxd_sys::arg_type::gfxd_Rm2,
671            ArgType::Sc => gfxd_sys::arg_type::gfxd_Sc,
672            ArgType::Td => gfxd_sys::arg_type::gfxd_Td,
673            ArgType::Tf => gfxd_sys::arg_type::gfxd_Tf,
674            ArgType::Tl => gfxd_sys::arg_type::gfxd_Tl,
675            ArgType::Tt => gfxd_sys::arg_type::gfxd_Tt,
676            ArgType::Tp => gfxd_sys::arg_type::gfxd_Tp,
677            ArgType::Line => gfxd_sys::arg_type::gfxd_Line,
678            ArgType::Vtx => gfxd_sys::arg_type::gfxd_Vtx,
679            ArgType::Vtxflag => gfxd_sys::arg_type::gfxd_Vtxflag,
680            ArgType::Dl => gfxd_sys::arg_type::gfxd_Dl,
681            ArgType::Zraw => gfxd_sys::arg_type::gfxd_Zraw,
682            ArgType::Dlflag => gfxd_sys::arg_type::gfxd_Dlflag,
683            ArgType::Cr => gfxd_sys::arg_type::gfxd_Cr,
684            ArgType::Num => gfxd_sys::arg_type::gfxd_Num,
685            ArgType::Fogz => gfxd_sys::arg_type::gfxd_Fogz,
686            ArgType::Fogp => gfxd_sys::arg_type::gfxd_Fogp,
687            ArgType::Mtxptr => gfxd_sys::arg_type::gfxd_Mtxptr,
688            ArgType::Gm => gfxd_sys::arg_type::gfxd_Gm,
689            ArgType::Mwo_matrix => gfxd_sys::arg_type::gfxd_Mwo_matrix,
690            ArgType::Linewd => gfxd_sys::arg_type::gfxd_Linewd,
691            ArgType::Uctext => gfxd_sys::arg_type::gfxd_Uctext,
692            ArgType::Ucdata => gfxd_sys::arg_type::gfxd_Ucdata,
693            ArgType::Size => gfxd_sys::arg_type::gfxd_Size,
694            ArgType::Lookatptr => gfxd_sys::arg_type::gfxd_Lookatptr,
695            ArgType::Mtxparam => gfxd_sys::arg_type::gfxd_Mtxparam,
696            ArgType::Mtxstack => gfxd_sys::arg_type::gfxd_Mtxstack,
697            ArgType::Mwo_point => gfxd_sys::arg_type::gfxd_Mwo_point,
698            ArgType::Wscale => gfxd_sys::arg_type::gfxd_Wscale,
699            ArgType::Seg => gfxd_sys::arg_type::gfxd_Seg,
700            ArgType::Segptr => gfxd_sys::arg_type::gfxd_Segptr,
701            ArgType::Lightsn => gfxd_sys::arg_type::gfxd_Lightsn,
702            ArgType::Numlights => gfxd_sys::arg_type::gfxd_Numlights,
703            ArgType::Lightnum => gfxd_sys::arg_type::gfxd_Lightnum,
704            ArgType::Lightptr => gfxd_sys::arg_type::gfxd_Lightptr,
705            ArgType::Tcscale => gfxd_sys::arg_type::gfxd_Tcscale,
706            ArgType::Switch => gfxd_sys::arg_type::gfxd_Switch,
707            ArgType::St => gfxd_sys::arg_type::gfxd_St,
708            ArgType::Stdelta => gfxd_sys::arg_type::gfxd_Stdelta,
709            ArgType::Vtxptr => gfxd_sys::arg_type::gfxd_Vtxptr,
710            ArgType::Vpptr => gfxd_sys::arg_type::gfxd_Vpptr,
711            ArgType::Dram => gfxd_sys::arg_type::gfxd_Dram,
712            ArgType::Sftlo => gfxd_sys::arg_type::gfxd_Sftlo,
713            ArgType::Othermodelo => gfxd_sys::arg_type::gfxd_Othermodelo,
714            ArgType::Sfthi => gfxd_sys::arg_type::gfxd_Sfthi,
715            ArgType::Othermodehi => gfxd_sys::arg_type::gfxd_Othermodehi,
716            ArgType::Mw => gfxd_sys::arg_type::gfxd_Mw,
717            ArgType::Mwo => gfxd_sys::arg_type::gfxd_Mwo,
718            ArgType::Mwo_clip => gfxd_sys::arg_type::gfxd_Mwo_clip,
719            ArgType::Mwo_lightcol => gfxd_sys::arg_type::gfxd_Mwo_lightcol,
720            ArgType::Mv => gfxd_sys::arg_type::gfxd_Mv,
721            ArgType::Mvo => gfxd_sys::arg_type::gfxd_Mvo,
722            ArgType::Dmem => gfxd_sys::arg_type::gfxd_Dmem,
723            ArgType::Dmaflag => gfxd_sys::arg_type::gfxd_Dmaflag,
724        }
725    }
726}
727
728pub struct IntoArgTypeError;
729
730impl TryFrom<u32> for ArgType {
731    type Error = IntoArgTypeError;
732
733    fn try_from(value: u32) -> Result<Self, Self::Error> {
734        Self::from_u32(value).ok_or(IntoArgTypeError)
735    }
736}
737
738impl From<ArgType> for u32 {
739    fn from(value: ArgType) -> Self {
740        value.to_u32()
741    }
742}