水無瀬の部屋 > Programming > sample > cur2cpp > putcpp.cpp |
---|
1: //*********************************************************
2: // プロジェクト: cur2cpp
3: // ファイル名: putcpp.cpp
4: //*********************************************************
5: #include "putcpp.h"
6: #include <filefmt/curfile.h>
7: #include <filefmt/bmpfile.h>
8:
9:
10: //---------------------------------------------------------
11: // マクロ の 定義
12: //---------------------------------------------------------
13: #define DBG_ALLOCNAME "LoadMonochromeCursorFileData"
14: #define CALC_MASK_SIZE( cih ) ((cih).width * (cih).height / CHAR_BIT)
15:
16:
17: //---------------------------------------------------------
18: // ファイルスコープ関数 の 宣言
19: //---------------------------------------------------------
20: static size_t make_code( char *buf, size_t bufsize, const CURSORINFOHEAD *cih, const BITMAPINFOHEADER *bih, const BYTE *maskXOR, const BYTE *maskAND );
21:
22:
23: //*********************************************************
24: // GenerateCode
25: //*********************************************************
26: char *
27: GenerateCode
28: (
29: const CURSORINFOHEAD *cih,
30: const BITMAPINFOHEADER *bih,
31: const BYTE *maskXOR,
32: const BYTE *maskAND
33: )
34: {
35: // パラメタの仮定
36: ASSERT( IsValidReadPtr( cih, sizeof( *cih ) ) );
37: ASSERT( IsValidReadPtr( cih, sizeof( *bih ) ) );
38: ASSERT( IsValidReadPtr( maskXOR, CALC_MASK_SIZE( *cih ) ) );
39: ASSERT( IsValidReadPtr( maskAND, CALC_MASK_SIZE( *cih ) ) );
40:
41: //
42: const size_t count = make_code( null, 0, cih, bih, maskXOR, maskAND );
43: char *buf = (char *)malloc( count * sizeof( *buf ) );
44: if ( !buf )
45: {
46: return buf;
47: }
48:
49: //
50: VERIFY( count == make_code( buf, count, cih, bih, maskXOR, maskAND ) );
51:
52: return buf;
53: }//GenerateCode
54:
55:
56: //******************************************************************************************************************
57: //
58: //******************************************************************************************************************
59: static size_t put_bitmask( char *buf, size_t bufsize, size_t offset, const CURSORINFOHEAD *cih, const char *name, const BYTE *mask );
60: static size_t put_bitmask_line( char *buf, size_t bufsize, size_t offset, const BYTE *mask, int size );
61: static size_t put_bitmask_byte( char *buf, size_t bufsize, size_t offset, const BYTE mask );
62: static size_t put_function( char *buf, size_t bufsize, size_t offset, const CURSORINFOHEAD *cih, const char *nameAND, const char *nameXOR );
63: static size_t put_return( char *buf, size_t bufsize, size_t offset );
64: static size_t put_indent( char *buf, size_t bufsize, size_t offset, int depth );
65:
66:
67: //*********************************************************
68: // make_code
69: //*********************************************************
70: size_t
71: make_code
72: (
73: char *buf,
74: size_t bufsize,
75: const CURSORINFOHEAD *cih,
76: const BITMAPINFOHEADER *bih,
77: const BYTE *maskXOR,
78: const BYTE *maskAND
79: )
80: {
81: // パラメタの仮定
82: ASSERT( buf || (!buf && (0 == bufsize)) );
83: ASSERT( !buf || IsValidStringBufferPtr( buf, bufsize ) );
84: ASSERT( !buf || (DESTROY_TEXT_BUFFER( buf, bufsize ), true) ); // [破壊]
85: ASSERT( IsValidReadPtr( cih, sizeof( *cih ) ) );
86: ASSERT( IsValidReadPtr( cih, sizeof( *bih ) ) );
87: ASSERT( IsValidReadPtr( maskXOR, CALC_MASK_SIZE( *cih ) ) );
88: ASSERT( IsValidReadPtr( maskAND, CALC_MASK_SIZE( *cih ) ) );
89:
90: //
91: size_t count = 0;
92:
93: //
94: count += strputs( buf, bufsize, count, "{" );
95: count += put_return( buf, bufsize, count );
96:
97: //
98: count += strputs( buf, bufsize, count, "#define " );
99: count += strputs( buf, bufsize, count, "m" ); // マクロ名
100: count += strputs( buf, bufsize, count, "( a, b, c, d ) (((((((( 0 a, (((((((( 0 b, (((((((( 0 c, (((((((( 0 d" );
101: count += put_return( buf, bufsize, count );
102:
103: //
104: count += strputs( buf, bufsize, count, "#define X )*2+1" );
105: count += put_return( buf, bufsize, count );
106:
107: //
108: count += strputs( buf, bufsize, count, "#define _ )*2" );
109: count += put_return( buf, bufsize, count );
110:
111: // ビットパーターン配列を生成する
112: count += put_bitmask( buf, bufsize, count, cih, "maskAND", maskAND );
113: count += put_bitmask( buf, bufsize, count, cih, "maskXOR", maskXOR );
114:
115: //
116: count += strputs( buf, bufsize, count, "#undef " );
117: count += strputs( buf, bufsize, count, "m" ); // マクロ名
118: count += put_return( buf, bufsize, count );
119:
120: //
121: count += strputs( buf, bufsize, count, "#undef X" );
122: count += put_return( buf, bufsize, count );
123:
124: //
125: count += strputs( buf, bufsize, count, "#undef _" );
126: count += put_return( buf, bufsize, count );
127:
128: // 一行あける
129: count += put_return( buf, bufsize, count );
130:
131: // 関数 CreateCursor() の呼び出しを生成する
132: count += put_function( buf, bufsize, count, cih, "maskAND", "maskXOR" );
133:
134: //
135: count += strputs( buf, bufsize, count, "}" );
136: count += put_return( buf, bufsize, count );
137:
138: //
139: if ( buf && (count < bufsize) ) { buf[ count ] = '\0'; }
140: if ( !buf || (count < bufsize) ) { ++count; }
141:
142: //
143: ASSERT( !buf || IsValidStringPtr( buf ) );
144: ASSERT( !buf || (count == 1 + strlen( buf )) || (0 == bufsize) );
145: ASSERT( !buf || (count == make_code( null, 0, cih, bih, maskXOR, maskAND )) );
146: return count;
147: }//make_code
148:
149: //*********************************************************
150: // put_bitmask
151: //*********************************************************
152: static
153: size_t
154: put_bitmask
155: (
156: char *buf,
157: size_t bufsize,
158: size_t offset,
159: const CURSORINFOHEAD *cih,
160: const char *name,
161: const BYTE *mask
162: )
163: {
164: // パラメタの仮定
165: ASSERT( !buf || (offset < bufsize) );
166: ASSERT( buf || (!buf && (0 == bufsize)) );
167: ASSERT( !buf || IsValidStringBufferPtr( buf, bufsize ) );
168: ASSERT( !buf || (DESTROY_TEXT_BUFFER( buf + offset, bufsize - offset ), true) ); // [破壊]
169: ASSERT( IsValidReadPtr( cih, sizeof( *cih ) ) );
170: ASSERT( IsValidStringPtr( name ) );
171: ASSERT( IsValidReadPtr( mask, CALC_MASK_SIZE( *cih ) ) );
172:
173: //
174: size_t count = 0;
175:
176: //
177: int depth = 1;
178:
179: //
180: count += put_indent( buf, bufsize, offset + count, depth ); //
181: count += strputs( buf, bufsize, offset + count, "const BYTE " ); //
182: count += strputs( buf, bufsize, offset + count, name ); // 配列名
183: count += strputs( buf, bufsize, offset + count, "[ ] = " ); //
184: count += put_return( buf, bufsize, offset + count );
185:
186: //
187: ++depth;
188:
189: //
190: count += put_indent( buf, bufsize, offset + count, depth );
191: count += strputs( buf, bufsize, offset + count, "{" );
192: count += put_return( buf, bufsize, offset + count );
193:
194: //
195: ++depth;
196:
197: // 行は逆順に入っている
198: {for( int i = cih->height; 0 < i; --i )
199: {
200: const int line_byte = cih->width / CHAR_BIT; // 1行のバイト数を求める
201: const int line_offset = (i - 1) * line_byte;
202:
203: ASSERT( (0 <= line_offset) && (line_offset < CALC_MASK_SIZE( *cih )) );
204:
205: count += put_indent( buf, bufsize, offset + count, depth );
206: count += put_bitmask_line( buf, bufsize, offset + count, mask + line_offset, line_byte );
207: count += strputs( buf, bufsize, offset + count, ", " );
208: count += put_return( buf, bufsize, offset + count );
209: }}
210:
211: //
212: --depth;
213:
214: //
215: count += put_indent( buf, bufsize, offset + count, depth );
216: count += strputs( buf, bufsize, offset + count, "};" );
217: count += put_return( buf, bufsize, offset + count );
218:
219: //
220: ASSERT( !buf || (count == put_bitmask( null, 0, offset, cih, name, mask )) );
221: return count;
222: }//put_bitmask
223:
224: //*********************************************************
225: // put_bitmask_line
226: //*********************************************************
227: static
228: size_t
229: put_bitmask_line
230: (
231: char *buf,
232: size_t bufsize,
233: size_t offset,
234: const BYTE *mask,
235: int size
236: )
237: {
238: // パラメタの仮定
239: ASSERT( !buf || (offset < bufsize) );
240: ASSERT( buf || (!buf && (0 == bufsize)) );
241: ASSERT( !buf || IsValidStringBufferPtr( buf, bufsize ) );
242: ASSERT( !buf || (DESTROY_TEXT_BUFFER( buf + offset, bufsize - offset ), true) ); // [破壊]
243: ASSERT( 0 < size );
244: ASSERT( IsValidReadPtr( mask, size ) );
245:
246: //
247: size_t count = 0;
248:
249: //
250: count += strputs( buf, bufsize, offset + count, "m" ); // マクロ名
251: count += strputs( buf, bufsize, offset + count, "( " );
252:
253: //
254: const char *separetor = "";
255: {for( int i = 0; i < size; ++i )
256: {
257: count += strputs( buf, bufsize, offset + count, separetor );
258: count += put_bitmask_byte( buf, bufsize, offset + count, mask[ i ] );
259:
260: separetor = ",";
261: }}
262:
263: //
264: count += strputs( buf, bufsize, offset + count, " )" );
265:
266: ASSERT( !buf || (count == put_bitmask_line( null, 0, offset, mask, size )) );
267: return count;
268: }//put_bitmask_line
269:
270: //*********************************************************
271: // put_bitmask_byte
272: //*********************************************************
273: static
274: size_t
275: put_bitmask_byte
276: (
277: char *buf,
278: size_t bufsize,
279: size_t offset,
280: const BYTE mask
281: )
282: {
283: // パラメタの仮定
284: ASSERT( !buf || (offset < bufsize) );
285: ASSERT( buf || (!buf && (0 == bufsize)) );
286: ASSERT( !buf || IsValidStringBufferPtr( buf, bufsize ) );
287: ASSERT( !buf || (DESTROY_TEXT_BUFFER( buf + offset, bufsize - offset ), true) ); // [破壊]
288:
289: //
290: size_t count = 0;
291:
292: //
293: const char *separetor = "";
294: {for( int i = CHAR_BIT; 0 < i; --i )
295: {
296: count += strputs( buf, bufsize, offset + count, separetor );
297:
298: //
299: const bool bit = (0 != (mask & (1 << (i - 1))));
300: count += strputs( buf, bufsize, offset + count, bit ? "X" : "_" );
301:
302: separetor = " ";
303: }}
304:
305: ASSERT( !buf || (count == put_bitmask_byte( null, 0, offset, mask )) );
306: return count;
307: }//put_bitmask_byte
308:
309: //*********************************************************
310: // put_function
311: //*********************************************************
312: static
313: size_t
314: put_function
315: (
316: char *buf,
317: size_t bufsize,
318: size_t offset,
319: const CURSORINFOHEAD *cih, // 関数 CreateCursor() に作成させるカーソルの情報
320: const char *nameAND, // 関数 CreateCursor() の第6引数の名前
321: const char *nameXOR // 関数 CreateCursor() の第7引数の名前
322: )
323: {
324: // パラメタの仮定
325: ASSERT( !buf || (offset < bufsize) );
326: ASSERT( buf || (!buf && (0 == bufsize)) );
327: ASSERT( !buf || IsValidStringBufferPtr( buf, bufsize ) );
328: ASSERT( !buf || (DESTROY_TEXT_BUFFER( buf + offset, bufsize - offset ), true) ); // [破壊]
329: ASSERT( IsValidReadPtr( cih, sizeof( *cih ) ) );
330: ASSERT( IsValidStringPtr( nameAND ) );
331: ASSERT( IsValidStringPtr( nameXOR ) );
332:
333: //
334: size_t count = 0;
335:
336: //
337: int depth = 1;
338:
339: //
340: count += put_indent( buf, bufsize, offset + count, depth );
341: count += strputs( buf, bufsize, offset + count, "return CreateCursor" );
342: count += put_return( buf, bufsize, offset + count );
343:
344: //
345: ++depth;
346:
347: //
348: count += put_indent( buf, bufsize, offset + count, depth );
349: count += strputs( buf, bufsize, offset + count, "(" );
350: count += put_return( buf, bufsize, offset + count );
351:
352: //
353: ++depth;
354:
355: // hInstance
356: count += put_indent( buf, bufsize, offset + count, depth );
357: count += strputs( buf, bufsize, offset + count, "hInstance, // カーソルを作成するモジュールのインスタンス" );
358: count += put_return( buf, bufsize, offset + count );
359:
360: // cih->wHotSpotX
361: {
362: char num[ 32 ];
363: VERIFY( 0 < snprintf( num, numof(num), "%d", cih->wHotSpotX ) );
364: count += put_indent( buf, bufsize, offset + count, depth );
365: count += strputs( buf, bufsize, offset + count, num );
366: count += strputs( buf, bufsize, offset + count, ", // ホットスポットの x 座標" );
367: count += put_return( buf, bufsize, offset + count );
368: }
369:
370: // cih->wHotSpotY
371: {
372: char num[ 32 ];
373: VERIFY( 0 < snprintf( num, numof(num), "%d", cih->wHotSpotY ) );
374: count += put_indent( buf, bufsize, offset + count, depth );
375: count += strputs( buf, bufsize, offset + count, num );
376: count += strputs( buf, bufsize, offset + count, ", // ホットスポットの y 座標" );
377: count += put_return( buf, bufsize, offset + count );
378: }
379:
380: // cih->width
381: {
382: char num[ 32 ];
383: VERIFY( 0 < snprintf( num, numof(num), "%d", cih->width ) );
384: count += put_indent( buf, bufsize, offset + count, depth );
385: count += strputs( buf, bufsize, offset + count, num );
386: count += strputs( buf, bufsize, offset + count, ", // カーソルの幅" );
387: count += put_return( buf, bufsize, offset + count );
388: }
389:
390: // cih->height
391: {
392: char num[ 32 ];
393: VERIFY( 0 < snprintf( num, numof(num), "%d", cih->height ) );
394: count += put_indent( buf, bufsize, offset + count, depth );
395: count += strputs( buf, bufsize, offset + count, num );
396: count += strputs( buf, bufsize, offset + count, ", // カーソルの高さ" );
397: count += put_return( buf, bufsize, offset + count );
398: }
399:
400: // nameAND
401: count += put_indent( buf, bufsize, offset + count, depth );
402: count += strputs( buf, bufsize, offset + count, nameAND );
403: count += strputs( buf, bufsize, offset + count, ", // " );
404: count += put_return( buf, bufsize, offset + count );
405:
406: // nameXOR
407: count += put_indent( buf, bufsize, offset + count, depth );
408: count += strputs( buf, bufsize, offset + count, nameXOR );
409: count += strputs( buf, bufsize, offset + count, " // " );
410: count += put_return( buf, bufsize, offset + count );
411:
412: //
413: --depth;
414:
415: //
416: count += put_indent( buf, bufsize, offset + count, depth );
417: count += strputs( buf, bufsize, offset + count, ");" );
418: count += put_return( buf, bufsize, offset + count );
419:
420: ASSERT( !buf || (count == put_function( null, 0, offset, cih, nameAND, nameXOR )) );
421: return count;
422: }//put_function
423:
424: //*********************************************************
425: // put_indent
426: //*********************************************************
427: static
428: size_t
429: put_indent
430: (
431: char *buf,
432: size_t bufsize,
433: size_t offset,
434: int depth
435: )
436: {
437: // パラメタの仮定
438: ASSERT( !buf || (offset < bufsize) );
439: ASSERT( buf || (!buf && (0 == bufsize)) );
440: ASSERT( !buf || IsValidStringBufferPtr( buf, bufsize ) );
441: ASSERT( !buf || (DESTROY_TEXT_BUFFER( buf + offset, bufsize - offset ), true) ); // [破壊]
442: ASSERT( 0 < depth );
443:
444: //
445: size_t count = 0;
446:
447: //
448: {for( int n = depth; 0 < n; --n )
449: {
450: count += strputs( buf, bufsize, offset + count, "\t" );
451: }}
452:
453: ASSERT( !buf || (count == put_indent( null, 0, offset, depth )) );
454: return count;
455: }//put_indent
456:
457: //*********************************************************
458: // put_return
459: //*********************************************************
460: static
461: size_t
462: put_return
463: (
464: char *buf,
465: size_t bufsize,
466: size_t offset
467: )
468: {
469: // パラメタの仮定
470: ASSERT( !buf || (offset < bufsize) );
471: ASSERT( buf || (!buf && (0 == bufsize)) );
472: ASSERT( !buf || IsValidStringBufferPtr( buf, bufsize ) );
473: ASSERT( !buf || (DESTROY_TEXT_BUFFER( buf + offset, bufsize - offset ), true) ); // [破壊]
474:
475: //
476: size_t count = 0;
477:
478: count += strputs( buf, bufsize, offset + count, "\r\n" );
479:
480: ASSERT( !buf || (count == put_return( null, 0, offset )) );
481: return count;
482: }//put_return
483:
484:
485: //** end **
参照:
水無瀬の部屋 > sample > cur2cpp > putcpp.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/cur2cpp/putcpp_cpp.shtml
>> Amazon.co.jp 『たまゆら童子』 へ
>> 楽天ブックス 『たまゆら童子』 へ