hschumann2/TempleOS-Source-Code
0847
1 2#help_index "God;Graphics/Sprite;Sprites"3 4U0 GodDoodleDraw(CTask *task,CDC *dc)5{6 GrBlot(dc,0,0,god.doodle_dc);7 if (Blink) {8 if (god.doodle_done) {9 dc->color=RED;10 GrPrint(dc,(task->pix_width-FONT_WIDTH*29)>>1,11 (task->pix_height-3*FONT_HEIGHT)>>1,12 "Press <ESC> to insert sprite.");13 GrPrint(dc,(task->pix_width-FONT_WIDTH*39)>>1,14 (task->pix_height-3*FONT_HEIGHT)>>1+2*FONT_HEIGHT,15 "Press <SHIFT-ESC> to throw-away sprite.");16 } else {17 dc->color=GREEN;18 GrPrint(dc,(task->pix_width-FONT_WIDTH*25)>>1,19 (task->pix_height-FONT_HEIGHT)>>1,20 "Press <SPACE> repeatedly.");21 }22 }23}24 25U0 GodDoodleSmooth(I64 num)26{27 CDC *dc=DCExt(god.doodle_dc,0,0,28 god.doodle_dc->width-1,god.doodle_dc->height-1);29 I64 i,x,y,x1,y1,c,histogram[16],best,best_cnt,c_old=god.doodle_dc->color;30 for (y=0;y<god.doodle_dc->height;y++)31 for (x=0;x<god.doodle_dc->width;x++) {32 MemSet(histogram,0,sizeof(histogram));33 for (y1=y-num;y1<=y+num;y1++)34 for (x1=x-num;x1<=x+num;x1++) {35 c=GrPeek(dc,x1,y1);36 if (0<=c<=15)37 histogram[c]++;38 }39 best=BLACK;40 best_cnt=-1;41 for (i=0;i<16;i++)42 if (histogram[i]>best_cnt) {43 best=i;44 best_cnt=histogram[i];45 }46 god.doodle_dc->color=best;47 GrPlot(god.doodle_dc,x,y);48 }49 god.doodle_dc->color=c_old;50 DCDel(dc);51}52 53U0 GodDoodleBitsIns(I64 num_bits,I64 n)54{//Insert bits into God doodle bit fifo.55 I64 i;56 for (i=0;i<num_bits;i++) {57 FifoU8Ins(god.doodle_fifo,n&1);58 n>>=1;59 }60}61 62U0 GodDoodleHexIns(U8 *st)63{//Insert hex record into God doodle bit fifo.64 U8 buf[2];65 if (st) {66 buf[1]=0;67 while (*buf=*st++)68 if (Bt(char_bmp_hex_numeric,*buf))69 GodDoodleBitsIns(4,rev_bits_table[Str2I64(buf,16)]>>4);70 }71}72 73I64 GodDoodleBits(I64 num_bits)74{75 U8 b;76 I64 res=0;77 while (num_bits) {78 if (FifoU8Rem(god.doodle_fifo,&b)) {79 res=res<<1+b;80 num_bits--;81 } else {82 god.doodle_ch=GetChar(,FALSE);83 if (god.doodle_ch==CH_ESC||god.doodle_ch==CH_SHIFT_ESC)84 throw;85 else if (god.doodle_ch=='\n') {86 DCFill(god.doodle_dc,WHITE);87 FifoU8Flush(god.doodle_fifo);88 } else if ('0'<=god.doodle_ch<='9')89 GodDoodleSmooth(god.doodle_ch-'0');90 else91 GodDoodleBitsIns(GOD_GOOD_BITS,KbdMsEvtTime>>GOD_BAD_BITS);92 }93 }94 return res;95}96 97public U8 *GodDoodleSprite(U8 *hex=NULL)98{//Make God draw sprite. Holy Spirit Instructions99 I64 i,j,w,h,x,y,ch;100 U8 *elems;101 102 if (god.doodle_dc) return NULL;103 god.doodle_done=FALSE;104 SettingsPush; //See SettingsPush105 AutoComplete;106 WinBorder;107 WinMax;108 109 if (!hex)110 PopUpOk("The Holy Spirit can puppet you.\n\n"111 "Press $GREEN$<SPACE>$FG$ until it finishes.");112 113 god.doodle_ch=0;114 god.doodle_dc=DCNew(Fs->pix_width,Fs->pix_height);115 DCFill(god.doodle_dc,WHITE);116 w=god.doodle_dc->width;117 h=god.doodle_dc->height;118 119 Fs->draw_it=&GodDoodleDraw;120 FifoU8Flush(god.doodle_fifo);121 GodDoodleHexIns(hex);122 try {123 for (i=0;i<3;i++) {124 god.doodle_dc->color=RED;125 for (j=0;j<29;j++)126 switch [GodDoodleBits(3)] {127 case 0:128 GrEllipse3(god.doodle_dc,129 (w-1)*GodDoodleBits(5)/15.5-w/2,130 (h-1)*GodDoodleBits(5)/15.5-h/2,0,131 (w-1)*GodDoodleBits(5)/15.5,(h-1)*GodDoodleBits(5)/15.5);132 break;133 case 1:134 GrCircle3(god.doodle_dc,135 (w-1)*GodDoodleBits(5)/15.5-w/2,136 (h-1)*GodDoodleBits(5)/15.5-h/2,0,137 (w-1)*GodDoodleBits(5)/15.5);138 break;139 case 2:140 GrBorder(god.doodle_dc,141 (w-1)*GodDoodleBits(5)/15.5-w/2,142 (h-1)*GodDoodleBits(5)/15.5-h/2,143 (w-1)*GodDoodleBits(5)/15.5,(h-1)*GodDoodleBits(5)/15.5);144 break;145 case 3...7:146 GrLine3(god.doodle_dc,147 (w-1)*GodDoodleBits(4)/15,(h-1)*GodDoodleBits(4)/15,0,148 (w-1)*GodDoodleBits(4)/15,(h-1)*GodDoodleBits(4)/15,0);149 break;150 }151 for (j=0;j<6;j++) {152 x=(w-1)*GodDoodleBits(5)/31+w/64;153 y=(h-1)*GodDoodleBits(5)/31+h/64;154 switch [GodDoodleBits(2)] {155 case 0: god.doodle_dc->color=BLACK; break;156 case 1: god.doodle_dc->color=DKGRAY; break;157 case 2: god.doodle_dc->color=LTGRAY; break;158 case 3: god.doodle_dc->color=WHITE; break;159 }160 GrFloodFill3(god.doodle_dc,x,y,0);161 }162 GodDoodleSmooth(3);163 }164 god.doodle_done=TRUE;165 if (!hex) {166 do ch=GetChar(,FALSE);167 while (ch!=CH_ESC && ch!=CH_SHIFT_ESC);168 } else169 ch=CH_ESC;170 } catch {171 Fs->catch_except=TRUE;172 ch=CH_SHIFT_ESC;173 }174 DCFill;175 SettingsPop;176 if (ch==CH_ESC)177 elems=DC2Sprite(god.doodle_dc);178 else179 elems=NULL;180 DCDel(god.doodle_dc);181 god.doodle_dc=NULL;182 return elems;183}184 185#help_index "God"186public U0 GodDoodle(U8 *hex=NULL)187{//Make God draw sprite, insert in doc. Holy Spirit Instructions188 U8 *elems;189 if (elems=GodDoodleSprite(hex)) {190 Sprite(elems);191 Free(elems);192 }193}194 