1 module armos.graphics.bitmapfont;
2 import armos.graphics;;
3 import armos.math;
4 
5 /++
6 BitmapFontを描画するclassです.
7 +/
8 class BitmapFont {
9     public{
10         /++
11         +/
12         this(){
13             _image = new armos.graphics.Image;
14         }
15 
16         /++
17             fontのBitmap画像を読み込みます.
18             Params:
19             filename = fontの画像のPathを指定します.
20             fontWidth = フォントの横幅を指定します.
21             fontHeight= フォントの縦幅を指定します.
22         +/
23         BitmapFont load(in string fileName, in int fontWidth, in int fontHeight){
24             _image.load(fileName)
25                   .minMagFilter(TextureMinFilter.Nearest, TextureMagFilter.Nearest);
26             width = fontWidth;
27             height = fontHeight;
28             return this;
29         };
30 
31         /++
32             読み込まれたFontにより文字を描画します.
33             Params:
34             str = 描画する文字列を指定します.
35             x = 文字列を描画するX座標を指定します.
36             y = 文字列を描画するY座標を指定します.
37             z = 文字列を描画するZ座標を指定します.
38         +/
39         BitmapFont draw(in string str, in int x, in int y, in int z = 0){
40             if(str == ""){return this;}
41 
42             int currentPosition = 0;
43 
44             import std.string;
45             import std.algorithm;
46             import std.conv;
47             import std.array;
48             string[] lines = str.split("\n");
49 
50             armos.graphics.pushMatrix;
51             armos.graphics.translate(x, y, z);
52             foreach (line; lines) {
53                 armos.graphics.pushMatrix;
54                 armos.graphics.translate(0, currentPosition*height, 0);
55                 drawLine(line);
56                 armos.graphics.popMatrix;
57                 currentPosition += 1;
58             }
59             armos.graphics.popMatrix;
60             return this;
61         }
62 
63         /++
64             fontの横幅のプロパティです.
65         +/
66         int width()const{
67             return _size[0];
68         }
69 
70         /++
71             fontの横幅のプロパティです.
72         +/
73         BitmapFont width(in int w){
74             _size[0] = w;
75             return this;
76         }
77 
78         /++
79             fontの縦幅のプロパティです.
80         +/
81         int height()const{
82             return _size[1];
83         }
84 
85         /++
86             fontの縦幅のプロパティです.
87         +/
88         BitmapFont height(in int h){
89             _size[1] = h;
90             return this;
91         }
92 
93         /++
94             tab幅のプロパティです.
95         +/
96         int tabWidth= 4;
97 
98         /++
99             文字の位置を左寄せに設定します.
100             Deprecated: 現在動作しません.
101         +/
102         BitmapFont alignLeft(){_align = armos.graphics.TextAlign.Left;return this;}
103         /++
104             文字の位置を中央寄せに設定します.
105             Deprecated: 現在動作しません.
106         +/
107         BitmapFont alignCenter(){_align = armos.graphics.TextAlign.Center;return this;}
108         /++
109             文字の位置を右寄せに設定します.
110             Deprecated: 現在動作しません.
111         +/
112         BitmapFont alignRight(){_align = armos.graphics.TextAlign.Right;return this;}
113 
114         ///
115         Material material(){
116             return _image.material;
117         }
118     }//public
119 
120     private{
121         armos.graphics.Image _image;
122         armos.math.Vector2i _size;
123         armos.graphics.TextAlign _align = armos.graphics.TextAlign.Left;
124 
125         void drawLine(in string str){
126             import std.string;
127             import std.algorithm;
128             import std.conv;
129             import std.array;
130             char[] characters = str.split("").map!(to!char).array;
131             int currentPosition = 0;
132             foreach (character; characters) {
133                 switch (character) {
134                     case '\t':
135                         currentPosition += tabWidth;
136                         break;
137                     default:
138                         drawCharacter(character, currentPosition, 0);
139                         currentPosition += 1;
140                         break;
141                 }
142             }
143         }
144 
145         void drawCharacter(in char character, in int x, in int y){
146             immutable int textureX = character%16*width;
147             immutable int textureY = character/16*height;
148             _image.drawCropped(x*width, y*height, textureX, textureY, textureX+width, textureY+height);
149 
150         }
151     }//private
152 }//class BitmapFont
153 
154 enum TextAlign{
155     Left,
156     Right,
157     Center
158 };