Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

168 rindas
4.2 KiB

  1. /*
  2. * cacamoir moiré circles effect for libcaca
  3. * Copyright (c) 2004 Sam Hocevar <sam@zoy.org>
  4. * All Rights Reserved
  5. *
  6. * $Id$
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the Do What The Fuck You Want To
  10. * Public License, Version 2, as published by Sam Hocevar. See
  11. * http://sam.zoy.org/wtfpl/COPYING for more details.
  12. */
  13. #include "config.h"
  14. #include "common.h"
  15. #if !defined(__KERNEL__)
  16. # include <math.h>
  17. # include <string.h>
  18. #endif
  19. #include "cucul.h"
  20. #include "caca.h"
  21. /* Virtual buffer size */
  22. #define XSIZ 256
  23. #define YSIZ 256
  24. #define DISCSIZ 512
  25. #define DISCTHICKNESS 96
  26. static unsigned char screen[XSIZ * YSIZ];
  27. static unsigned char disc[DISCSIZ * DISCSIZ];
  28. static void put_disc(int, int);
  29. static void draw_disc(int, char);
  30. static void draw_line(int, int, char);
  31. int main (int argc, char **argv)
  32. {
  33. cucul_canvas_t *cv; caca_display_t *dp;
  34. unsigned int red[256], green[256], blue[256], alpha[256];
  35. cucul_dither_t *dither;
  36. int i, x, y, frame = 0, pause = 0;
  37. cv = cucul_create_canvas(0, 0);
  38. if(!cv)
  39. return 1;
  40. dp = caca_create_display(cv);
  41. if(!dp)
  42. return 1;
  43. caca_set_delay(dp, 20000);
  44. /* Fill various tables */
  45. for(i = 0 ; i < 256; i++)
  46. red[i] = green[i] = blue[i] = alpha[i] = 0;
  47. red[0] = green[0] = blue[0] = 0x777;
  48. red[1] = green[1] = blue[1] = 0xfff;
  49. /* Fill the circle */
  50. for(i = DISCSIZ * 2; i > 0; i -= DISCTHICKNESS)
  51. draw_disc(i, (i / DISCTHICKNESS) % 2);
  52. /* Create a libcucul dither */
  53. dither = cucul_create_dither(8, XSIZ, YSIZ, XSIZ, 0, 0, 0, 0);
  54. /* Main loop */
  55. for(;;)
  56. {
  57. caca_event_t ev;
  58. if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0))
  59. {
  60. switch(ev.data.key.ch)
  61. {
  62. case CACA_KEY_ESCAPE: goto end;
  63. case ' ': pause = !pause;
  64. }
  65. }
  66. if(pause)
  67. goto paused;
  68. memset(screen, 0, XSIZ * YSIZ);
  69. /* Set the palette */
  70. red[0] = 0.5 * (1 + sin(0.05 * frame)) * 0xfff;
  71. green[0] = 0.5 * (1 + cos(0.07 * frame)) * 0xfff;
  72. blue[0] = 0.5 * (1 + cos(0.06 * frame)) * 0xfff;
  73. red[1] = 0.5 * (1 + sin(0.07 * frame + 5.0)) * 0xfff;
  74. green[1] = 0.5 * (1 + cos(0.06 * frame + 5.0)) * 0xfff;
  75. blue[1] = 0.5 * (1 + cos(0.05 * frame + 5.0)) * 0xfff;
  76. cucul_set_dither_palette(dither, red, green, blue, alpha);
  77. /* Draw circles */
  78. x = cos(0.07 * frame + 5.0) * 128.0 + (XSIZ / 2);
  79. y = sin(0.11 * frame) * 128.0 + (YSIZ / 2);
  80. put_disc(x, y);
  81. x = cos(0.13 * frame + 2.0) * 64.0 + (XSIZ / 2);
  82. y = sin(0.09 * frame + 1.0) * 64.0 + (YSIZ / 2);
  83. put_disc(x, y);
  84. frame++;
  85. paused:
  86. cucul_dither_bitmap(cv, 0, 0,
  87. cucul_get_canvas_width(cv),
  88. cucul_get_canvas_height(cv),
  89. dither, screen);
  90. cucul_set_color(cv, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
  91. cucul_putstr(cv, cucul_get_canvas_width(cv) - 30,
  92. cucul_get_canvas_height(cv) - 2,
  93. " -=[ Powered by libcaca ]=- ");
  94. caca_refresh_display(dp);
  95. }
  96. end:
  97. cucul_free_dither(dither);
  98. caca_free_display(dp);
  99. cucul_free_canvas(cv);
  100. return 0;
  101. }
  102. static void put_disc(int x, int y)
  103. {
  104. char *src = ((char*)disc) + (DISCSIZ / 2 - x) + (DISCSIZ / 2 - y) * DISCSIZ;
  105. int i, j;
  106. for(j = 0; j < YSIZ; j++)
  107. for(i = 0; i < XSIZ; i++)
  108. {
  109. screen[i + XSIZ * j] ^= src[i + DISCSIZ * j];
  110. }
  111. }
  112. static void draw_disc(int r, char color)
  113. {
  114. int t, dx, dy;
  115. for(t = 0, dx = 0, dy = r; dx <= dy; dx++)
  116. {
  117. draw_line(dx / 3, dy / 3, color);
  118. draw_line(dy / 3, dx / 3, color);
  119. t += t > 0 ? dx - dy-- : dx;
  120. }
  121. }
  122. static void draw_line(int x, int y, char color)
  123. {
  124. if(x == 0 || y == 0 || y > DISCSIZ / 2)
  125. return;
  126. if(x > DISCSIZ / 2)
  127. x = DISCSIZ / 2;
  128. memset(disc + (DISCSIZ / 2) - x + DISCSIZ * ((DISCSIZ / 2) - y),
  129. color, 2 * x - 1);
  130. memset(disc + (DISCSIZ / 2) - x + DISCSIZ * ((DISCSIZ / 2) + y - 1),
  131. color, 2 * x - 1);
  132. }