1 /* DooM2D: Midnight on the Firing Line
2 * coded by Ketmar // Invisible Vector <ketmar@ketmar.no-ip.org>
3 * Understanding is not required. Only obedience.
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 module d2dgfx
is aliced
;
29 // ////////////////////////////////////////////////////////////////////////// //
30 public __gshared Color
[256] d2dpal
;
33 public void loadPalette () {
34 auto fl
= openFile("playpal.pal");
35 foreach (immutable idx
; 0..256) {
36 ubyte r
= cast(ubyte)(fl
.readNum
!ubyte()*4);
37 ubyte g
= cast(ubyte)(fl
.readNum
!ubyte()*4);
38 ubyte b
= cast(ubyte)(fl
.readNum
!ubyte()*4);
44 // color 0 is transparent
49 // ////////////////////////////////////////////////////////////////////////// //
50 public final class D2DImage
{
51 private import std
.stdio
: File
;
62 auto fl
= openFile(name
);
65 } catch (Exception
) {}
66 import std
.algorithm
: endsWith
;
67 if (name
.endsWith("_mirrored.vga")) {
68 auto fl
= openFile(name
[0..$-13]~".vga");
72 auto fl
= openFile(name
); // throw error message
75 @property bool valid () const pure nothrow @safe @nogc { /*pragma(inline, true);*/ return (data
!is null && width
> 0 && height
> 0); }
77 Color
opIndex (usize y
, usize x
) { pragma(inline
, true); return (x
< width
&& y
< height ? d2dpal
.ptr
[data
.ptr
[y
*width
+x
]] : Color(0, 0, 0, 0)); }
80 if (tex
!is null) tex
.clear
;
81 //if (img !is null) img.clear;
89 @property TrueColorImage
asTCImage () {
90 if (img
is null && valid
) {
91 img
= new TrueColorImage(width
, height
);
92 auto cols
= img
.imageData
.colors
.ptr
;
93 foreach (int y
; 0..height
) {
94 foreach (int x
; 0..width
) {
95 ubyte c
= data
.ptr
[y
*width
+x
];
97 *cols
= Color(0, 0, 0, 0); // transparent
108 void createGLTex () {
109 if (tex
is null && valid
) tex
= new Texture(asTCImage
, Texture
.Option
.Nearest
);
112 @property Texture
asGLTex () {
113 if (tex
is null && valid
) tex
= new Texture(asTCImage
, Texture
.Option
.Nearest
);
117 // for bottom-up view
118 void drawAtXY (int x
, int y
) {
122 glutils
.drawAtXY(tex
, x
-sx
, y
);
127 void load (File fi
, bool mirrored
) {
128 width
= fi
.readNum
!ushort();
129 height
= fi
.readNum
!ushort();
130 if (width
< 1) assert(0);
131 if (height
< 1) assert(0);
132 sx
= fi
.readNum
!short();
133 sy
= fi
.readNum
!short();
134 data
= new ubyte[width
*height
];
135 fi
.rawReadExact(data
[]);
136 if (mirrored
) mirrorVga();
140 auto nd
= new ubyte[](data
.length
);
141 foreach (int y
; 0..height
) {
142 int npos
= y
*width
+width
-1;
143 foreach (int x
; 0..width
) {
144 nd
[npos
--] = data
[y
*width
+x
];