lalloc-x11.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "lib9.h"
  2. #include "image.h"
  3. #include "memimage.h"
  4. #include "memlayer.h"
  5. #include "../memimage/xmem.h"
  6. static ulong colorword;
  7. static Memdata colordata = {
  8. nil,
  9. &colorword
  10. };
  11. static Memimage paint =
  12. {
  13. { 0, 0, 1, 1 },
  14. { -1000000, -1000000, 10000000, 1000000 },
  15. 0,
  16. 1,
  17. &colordata,
  18. 0,
  19. 1,
  20. 0,
  21. };
  22. static Memimage *xpaint;
  23. static void
  24. setcolor(int val, int ldepth)
  25. {
  26. int bpp;
  27. paint.ldepth = ldepth;
  28. bpp = 1<<ldepth;
  29. val &= ~(0xFF>>bpp);
  30. /* color is now in low part of word; replicate through pixel */
  31. for(; bpp<32; bpp<<=1)
  32. val |= val<<bpp;
  33. colorword = val;
  34. }
  35. ulong*
  36. makememones(void)
  37. {
  38. Xmem *xm;
  39. extern Memimage screenimage;
  40. extern void drawreset();
  41. if(memones->X)
  42. return;
  43. drawreset();
  44. /* set up screen pixmap */
  45. xm = malloc(sizeof(Xmem));
  46. if(xm == nil){
  47. print("can't alloc for screen pixmap\n");
  48. return;
  49. }
  50. if(screenimage.ldepth == 0)
  51. xm->pmid0 = xscreenid;
  52. else
  53. xm->pmid0 = PMundef;
  54. xm->pmid = xscreenid;
  55. xm->wordp = &xm->word;
  56. screenimage.X = xm;
  57. screenimage.data->data = &xm->word;
  58. memones = allocmemimage(paint.r, paint.ldepth);
  59. memones->clipr = paint.clipr;
  60. memones->repl = 1;
  61. memfillcolor(memones, ~0);
  62. return screenimage.data->data;
  63. }
  64. Memimage*
  65. memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, int val)
  66. {
  67. Memimage *n;
  68. Memlayer *l;
  69. Xmem *xm, *sxm;
  70. n = malloc(sizeof(Memimage));
  71. if(n == nil)
  72. return nil;
  73. l = malloc(sizeof(Memlayer));
  74. if(l == nil){
  75. free(n);
  76. return nil;
  77. }
  78. xm = malloc(sizeof(Xmem));
  79. if(xm == nil){
  80. free(l);
  81. free(n);
  82. return nil;
  83. }
  84. if(refreshfn) {
  85. l->save = nil;
  86. }
  87. else{
  88. l->save = allocmemimage(screenr, s->image->ldepth);
  89. if(l->save == nil){
  90. free(l);
  91. free(n);
  92. free(xm);
  93. return nil;
  94. }
  95. /* allocmemimage doesn't initialize memory; this paints save area */
  96. if(val >= 0)
  97. memfillcolor(l->save, val);
  98. }
  99. n->r = screenr;
  100. n->clipr = screenr;
  101. n->ldepth = s->image->ldepth;
  102. n->repl = 0;
  103. n->data = s->image->data;
  104. n->zero = s->image->zero;
  105. n->width = s->image->width;
  106. n->layer = l;
  107. n->X = xm;
  108. sxm = s->image->X;
  109. xm->pmid0 = sxm->pmid0;
  110. xm->pmid = sxm->pmid;
  111. xm->flag = 0;
  112. xm->wordp = sxm->wordp;
  113. l->screen = s;
  114. l->refreshfn = refreshfn;
  115. l->screenr = screenr;
  116. l->delta = Pt(0,0);
  117. /* start with new window behind all existing ones */
  118. l->front = s->rearmost;
  119. l->rear = nil;
  120. if(s->rearmost)
  121. s->rearmost->layer->rear = n;
  122. s->rearmost = n;
  123. if(s->frontmost == nil)
  124. s->frontmost = n;
  125. l->clear = 0;
  126. /* don't set it until we're done */
  127. l->refreshptr = nil;
  128. /* now pull new window to front */
  129. memltofront(n);
  130. /* now we're done */
  131. l->refreshptr = refreshptr;
  132. /*
  133. * paint with requested color.
  134. * previously exposed areas are already right
  135. * if this window has backing store, but just painting
  136. * the whole thing is simplest.
  137. */
  138. if(val >= 0){
  139. setcolor(val, s->image->ldepth);
  140. if(xpaint == nil){
  141. xpaint = allocmemimage(paint.r, paint.ldepth);
  142. if(xpaint == nil) {
  143. if(l->save != nil)
  144. freememimage(l->save);
  145. free(l);
  146. free(n);
  147. free(xm);
  148. return nil;
  149. }
  150. xpaint->clipr = paint.clipr;
  151. xpaint->repl = 1;
  152. }
  153. ((Xmem*)(xpaint->X))->word = colorword;
  154. ((Xmem*)(xpaint->X))->flag |= XXonepixel;
  155. memfillcolor(xpaint, val);
  156. memdraw(n, n->r, xpaint, n->r.min, memones, n->r.min, S);
  157. }
  158. return n;
  159. }