OSDN Git Service

9e01e8b0d4d0659be4ea2098478e3d7161822ff6
[bluetank/bluetank.git] / soft / utils / lcdtool / main.c
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include "bmpimg.h"
5 #include "lcdimg.h"
6
7 int main(int argc, char **argv);
8
9 /**
10  * @brief 独自に規定したキャンバス構造。
11  * @details
12  * このサンプルでは、汎用プラットフォーム向けなのでメモリ上に画像を格納する。
13  */
14 typedef struct {
15     int w;              /**< 横方向サイズ。 */
16     int h;              /**< 縦方向サイズ。 */
17     bmpcol_t *buffer;   /**< バッファへのポインタ。 */
18 } canvas_t;
19
20 /**
21  * @brief ストリームからデータを読み込む。
22  * @details
23  * インターフェースでは、何からどのように読み込むかについて一切感知していない。
24  * この関数では、何からどのように読み込むかについて解決する。
25  *
26  * @param buf バッファへのポインタ。
27  * @param size 読み込みバイトサイズ。
28  * @param extobj ユーザが指定した拡張オブジェクト。
29  */
30 int func_fread(void *buf, const unsigned int size, void *extobj)
31 {
32     FILE *fp = (FILE *)extobj;
33     return fread(buf, size, 1, fp);
34 }
35
36 /**
37  * @brief ストリームへデータを書き込む。
38  * @details
39  * インターフェースでは、何にどのように書き込むかについて一切感知していない。
40  * この関数では、何にどのように書き込むかについて解決する。
41  *
42  * @param buf バッファへのポインタ。
43  * @param size 書き込みバイトサイズ。
44  * @param extobj ユーザが指定した拡張オブジェクト。
45  */
46 int func_fwrite(const void *buf, const unsigned int size, void *extobj)
47 {
48     FILE *fp = (FILE *)extobj;
49     return fwrite(buf, size, 1, fp);
50 }
51
52 /**
53  * @brief ピクセル値を書き込む。
54  * @details
55  * インターフェースでは、何にどのように書き込むかについて一切感知していない。
56  * この関数では、何にどのように書き込むかについて解決する。
57  *
58  * @param x X座標。
59  * @param y Y座標。
60  * @param r 赤。
61  * @param g 緑。
62  * @param b 青。
63  * @param extobj ユーザが指定した拡張オブジェクト。
64  */
65 void func_pixel_write(const int x, const int y, const uint8_t r, const uint8_t g, const uint8_t b, void *extobj)
66 {
67     canvas_t *canvas = (canvas_t *)extobj;
68     bmpcol_t *buffer = canvas->buffer + (canvas->w * y) + x;
69     buffer->r = r;
70     buffer->g = g;
71     buffer->b = b;
72 }
73
74 /**
75  * @brief ピクセル値を読み込む。
76  * @details
77  * インターフェースでは、何からどのように読み込むかについて一切感知していない。
78  * この関数では、何からどのように読み込むかについて解決する。
79  *
80  * @param x X座標。
81  * @param y Y座標。
82  * @param r 赤。
83  * @param g 緑。
84  * @param b 青。
85  * @param extobj ユーザが指定した拡張オブジェクト。
86  */
87 void func_pixel_read(const int x, const int y, uint8_t *r, uint8_t *g, uint8_t *b, void *extobj)
88 {
89     canvas_t *canvas = (canvas_t *)extobj;
90     bmpcol_t *buffer = canvas->buffer + (canvas->w * y) + x;
91     *r = buffer->r;
92     *g = buffer->g;
93     *b = buffer->b;
94 }
95
96 void lcdimg_drawer(const int px, const int py, bool on, void *extobj)
97 {
98     canvas_t *canvas = (canvas_t *)extobj;
99     bmpcol_t *buffer = canvas->buffer + (canvas->w * py) + px;
100     buffer->r = on ? 255 : 16;
101     buffer->g = on ? 255 : 16;
102     buffer->b = on ? 255 : 16;
103 }
104
105 int main(int argc, char **argv)
106 {
107     const int imgw = 800;
108     const int imgh = 600;
109     canvas_t canvas;
110     bmpimg_t bmpimg;
111     LCDIMG *lcdimg;
112     FILE *fp;
113
114     /*
115      * 画像ピクセルを格納する領域を確保する。
116      */
117     canvas.w = imgw;
118     canvas.h = imgh;
119     canvas.buffer = (bmpcol_t *)malloc(sizeof(bmpcol_t) * imgw * imgh);
120
121     /*
122      * 開始処理。
123      *
124      * ピクセル入出力関数を渡して初期化する。
125      * ユーザが指定可能な拡張オブジェクトに、独自に規定したキャンバスを渡しておく。
126      */
127     bmpimg_open(&bmpimg, imgw, imgh, func_pixel_write, &canvas, func_pixel_read, &canvas);
128
129     lcdimg = lcdimg_open(8, 2);
130     lcdimg_text(lcdimg, 0, 0, 'T');
131     lcdimg_text(lcdimg, 1, 0, 'e');
132     lcdimg_text(lcdimg, 2, 0, 's');
133     lcdimg_text(lcdimg, 3, 0, 't');
134
135     lcdimg_draw(lcdimg, lcdimg_drawer, &canvas);
136
137     fp = fopen("lcdimg.bmp", "wb");
138     if (fp != NULL) {
139         bmpimg_bmp_write(&bmpimg, func_fwrite, fp);
140         fclose(fp);
141     }
142
143     lcdimg_close(lcdimg);
144
145     /*
146      * 終了処理。
147      */
148     bmpimg_close(&bmpimg);
149
150     /*
151      * 画像ピクセルを格納する領域を破棄する。
152      */
153     free(canvas.buffer);
154
155     return 0;
156 }
157