Mercurial > hg > dmlib
comparison ppl.c @ 201:844f38cbff65
Optimize pattern drawing a bit.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 07 Oct 2012 07:54:22 +0300 |
parents | 623e58df95c1 |
children | bed7457cd8da |
comparison
equal
deleted
inserted
replaced
200:b842cc92c787 | 201:844f38cbff65 |
---|---|
198 } | 198 } |
199 | 199 |
200 | 200 |
201 void dmDrawBMTextVAQ(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, va_list ap) | 201 void dmDrawBMTextVAQ(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, va_list ap) |
202 { | 202 { |
203 char *tmp = dm_strdup_vprintf(fmt, ap); | 203 char tmp[512]; |
204 if (tmp != NULL) | 204 vsnprintf(tmp, sizeof(tmp), fmt, ap); |
205 { | 205 dmDrawBMTextConstQ(screen, font, mode, xc, yc, tmp); |
206 dmDrawBMTextConstQ(screen, font, mode, xc, yc, tmp); | |
207 dmFree(tmp); | |
208 } | |
209 } | 206 } |
210 | 207 |
211 | 208 |
212 void dmDrawBMTextQ(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, ...) | 209 void dmDrawBMTextQ(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, ...) |
213 { | 210 { |
340 | 337 |
341 | 338 |
342 #define jmpNMODEffectTable (36) | 339 #define jmpNMODEffectTable (36) |
343 static const char jmpMODEffectTable[jmpNMODEffectTable] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | 340 static const char jmpMODEffectTable[jmpNMODEffectTable] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
344 | 341 |
342 static const char jmpHexTab[16] = "0123456789ABCDEF"; | |
343 | |
344 static inline char dmHexVal(int v) | |
345 { | |
346 return jmpHexTab[v & 15]; | |
347 } | |
348 | |
345 void dmPrintNote(SDL_Surface *screen, int xc, int yc, JSSNote *n) | 349 void dmPrintNote(SDL_Surface *screen, int xc, int yc, JSSNote *n) |
346 { | 350 { |
347 char text[32]; | 351 char text[32]; |
348 char *ptr = text; | 352 char *ptr = text; |
349 | 353 |
350 switch (n->note) | 354 switch (n->note) |
351 { | 355 { |
352 case jsetNotSet: | 356 case jsetNotSet: |
353 sprintf(ptr, "..._"); | 357 strcpy(ptr, "..._"); |
354 break; | 358 break; |
355 case jsetNoteOff: | 359 case jsetNoteOff: |
356 sprintf(ptr, "===_"); | 360 strcpy(ptr, "===_"); |
357 break; | 361 break; |
358 default: | 362 default: |
359 sprintf(ptr, "%s%i_", | 363 sprintf(ptr, "%s%i_", |
360 patNoteTable[n->note % 12], | 364 patNoteTable[n->note % 12], |
361 n->note / 12); | 365 n->note / 12); |
363 } | 367 } |
364 | 368 |
365 ptr += 4; | 369 ptr += 4; |
366 | 370 |
367 if (n->instrument != jsetNotSet) | 371 if (n->instrument != jsetNotSet) |
368 sprintf(ptr, "%.2x_", n->instrument + 1); | 372 { |
373 int v = n->instrument + 1; | |
374 *ptr++ = dmHexVal(v >> 4); | |
375 *ptr++ = dmHexVal(v); | |
376 } | |
369 else | 377 else |
370 sprintf(ptr, ".._"); | 378 { |
371 | 379 *ptr++ = '.'; |
372 ptr += 3; | 380 *ptr++ = '.'; |
381 } | |
382 *ptr++ = '_'; | |
373 | 383 |
374 if (n->volume == jsetNotSet) | 384 if (n->volume == jsetNotSet) |
375 sprintf(ptr, ".._"); | 385 { |
386 *ptr++ = '.'; | |
387 *ptr++ = '.'; | |
388 } | |
376 else | 389 else |
377 if (n->volume >= 0x00 && n->volume <= 0x40) | 390 if (n->volume >= 0x00 && n->volume <= 0x40) |
378 sprintf(ptr, "%.2x_", n->volume); | 391 { |
392 *ptr++ = dmHexVal(n->volume >> 4); | |
393 *ptr++ = dmHexVal(n->volume); | |
394 } | |
379 else | 395 else |
380 { | 396 { |
381 char c; | 397 char c; |
382 switch (n->volume & 0xf0) | 398 switch (n->volume & 0xf0) |
383 { | 399 { |
391 case 0xc0: c = '<'; break; | 407 case 0xc0: c = '<'; break; |
392 case 0xd0: c = '>'; break; | 408 case 0xd0: c = '>'; break; |
393 case 0xe0: c = 'M'; break; | 409 case 0xe0: c = 'M'; break; |
394 default: c = '?'; break; | 410 default: c = '?'; break; |
395 } | 411 } |
396 sprintf(ptr, "%c%x_", c, (n->volume & 0x0f)); | 412 *ptr++ = c; |
397 } | 413 *ptr++ = dmHexVal(n->volume); |
398 | 414 } |
399 ptr += 3; | 415 *ptr++ = '_'; |
400 | 416 |
401 if (n->effect >= 0 && n->effect < jmpNMODEffectTable) | 417 if (n->effect >= 0 && n->effect < jmpNMODEffectTable) |
402 *ptr = jmpMODEffectTable[n->effect]; | 418 *ptr++ = jmpMODEffectTable[n->effect]; |
403 else | 419 else |
404 if (n->effect == jsetNotSet) | 420 *ptr++ = (n->effect == jsetNotSet ? '.' : '?'); |
405 *ptr = '.'; | 421 |
422 if (n->param != jsetNotSet) | |
423 { | |
424 *ptr++ = dmHexVal(n->param >> 4); | |
425 *ptr++ = dmHexVal(n->param); | |
426 } | |
406 else | 427 else |
407 *ptr = '?'; | 428 { |
408 | 429 *ptr++ = '.'; |
409 ptr += 1; | 430 *ptr++ = '.'; |
410 | 431 } |
411 if (n->param != jsetNotSet) | 432 |
412 sprintf(ptr, "%.2x", n->param); | 433 *ptr = 0; |
413 else | |
414 sprintf(ptr, ".."); | |
415 | 434 |
416 dmDrawBMTextConstQ(screen, font, DMD_TRANSPARENT, xc, yc, text); | 435 dmDrawBMTextConstQ(screen, font, DMD_TRANSPARENT, xc, yc, text); |
417 } | 436 } |
418 | 437 |
419 | 438 |