colors.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <event.h>
  5. int nbit, npix;
  6. Image *pixel;
  7. Rectangle crect[256];
  8. Image *color[256];
  9. void
  10. eresized(int new)
  11. {
  12. int x, y, i, n, nx, ny;
  13. Rectangle r, b;
  14. if(new && getwindow(display, Refnone) < 0){
  15. fprint(2, "colors: can't reattach to window: %r\n");
  16. exits("resized");
  17. }
  18. if(screen->depth > 8){
  19. n = 256;
  20. nx = 16;
  21. }else{
  22. n = 1<<screen->depth;
  23. nx = 1<<(screen->depth/2);
  24. }
  25. ny = n/nx;
  26. draw(screen, screen->r, display->white, nil, ZP);
  27. r = insetrect(screen->r, 5);
  28. r.min.y+=20;
  29. b.max.y=r.min.y;
  30. for(i=n-1, y=0; y!=ny; y++){
  31. b.min.y=b.max.y;
  32. b.max.y=r.min.y+(r.max.y-r.min.y)*(y+1)/ny;
  33. b.max.x=r.min.x;
  34. for(x=0; x!=nx; x++, --i){
  35. b.min.x=b.max.x;
  36. b.max.x=r.min.x+(r.max.x-r.min.x)*(x+1)/nx;
  37. crect[i]=insetrect(b, 1);
  38. draw(screen, crect[i], color[i], nil, ZP);
  39. }
  40. }
  41. flushimage(display, 1);
  42. }
  43. char *buttons[] =
  44. {
  45. "exit",
  46. 0
  47. };
  48. ulong
  49. grey(int i)
  50. {
  51. if(i < 0)
  52. return grey(0);
  53. if(i > 255)
  54. return grey(255);
  55. return (i<<16)+(i<<8)+i;
  56. }
  57. Menu menu =
  58. {
  59. buttons
  60. };
  61. int
  62. dither[16] = {
  63. 0, 8, 2, 10,
  64. 12, 4, 14, 6,
  65. 3, 11, 1, 9,
  66. 15, 7, 13, 5
  67. };
  68. void
  69. main(int argc, char *argv[])
  70. {
  71. Point p;
  72. Mouse m;
  73. int i, j, k, l, n, ramp, prev;
  74. char buf[100];
  75. char *fmt;
  76. Image *dark;
  77. ulong rgb;
  78. ramp = 0;
  79. fmt = "index %3d r %3lud g %3lud b %3lud 0x%.8luX ";
  80. ARGBEGIN{
  81. default:
  82. goto Usage;
  83. case 'x':
  84. fmt = "index %2luX r %3luX g %3luX b %3luX 0x%.8luX ";
  85. break;
  86. case 'r':
  87. ramp = 1;
  88. break;
  89. }ARGEND
  90. if(argc){
  91. Usage:
  92. fprint(2, "Usage: %s [-rx]\n", argv0);
  93. exits("usage");
  94. }
  95. if(initdraw(nil, nil, "colors") < 0)
  96. sysfatal("initdraw failed: %r");
  97. einit(Emouse);
  98. for(i=0; i<256; i++){
  99. if(ramp){
  100. if(screen->chan == CMAP8){
  101. /* dither the fine grey */
  102. j = i-(i%17);
  103. dark = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(j)<<8)+0xFF);
  104. color[i] = allocimage(display, Rect(0,0,4,4), screen->chan, 1, (grey(j+17)<<8)+0xFF);
  105. for(j=0; j<16; j++){
  106. k = j%4;
  107. l = j/4;
  108. if(dither[j] > (i%17))
  109. draw(color[i], Rect(k, l, k+1, l+1), dark, nil, ZP);
  110. }
  111. freeimage(dark);
  112. }else
  113. color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(i)<<8)+0xFF);
  114. }else
  115. color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (cmap2rgb(i)<<8)+0xFF);
  116. if(color[i] == nil)
  117. sysfatal("can't allocate image: %r");
  118. }
  119. eresized(0);
  120. prev = -1;
  121. for(;;){
  122. m = emouse();
  123. switch(m.buttons){
  124. case 1:
  125. while(m.buttons){
  126. if(screen->depth > 8)
  127. n = 256;
  128. else
  129. n = 1<<screen->depth;
  130. for(i=0; i!=n; i++)
  131. if(i!=prev && ptinrect(m.xy, crect[i])){
  132. if(ramp)
  133. rgb = grey(i);
  134. else
  135. rgb = cmap2rgb(i);
  136. sprint(buf, fmt,
  137. i,
  138. (rgb>>16)&0xFF,
  139. (rgb>>8)&0xFF,
  140. rgb&0xFF,
  141. (rgb<<8) | 0xFF);
  142. p = addpt(screen->r.min, Pt(2,2));
  143. draw(screen, Rpt(p, addpt(p, stringsize(font, buf))), display->white, nil, p);
  144. string(screen, p, display->black, ZP, font, buf);
  145. prev=i;
  146. break;
  147. }
  148. m = emouse();
  149. }
  150. break;
  151. case 4:
  152. switch(emenuhit(3, &m, &menu)){
  153. case 0:
  154. exits(0);
  155. }
  156. }
  157. }
  158. }