Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
GodDoodle.txt194 linesDownload Raw Back to God
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