Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
SpriteMain.txt1240 linesDownload Raw Back to Gr
1 2#help_index "Graphics/Sprite;Sprites"3 4#define SPT_MENU        -25#define SPT_INS_SCRN_BITMAP             -36#define SPT_INS_TRANSPARENT_SCRN_BITMAP -47#define SPT_ED_MENU     -58#define SPT_EXIT        -69 10I64 PopUpSpriteMain(CSprite **_head,I64 *_cur_elem_num,11        CDoc *_doc,CDocEntry *_doc_e)12{13  CTask *pu_task;14  I64   res;15  CDoc *doc=DocNew;16  CDocEntry *doc_de;17  U8    *st;18 19  doc_de=DocPrint(doc,"$PURPLE$$TX+CX,\"Sprite Main Menu\"$\n"20        "$LK+PU+CX,\"Click for Help\",A=\"FI:::/Doc/SpriteMain.DD.Z\"$\n"21        "\n$LTBLUE$$DA+M,A=\"Tag Text:%%s\"$\n\n");22  doc_de->data=StrNew(_doc_e->tag,doc->mem_task);23  DocDataFmt(doc,doc_de);24 25  DocPrint(doc,"$MU-UL,\"Color (4-bit)\",LE=SPT_COLOR$\n"26        "$MU-UL,\"Dither Color (4-bit)\",LE=SPT_DITHER_COLOR$\n"27        "$MU-UL,\"Thick\",LE=SPT_THICK$\n"28        "$MU-UL,\"Planar Symmetry\",LE=SPT_PLANAR_SYMMETRY$\n"29        "\n$MU-UL,\"Point\",LE=SPT_PT$\n"30        "$MU-UL,\"Line\",LE=SPT_LINE$\n"31        "$MU-UL,\"Arrow\",LE=SPT_ARROW$\n"32        "$MU-UL,\"Rect\",LE=SPT_RECT$\n"33        "$MU-UL,\"Circle\",LE=SPT_CIRCLE$\n"34        "$MU-UL,\"Ellipse\",LE=SPT_ELLIPSE$\n"35        "$MU-UL,\"Polygon\",LE=SPT_POLYGON$\n"36        "$MU-UL,\"Text\",LE=SPT_TEXT$\n"37        "$MU-UL,\"Text Box\",LE=SPT_TEXT_BOX$\n"38        "$MU-UL,\"Text Diamond\",LE=SPT_TEXT_DIAMOND$\n"39        "$MU-UL,\"Flood Fill\",LE=SPT_FLOOD_FILL$\n"40        "$MU-UL,\"Flood Fill Not Color\",LE=SPT_FLOOD_FILL_NOT$\n"41        "$MU-UL,\"PolyLine\",LE=SPT_POLYLINE$\n"42        "$MU-UL,\"PolyPoint\",LE=SPT_POLYPT$\n"43        "$MU-UL,\"BSpline2\",LE=SPT_BSPLINE2$\n"44        "$MU-UL,\"BSpline3\",LE=SPT_BSPLINE3$\n"45        "$MU-UL,\"BSpline2 Closed\",LE=SPT_BSPLINE2_CLOSED$\n"46        "$MU-UL,\"BSpline3 Closed\",LE=SPT_BSPLINE3_CLOSED$\n"47        "$MU-UL,\"Insert Scrn-Captured BitMap\",LE=SPT_INS_SCRN_BITMAP$\n"48        "$MU-UL,\"Insert Transparent Scrn-Captured BitMap\","49        "LE=SPT_INS_TRANSPARENT_SCRN_BITMAP$\n"50        "$PURPLE$$MU-UL,\"+] Create or Edit 3D Mesh\",LE=SPT_MESH$\n"51        "$MU-UL,\"+] Create or Edit Shiftable 3D Mesh\","52        "LE=SPT_SHIFTABLE_MESH$\n"53        "$MU-UL,\"+] Convert to BitMap or Edit BitMap\","54        "LE=SPT_BITMAP$$LTBLUE$\n"55        "\n$MU-UL,\"Transform On  (for use with 3D icons)\","56        "LE=SPT_TRANSFORM_ON$\n"57        "$MU-UL,\"Transform Off (for use with 3D icons)\","58        "LE=SPT_TRANSFORM_OFF$\n"59        "\n"60        "$PURPLE$$MU-UL,\"+] Sprite Edit Menu\",LE=SPT_ED_MENU$$LTBLUE$\n"61        "$MU-UL,\"Exit  Sprite\",LE=SPT_EXIT$\n"62        "$MU-UL,\"Abort Sprite\",LE=DOCM_CANCEL$\n"63        "\nRight-Click to get back to this menu.");64  st=MStrPrint("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_head,_cur_elem_num);65  PopUp(st,NULL,&pu_task);66  Free(st);67  res=PopUpMenu(doc);68  if (TaskValidate(pu_task)) {69    *_head=SpriteSideBar2SpriteQue(DocPut(pu_task),*_head,_cur_elem_num);70    Kill(pu_task);71  }72  Free(_doc_e->tag);73  _doc_e->tag=StrNew(doc_de->data,_doc->mem_task);74  _doc->cur_col=0;75  DocDel(doc);76  return res;77}78 79Bool PopUpExtents(I64 *_x1,I64 *_x2,I64 *_y1,I64 *_y2)80{81  I64 res;82  CDoc *doc=DocNew;83  CDocEntry *doc_e;84  doc_e=DocPrint(doc,"  $DA,A=\"x1:%%d\"$\n");85  doc_e->data=_x1;86  DocDataFmt(doc,doc_e);87  doc_e=DocPrint(doc,"  $DA,A=\"x2:%%d\"$\n");88  doc_e->data=_x2;89  DocDataFmt(doc,doc_e);90  doc_e=DocPrint(doc,"  $DA,A=\"y1:%%d\"$\n");91  doc_e->data=_y1;92  DocDataFmt(doc,doc_e);93  doc_e=DocPrint(doc,"  $DA,A=\"y2:%%d\"$\n\n");94  doc_e->data=_y2;95  DocDataFmt(doc,doc_e);96 97  DocPrint(doc," $BT,\"Use These Extents\",LE=TRUE$");98  DocPrint(doc,"$CM,3,0$$BT,\"Drag-Out New Extents\",LE=FALSE$\n\n");99  do res=PopUpMenu(doc);100  while (res!=FALSE && res!=TRUE);101  DocDel(doc);102  return res;103}104 105U0 SpriteScrnInit(CDC *dc,I64,I64)106{107//Uses fixed-point.108  I64 xx,yy,old_pen_width=dc->thick;109  CColorROPU32 old_color=dc->color;110  Refresh;111  DCFill(dc);112  if (dc->flags&DCF_SYMMETRY) {113    dc->flags&=~DCF_SYMMETRY;114    dc->thick=1;115    xx=dc->sym.sny*8192;116    yy=-dc->sym.snx*8192;117    dc->color=RED;118    GrLine3(dc,dc->sym.sx-xx.i32[1],dc->sym.sy-yy.i32[1],0,119          dc->sym.sx+xx.i32[1],dc->sym.sy+yy.i32[1],0,3,0);120    dc->color=WHITE;121    GrLine3(dc,dc->sym.sx-xx.i32[1],dc->sym.sy-yy.i32[1],0,122          dc->sym.sx+xx.i32[1],dc->sym.sy+yy.i32[1],0,3,1);123    dc->color=BLACK;124    GrLine3(dc,dc->sym.sx-xx.i32[1],dc->sym.sy-yy.i32[1],0,125          dc->sym.sx+xx.i32[1],dc->sym.sy+yy.i32[1],0,3,2);126    dc->flags|=DCF_SYMMETRY;127  }128  dc->color=old_color;129  dc->thick=old_pen_width;130}131 132CSprite *SMLine(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,CColorROPU32 color)133{134  I64 msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2;135  CSprite *res;136  do {137    dc->color=color&COLORROP_NO_ROP0_MASK;138    GrLine3(dc,x1,y1,0,x2,y2,0);139    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);140    SpriteScrnInit(dc,x,y);141    x2=arg1; y2=arg2;142  } while (msg_code!=MSG_MS_L_UP);143  dc->color=color&COLORROP_NO_ROP0_MASK;144  GrLine3(dc,x1,y1,0,x2,y2,0);145  res=CAlloc(SpriteElemQuedBaseSize(SPT_LINE));146  res->type=SPT_LINE;147  res->pp.x1=x1-x;148  res->pp.y1=y1-y;149  res->pp.x2=x2-x;150  res->pp.y2=y2-y;151  return res;152}153 154CSprite *SMArrow(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,CColorROPU32 color)155{156  I64 msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2;157  CSprite *res;158  do {159    dc->color=color&COLORROP_NO_ROP0_MASK;160    GrArrow3(dc,x1,y1,0,x2,y2,0);161    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);162    SpriteScrnInit(dc,x,y);163    x2=arg1; y2=arg2;164  } while (msg_code!=MSG_MS_L_UP);165  dc->color=color&COLORROP_NO_ROP0_MASK;166  GrArrow3(dc,x1,y1,0,x2,y2,0);167  res=CAlloc(SpriteElemQuedBaseSize(SPT_ARROW));168  res->type=SPT_ARROW;169  res->pp.x1=x1-x;170  res->pp.y1=y1-y;171  res->pp.x2=x2-x;172  res->pp.y2=y2-y;173  return res;174}175 176CSprite *SMPlanarSymmetry(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2)177{178  I64 msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2,old_width,old_flags;179  CSprite *res;180  old_width=dc->thick;181  old_flags=dc->flags;182  dc->flags&=~DCF_SYMMETRY;183  dc->thick=1;184  do {185    dc->color=ROPF_DITHER+WHITE<<16+BLACK;186    GrLine3(dc,x1,y1,0,x2,y2,0);187    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);188    SpriteScrnInit(dc,x,y);189    x2=arg1; y2=arg2;190  } while (msg_code!=MSG_MS_L_UP);191  dc->flags=old_flags&DCF_SYMMETRY|dc->flags&~DCF_SYMMETRY;192  dc->thick=old_width;193  res=CAlloc(SpriteElemQuedBaseSize(SPT_PLANAR_SYMMETRY));194  res->type=SPT_PLANAR_SYMMETRY;195  res->pp.x1=x1-x;196  res->pp.y1=y1-y;197  res->pp.x2=x2-x;198  res->pp.y2=y2-y;199  return res;200}201 202CSprite *SMRect(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,CColorROPU32 color)203{204  I64 msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2,205        xx1=arg1,yy1=arg2,xx2=arg1,yy2=arg2;206  CSprite *res;207  do {208    dc->color=color&COLORROP_NO_ROP0_MASK;209    GrRect3(dc,xx1,yy1,0,xx2-xx1,yy2-yy1);210    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);211    SpriteScrnInit(dc,x,y);212    x2=arg1; y2=arg2;213    if (x2<x1) {214      xx1=x2; xx2=x1;215    } else {216      xx1=x1; xx2=x2;217    }218    if (y2<y1) {219      yy1=y2; yy2=y1;220    } else {221      yy1=y1; yy2=y2;222    }223  } while (msg_code!=MSG_MS_L_UP);224  dc->color=color&COLORROP_NO_ROP0_MASK;225  GrRect3(dc,xx1,yy1,0,xx2-xx1,yy2-yy1);226  res=CAlloc(SpriteElemQuedBaseSize(SPT_RECT));227  res->type=SPT_RECT;228  res->pp.x1=xx1-x;229  res->pp.y1=yy1-y;230  res->pp.x2=xx2-x;231  res->pp.y2=yy2-y;232  return res;233}234 235CSprite *SMScrnBitMap(I64 eletype,CDC *dc,CDC *dc2,I64 x,I64 y,236        I64 arg1,I64 arg2,CColorROPU32 bm_bkcolor)237{238  I64 i,msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2,239        xx1=arg1,yy1=arg2,xx2=arg1,yy2=arg2,old_width;240  CDC *dc3,*img;241  CSprite *res;242  old_width=dc2->thick;243  dc2->thick=1;244  do {245    dc2->color=ROPF_DITHER+WHITE<<16+BLACK;246    GrBorder(dc2,xx1+Fs->pix_left+Fs->scroll_x,yy1+Fs->pix_top+Fs->scroll_y,247          xx2+Fs->pix_left+Fs->scroll_x,yy2+Fs->pix_top+Fs->scroll_y);248    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);249    SpriteScrnInit(dc,x,y);250    x2=arg1; y2=arg2;251    if (x2<x1) {252      xx1=x2; xx2=x1;253    } else {254      xx1=x1; xx2=x2;255    }256    if (y2<y1) {257      yy1=y2; yy2=y1;258    } else {259      yy1=y1; yy2=y2;260    }261  } while (msg_code!=MSG_MS_L_UP);262  xx2++; yy2++;263  res=CAlloc(SpriteElemQuedBaseSize(SPT_BITMAP)+((xx2-xx1+7)&~7)*(yy2-yy1));264  res->type=SPT_BITMAP;265  res->pwhu.width=xx2-xx1;266  res->pwhu.height=yy2-yy1;267  res->pwhu.x1=0;268  res->pwhu.y1=0;269  SpriteScrnInit(dc,x,y);270  i=gr.scrn_zoom;271  GrScaleZoom(1.0/i);272  Refresh(2,TRUE);273 274  dc3=DCScrnCapture;275  img=DCExt(dc3,Fs->pix_left+Fs->scroll_x+xx1,Fs->pix_top+Fs->scroll_y+yy1,276        Fs->pix_left+Fs->scroll_x+xx2-1,Fs->pix_top+Fs->scroll_y+yy2-1);277  if (eletype==SPT_INS_TRANSPARENT_SCRN_BITMAP)278    DCColorChg(img,bm_bkcolor);279  GrScaleZoom(i);280  MemCpy(&res->pwhu.u,img->body,((xx2-xx1+7)&~7)*(yy2-yy1));281  DCDel(img);282  DCDel(dc3);283  dc2->thick=old_width;284  Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS285        -WIF_SELF_BORDER-WIF_SELF_GRAB_SCROLL;286  return res;287}288 289CSprite *SMCircle(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,CColorROPU32 color)290{291  I64 msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2;292  CSprite *res;293  do {294    dc->color=color&COLORROP_NO_ROP0_MASK;295    GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2)));296    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);297    SpriteScrnInit(dc,x,y);298    x2=arg1; y2=arg2;299  } while (msg_code!=MSG_MS_L_UP);300  dc->color=color&COLORROP_NO_ROP0_MASK;301  GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2)));302  res=CAlloc(SpriteElemQuedBaseSize(SPT_CIRCLE));303  res->type=SPT_CIRCLE;304  res->pr.x1=x1-x;305  res->pr.y1=y1-y;306  res->pr.radius=Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2));307  return res;308}309 310CSprite *SMEllipse(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,CColorROPU32 color)311{312  I64 msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2;313  F64 angle1,angle2;314  CSprite *res;315  do {316    dc->color=color&COLORROP_NO_ROP0_MASK;317    GrEllipse3(dc,(x1+x2)>>1,(y1+y2)>>1,0,AbsI64(x1-x2)>>1,AbsI64(y1-y2)>>1);318    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);319    SpriteScrnInit(dc,x,y);320    x2=arg1; y2=arg2;321  } while (msg_code!=MSG_MS_L_UP);322  res=CAlloc(SpriteElemQuedBaseSize(SPT_ELLIPSE));323  res->type=SPT_ELLIPSE;324  res->pwha.x1=(x1+x2)>>1-x;325  res->pwha.y1=(y1+y2)>>1-y;326  res->pwha.width =AbsI64(x1-x2)>>1;327  res->pwha.height=AbsI64(y1-y2)>>1;328  angle2=Arg(x2-(res->pwha.x1+x),y2-(res->pwha.y1+y));329  if (res->pwha.width<res->pwha.height)330    angle2-=pi/2.0;331  do {332    angle1=Arg(x2-(res->pwha.x1+x),y2-(res->pwha.y1+y));333    if (res->pwha.width>=res->pwha.height)334      res->pwha.angle=-(angle1-angle2);335    else336      res->pwha.angle=-(angle1-angle2)+pi/2.0;337    dc->color=color&COLORROP_NO_ROP0_MASK;338    GrEllipse3(dc,res->pwha.x1+x,res->pwha.y1+y,0,339          res->pwha.width,res->pwha.height,res->pwha.angle);340    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);341    SpriteScrnInit(dc,x,y);342    x2=arg1; y2=arg2;343  } while (msg_code!=MSG_MS_L_UP);344  angle1=Arg(x2-(res->pwha.x1+x),y2-(res->pwha.y1+y));345  if (res->pwha.width>=res->pwha.height)346    res->pwha.angle=-(angle1-angle2);347  else348    res->pwha.angle=-(angle1-angle2)+pi/2.0;349  dc->color=color&COLORROP_NO_ROP0_MASK;350  GrEllipse3(dc,res->pwha.x1+x,res->pwha.y1+y,0,351        res->pwha.width,res->pwha.height,res->pwha.angle);352  return res;353}354 355CSprite *SMPolygon(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,I64 sides,356        CColorROPU32 color)357{358  I64 msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2;359  F64 angle1,angle2;360  CSprite *res;361  do {362    dc->color=color&COLORROP_NO_ROP0_MASK;363    GrRegPoly3(dc,(x1+x2)>>1,(y1+y2)>>1,0,364          AbsI64(x1-x2)>>1,AbsI64(y1-y2)>>1,sides);365    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);366    SpriteScrnInit(dc,x,y);367    x2=arg1; y2=arg2;368  } while (msg_code!=MSG_MS_L_UP);369  res=CAlloc(SpriteElemQuedBaseSize(SPT_POLYGON));370  res->type=SPT_POLYGON;371  res->pwhas.x1=(x1+x2)>>1-x;372  res->pwhas.y1=(y1+y2)>>1-y;373  res->pwhas.width =AbsI64(x1-x2)>>1;374  res->pwhas.height=AbsI64(y1-y2)>>1;375  res->pwhas.sides=sides;376  angle2=Arg(x2-(res->pwhas.x1+x),y2-(res->pwhas.y1+y));377  if (res->pwhas.width<res->pwhas.height)378    angle2-=pi/2.0;379  do {380    angle1=Arg(x2-(res->pwhas.x1+x),y2-(res->pwhas.y1+y));381    if (res->pwhas.width>=res->pwhas.height)382      res->pwhas.angle=-(angle1-angle2);383    else384      res->pwhas.angle=-(angle1-angle2)+pi/2.0;385    dc->color=color&COLORROP_NO_ROP0_MASK;386    GrRegPoly3(dc,res->pwhas.x1+x,res->pwhas.y1+y,0,387          res->pwhas.width,res->pwhas.height,388          res->pwhas.sides,res->pwhas.angle);389    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);390    SpriteScrnInit(dc,x,y);391    x2=arg1; y2=arg2;392  } while (msg_code!=MSG_MS_L_UP);393  angle1=Arg(x2-(res->pwhas.x1+x),y2-(res->pwhas.y1+y));394  if (res->pwhas.width>=res->pwhas.height)395    res->pwhas.angle=-(angle1-angle2);396  else397    res->pwhas.angle=-(angle1-angle2)+pi/2.0;398  dc->color=color&COLORROP_NO_ROP0_MASK;399  GrRegPoly3(dc,res->pwhas.x1+x,res->pwhas.y1+y,0,400        res->pwhas.width,res->pwhas.height,res->pwhas.sides,401        res->pwhas.angle);402  return res;403}404 405CSprite *SMPolyLineFamily(I64 eletype,CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,406        CColorROPU32 color)407{408  I64 i,num=0,msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2;409  I32 *ptr;410  CD3I32 *p;411  CSprite *res,*tmpg,*tmpg1,head2;412 413  QueInit(&head2);414  do {415    do {416      dc->color=color&COLORROP_NO_ROP0_MASK;417      if (num)418        GrLine3(dc,x1,y1,0,x2,y2,0);419      msg_code=GetMsg(&arg1,&arg2,420            1<<MSG_MS_L_UP+1<<MSG_MS_MOVE+1<<MSG_MS_R_UP);421      dc->color=TRANSPARENT;422      if (num)423        GrLine3(dc,x1,y1,0,x2,y2,0);424      x2=arg1; y2=arg2;425    } while (msg_code!=MSG_MS_L_UP && msg_code!=MSG_MS_R_UP);426    dc->color=color&COLORROP_NO_ROP0_MASK;427    if (msg_code==MSG_MS_L_UP) {428      if (num)429        GrLine3(dc,x1,y1,0,x2,y2,0);430      res=CAlloc(SpriteElemQuedBaseSize(SPT_PT));431      res->type=SPT_PT;432      res->p.x1=x2-x;433      res->p.y1=y2-y;434      QueIns(res,head2.last);435      x1=x2;y1=y2;436      num++;437    }438  } while (msg_code!=MSG_MS_R_UP);439 440  switch (eletype) {441    case SPT_POLYLINE:442      if (num>1) {443        res=CAlloc(SpriteElemQuedBaseSize(SPT_POLYLINE)+num*sizeof(CD2I32));444        ptr=&res->nu.u;445        tmpg1=head2.next;446        for (i=0;i<num;i++) {447          tmpg=tmpg1->next;448          ptr[i<<1]=tmpg1->p.x1;449          ptr[i<<1+1]=tmpg1->p.y1;450          Free(tmpg1);451          tmpg1=tmpg;452        }453        res->type=SPT_POLYLINE;454        res->nu.num=num;455      } else {456        tmpg1=head2.next;457        for (i=0;i<num;i++) {458          tmpg=tmpg1->next;459          Free(tmpg1);460          tmpg1=tmpg;461        }462        res=NULL;463      }464      break;465    case SPT_BSPLINE2:466    case SPT_BSPLINE3:467    case SPT_BSPLINE2_CLOSED:468    case SPT_BSPLINE3_CLOSED:469      if (num>2) {470        res=CAlloc(SpriteElemQuedBaseSize(eletype)+num*sizeof(CD3I32));471        p=&res->nu.u;472        tmpg1=head2.next;473        for (i=0;i<num;i++) {474          tmpg=tmpg1->next;475          p[i].x=tmpg1->p.x1;476          p[i].y=tmpg1->p.y1;477          Free(tmpg1);478          tmpg1=tmpg;479        }480        res->type=eletype;481        res->nu.num=num;482      } else {483        tmpg1=head2.next;484        for (i=0;i<num;i++) {485          tmpg=tmpg1->next;486          Free(tmpg1);487          tmpg1=tmpg;488        }489        res=NULL;490      }491      break;492  }493  return res;494}495 496CSprite *SMPolyPoint(CDC *dc,I64 x,I64 y,I64 arg1,I64 arg2,CColorROPU32 color)497{498  I64 i,num=0,msg_code,x1=arg1,y1=arg2,x2=arg1,y2=arg2,x3,y3;499  I32 *ptr;500  CSprite *res,*tmpg,*tmpg1,head2;501 502  QueInit(&head2);503  x3=arg1-x; y3=arg2-y;504  dc->color=color&COLORROP_NO_ROP0_MASK;505  do {506    msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);507    x2=arg1; y2=arg2;508    GrLine3(dc,x1,y1,0,x2,y2,0);509    Line(&head2,x1-x,y1-y,0,x2-x,y2-y,0,&SpritePolyPtPlot);510    x1=x2;y1=y2;511  } while (msg_code!=MSG_MS_L_UP);512 513  num=0;514  res=head2.next;515  x1=x3; y1=y3;516  while (res!=&head2) {517    tmpg=res->next;518    if (res->p.x1==x1 && res->p.y1==y1) {519      QueRem(res);520      Free(res);521    } else {522      num++;523      x1=res->p.x1;524      y1=res->p.y1;525    }526    res=tmpg;527  }528 529  res=CAlloc(SpriteElemQuedBaseSize(SPT_POLYPT)+(num*3+7)>>3);530  res->npu.x=x3;531  res->npu.y=y3;532  ptr=&res->npu.u;533  x1=x3; y1=y3;534  i=0;535  tmpg1=head2.next;536  while (tmpg1!=&head2) {537    tmpg=tmpg1->next;538    BFieldOrU32(ptr,i,polypt_map[SignI64(tmpg1->p.x1-x1)+1+539          3*(SignI64(tmpg1->p.y1-y1)+1)]);540    i+=3;541    x1=tmpg1->p.x1;y1=tmpg1->p.y1;542    QueRem(tmpg1);543    Free(tmpg1);544    tmpg1=tmpg;545  }546  res->type=SPT_POLYPT;547  res->npu.num=num;548  return res;549}550 551U0 SMTextFamily(I64 eletype,CDoc *doc,CDocEntry *doc_ce,CSprite *head,CDC *dc,552        I64 x,I64 y,I64 arg1,I64 arg2,CColorROPU32 color,I64 *_cur_elem_num,553        I64 old_de_flags)554{555  CSprite *tmpg,*insert_pt=SpriteSetSettings(,head,*_cur_elem_num);556  I64 msg_code,x1,y1;557  U8 *st;558  doc_ce->de_flags|=DOCEF_DONT_DRAW;559  st=PopUpGetStr("Enter text and press <ESC>.\n");560  doc_ce->de_flags=old_de_flags;561  if (st && *st) {562    x1=0; y1=0;563    do {564      dc->color=color&COLORROP_NO_ROP0_MASK;565      switch (eletype) {566        case SPT_TEXT:          GrPrint3(dc,x1,y1,0,"%s",st);   break;567        case SPT_TEXT_BOX:      GrTextBox3(dc,x1,y1,0,st);      break;568        case SPT_TEXT_DIAMOND:  GrTextDiamond3(dc,x1,y1,0,st);  break;569      }570      msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);571      SpriteScrnInit(dc,x,y);572      x1=arg1; y1=arg2;573    } while (msg_code!=MSG_MS_L_UP);574    tmpg=CAlloc(SpriteElemQuedBaseSize(eletype)+StrLen(st)+1);575    tmpg->type=eletype;576    tmpg->ps.x1=x1-x;577    tmpg->ps.y1=y1-y;578    StrCpy(tmpg->ps.st,st);579    QueIns(tmpg,insert_pt->last);580    SpriteEdUpdate(doc,doc_ce,head);581    *_cur_elem_num+=1;582  }583  Free(st);584}585 586I64 SMBitMap(I64 eletype,CDoc *doc,CDocEntry *doc_ce,CSprite *head,587        CDC *dc,I64 xx,I64 yy,I64 arg1,I64 arg2,CColorROPU32 bm_bkcolor,588        Bool sel,I64 xx1=0,I64 yy1=0,I64 xx2=0,I64 yy2=0,I64 *_cur_elem_num)589{590  I64 i,msg_code,x=xx,y=yy,x1=arg1,y1=arg2,x2=arg1,y2=arg2,old_width;591  CSprite *tmpg,*tmpg1,*insert_pt;592  CDC *img;593 594  insert_pt=SpriteSetSettings(,head,*_cur_elem_num,xx,yy,,,&x,&y);595  x+=xx; y+=yy;596 597  if (sel) {598    xx1=arg1; yy1=arg2;599    xx2=arg1; yy2=arg2;600    old_width=dc->thick;601    dc->thick=1;602    do {603      dc->color=ROPF_DITHER+WHITE<<16+BLACK;604      GrBorder(dc,xx1,yy1,xx2,yy2);605      msg_code=GetMsg(&arg1,&arg2,1<<MSG_MS_L_UP+1<<MSG_MS_MOVE);606      SpriteScrnInit(dc,x,y);607      x2=arg1; y2=arg2;608      if (x2<x1) {609        xx1=x2; xx2=x1;610      } else {611        xx1=x1; xx2=x2;612      }613      if (y2<y1) {614        yy1=y2; yy2=y1;615      } else {616        yy1=y1; yy2=y2;617      }618    } while (msg_code!=MSG_MS_L_UP);619    dc->thick=old_width;620  }621 622  xx2++; yy2++;623  tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_BITMAP)+624        ((xx2-xx1+7)&~7)*(yy2-yy1));625  tmpg->type=SPT_BITMAP;626  tmpg->pwhu.width=xx2-xx1;627  tmpg->pwhu.height=yy2-yy1;628  tmpg->pwhu.x1=xx1-x;629  tmpg->pwhu.y1=yy1-y;630  img=DCNew(tmpg->pwhu.width,tmpg->pwhu.height,Fs);631  img->color=bm_bkcolor;632  GrRect(img,0,0,tmpg->pwhu.width,tmpg->pwhu.height);633  tmpg1=insert_pt;634  if (tmpg1==head || tmpg1->type&SPG_TYPE_MASK!=SPT_BITMAP) {635    SpriteSetSettings(img,head,0,-(xx1-x),-(yy1-y));636    x=xx; y=yy;637    Sprite3(img,-(xx1-x),-(yy1-y),0,doc_ce->bin_data->data);638    QueDel(head);639    insert_pt=head->next=head->last=head;640    *_cur_elem_num=1;641  } else {642    SpriteSetSettings(img,head,*_cur_elem_num,-(xx1-x),-(yy1-y));643    Sprite3(img,-(xx1-x),-(yy1-y),0,&tmpg1->start,TRUE);644    insert_pt=tmpg1->next;645    QueRem(tmpg1);646    Free(tmpg1);647  }648  MemCpy(&tmpg->pwhu.u,img->body,((xx2-xx1+7)&~7)*(yy2-yy1));649 650  switch (i=SpriteBitMapEd(doc,doc_ce,dc,&xx1,&yy1,651        &xx2,&yy2,&img,bm_bkcolor)) {652    case SPE_EXIT:653    case SPE_CONT:654      Free(tmpg);655      tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_BITMAP)+656            ((xx2-xx1+7)&~7)*(yy2-yy1));657      tmpg->type=eletype;658      tmpg->pwhu.width=xx2-xx1;659      tmpg->pwhu.height=yy2-yy1;660      tmpg->pwhu.x1=xx1-x;661      tmpg->pwhu.y1=yy1-y;662      MemCpy(&tmpg->pwhu.u,img->body,((xx2-xx1+7)&~7)*(yy2-yy1));663      break;664  }665  QueIns(tmpg,insert_pt->last);666  DCDel(img);667  SpriteEdUpdate(doc,doc_ce,head);668  return i;669}670 671U0 SMMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,I64 *_cur_elem_num)672{673  CSprite *tmpg,*insert_pt=SpriteSetSettings(,head,*_cur_elem_num),674        *tmpg1=insert_pt;675  CD3I32 *p;676  I64 i,size,x1,y1,z1;677  I32 *mesh,*old_mesh;678  if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_MESH)679    old_mesh=&tmpg1->mu.vertex_cnt;680  else if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {681    x1=tmpg1->pmu.x;682    y1=tmpg1->pmu.y;683    z1=tmpg1->pmu.z;684    p=&tmpg1->pmu.u;685    for (i=0;i<tmpg1->pmu.vertex_cnt;i++,p++) {686      p->x+=x1;687      p->y+=y1;688      p->z+=z1;689    }690    old_mesh=&tmpg1->pmu.vertex_cnt;691  } else692    old_mesh=NULL;693  if (mesh=SpriteMeshEd(old_mesh,&size,TRUE)) {694    tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_MESH)-sizeof(I32)*2+size);695    tmpg->type=SPT_MESH;696    MemCpy(&tmpg->mu.vertex_cnt,mesh,size);697    Free(mesh);698    QueIns(tmpg,insert_pt->last);699    SpriteEdUpdate(doc,doc_ce,head);700    if (old_mesh) {701      insert_pt=tmpg;702      QueRem(tmpg1);703      Free(tmpg1);704      SpriteEdUpdate(doc,doc_ce,head);705    } else706      *_cur_elem_num+=1;707  } else if (old_mesh && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {708    x1=tmpg1->pmu.x;709    y1=tmpg1->pmu.y;710    z1=tmpg1->pmu.z;711    p=&tmpg1->pmu.u;712    for (i=0;i<tmpg1->pmu.vertex_cnt;i++,p++) {713      p->x-=x1;714      p->y-=y1;715      p->z-=z1;716    }717  }718}719 720U0 SMShiftableMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,721        I64 x,I64 y,I64 arg1,I64 arg2,I64 *_cur_elem_num)722{723  CSprite *tmpg,*insert_pt=SpriteSetSettings(,head,*_cur_elem_num),724        *tmpg1=insert_pt;725  CD3I32 *p;726  I64 i,size,z,x1,y1,z1;727  I32 *mesh,*old_mesh;728  if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_MESH) {729    z=0;730    x1=-(arg1-x);731    y1=-(arg2-y);732    z1=z;733    p=&tmpg1->mu.u;734    for (i=0;i<tmpg1->mu.vertex_cnt;i++,p++) {735      p->x+=x1;736      p->y+=y1;737      p->z+=z1;738    }739    old_mesh=&tmpg1->mu.vertex_cnt;740  } else if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {741    z=-tmpg1->pmu.z;742    x1=tmpg1->pmu.x-(arg1-x);743    y1=tmpg1->pmu.y-(arg2-y);744    z1=tmpg1->pmu.z+z;745    p=&tmpg1->pmu.u;746    for (i=0;i<tmpg1->pmu.vertex_cnt;i++,p++) {747      p->x+=x1;748      p->y+=y1;749      p->z+=z1;750    }751    old_mesh=&tmpg1->pmu.vertex_cnt;752  } else {753    z=0;754    old_mesh=NULL;755  }756  if (mesh=SpriteMeshEd(old_mesh,&size,TRUE)) {757    tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_SHIFTABLE_MESH)-sizeof(I32)*2+size);758    tmpg->type=SPT_SHIFTABLE_MESH;759    MemCpy(&tmpg->pmu.vertex_cnt,mesh,size);760    Free(mesh);761    tmpg->pmu.x=arg1-x;762    tmpg->pmu.y=arg2-y;763    tmpg->pmu.z=-z;764    QueIns(tmpg,insert_pt->last);765    SpriteEdUpdate(doc,doc_ce,head);766    if (old_mesh) {767      insert_pt=tmpg;768      QueRem(tmpg1);769      Free(tmpg1);770      SpriteEdUpdate(doc,doc_ce,head);771    } else772      *_cur_elem_num+=1;773  } else if (old_mesh && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {774    x1=tmpg1->pmu.x-(arg1-x);775    y1=tmpg1->pmu.y-(arg2-y);776    z1=tmpg1->pmu.z+z;777    p=&tmpg1->pmu.u;778    for (i=0;i<tmpg1->pmu.vertex_cnt;i++,p++) {779      p->x-=x1;780      p->y-=y1;781      p->z-=z1;782    }783  } else if (old_mesh && tmpg1->type&SPG_TYPE_MASK==SPT_MESH) {784    x1=-(arg1-x);785    y1=-(arg2-y);786    z1= z;787    p=&tmpg1->mu.u;788    for (i=0;i<tmpg1->mu.vertex_cnt;i++,p++) {789      p->x-=x1;790      p->y-=y1;791      p->z-=z1;792    }793  }794}795 796U0 SMTaskTitleSet(I64 eletype)797{798  Fs->title_src=TTS_CONST; //Violates TTS_LOCKED_CONST799  switch (eletype) {800    case SPT_INS_SCRN_BITMAP:801      StrCpy(Fs->task_title,"Insert Scrn BitMap");802      break;803    case SPT_INS_TRANSPARENT_SCRN_BITMAP:804      StrCpy(Fs->task_title,"Insert Transparent Scrn BitMap");805      break;806    default:807      if (eletype>=0)808        StrCpy(Fs->task_title,DefineSub(eletype,"ST_SPRITE_ELEM_TYPES"));809  }810  Fs->border_src=BDS_CONST;811}812 813I64 SpriteMainEd(CDoc *doc)814{815  CDocEntry *doc_ce=doc->cur_entry;816  I64 res,i,x,y,arg1,arg2,xx,yy,xx1,yy1,xx2,yy2,thick,eletype=SPT_MENU,817        cur_elem_num,old_border_src=Fs->border_src,old_title_src=Fs->title_src,818        old_de_flags=doc_ce->de_flags;819  CColorROPU32 bm_bkcolor,color;820  CSprite *head,*tmpg,*insert_pt;821  CDC *dc=DCAlias(,Fs),*dc2=DCAlias(,sys_winmgr_task),*dc3;822  U8 *old_task_title=StrNew(Fs->task_title);823 824  SettingsPush; //See SettingsPush825  AutoComplete;826  Refresh(2,TRUE);827  dc2->flags|=DCF_ON_TOP;828  head=Sprite2SpriteQue(doc_ce->bin_data->data);829  cur_elem_num=QueCnt(head);830  xx=(doc_ce->x+doc_ce->max_col-doc->line_start_col)*FONT_WIDTH;831  yy=(doc_ce->y-doc->top_line_num)*FONT_HEIGHT;832 833  while (TRUE) {834    insert_pt=SpriteSetSettings(dc,head,cur_elem_num,xx,yy,835          &color,&thick,&x,&y);836    x+=xx; y+=yy;837    DCFill;838    if (eletype==SPT_MENU) {839      Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS840            -WIF_SELF_BORDER-WIF_SELF_GRAB_SCROLL;841      if (winmgr.fps<10)842        doc_ce->de_flags|=DOCEF_DONT_DRAW;843      StrCpy(Fs->task_title,old_task_title);844      Fs->border_src=old_border_src;845      Fs->title_src =old_title_src;846 847      xx-=StrLen(doc_ce->tag)*FONT_WIDTH;848      eletype=PopUpSpriteMain(&head,&cur_elem_num,doc,doc_ce);849      xx+=StrLen(doc_ce->tag)*FONT_WIDTH;850      insert_pt=SpriteSetSettings(dc,head,cur_elem_num,x,y,851            &color,&thick,&x,&y);852      x+=xx; y+=yy;853 854      SpriteEdUpdate(doc,doc_ce,head);855      switch (eletype) {856        case SPT_FLOOD_FILL:857        case SPT_FLOOD_FILL_NOT:858          RegOneTimePopUp(ARf_FLOODFILL,859                ST_WARN_ST "This is affected by what's underneath\n"860                "when it is drawn.  You will probably want to\n"861                "convert it to a bitmap.\n\n"862                "A tip on artistry you might consider\n"863                "is using lines to fill regions because\n"864                "brush strokes look cool.\n");865          break;866        case SPT_PLANAR_SYMMETRY:867          RegOneTimePopUp(ARf_PLANAR_SYMMETRY,868                "Right-click to turn-off symmetry.\n");869          break;870      }871      doc_ce->de_flags=old_de_flags;872    }873    SMTaskTitleSet(eletype);874    switch (eletype) {875      case SPT_COLOR:876        doc_ce->de_flags|=DOCEF_DONT_DRAW;877        i=PopUpColor(,,FALSE);878        if (i>=0) {879          color=i;880          tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_COLOR));881          tmpg->type=SPT_COLOR;882          tmpg->c.color=color;883          QueIns(tmpg,insert_pt->last);884          SpriteEdUpdate(doc,doc_ce,head);885          cur_elem_num++;886        }887        doc_ce->de_flags=old_de_flags;888        eletype=SPT_MENU;889        break;890      case SPT_DITHER_COLOR:891        doc_ce->de_flags|=DOCEF_DONT_DRAW;892        i=PopUpColorDither;893        if (i>=0) {894          color=i;895          tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_DITHER_COLOR));896          tmpg->type=SPT_DITHER_COLOR;897          tmpg->d.dither_color=color.c0.color|color.c1.color<<8;898          QueIns(tmpg,insert_pt->last);899          SpriteEdUpdate(doc,doc_ce,head);900          cur_elem_num++;901        }902        doc_ce->de_flags=old_de_flags;903        eletype=SPT_MENU;904        break;905      case SPT_ED_MENU:906        switch (SpriteEd(doc,doc_ce,x,y,&head,&cur_elem_num)) {907          case SPE_ABORT:       eletype=DOCM_CANCEL;    break;908          case SPE_EXIT:        eletype=SPT_EXIT;       break;909          case SPE_CONT:        eletype=SPT_MENU;       break;910        }911        break;912      case SPT_MESH:913        doc_ce->de_flags|=DOCEF_DONT_DRAW;914        SMMesh(doc,doc_ce,head,&cur_elem_num);915        doc_ce->de_flags=old_de_flags;916        eletype=SPT_MENU;917        break;918      case SPT_SHIFTABLE_MESH:919        doc_ce->de_flags|=DOCEF_DONT_DRAW;920        if (PopUpNoYes("Study the $LK,\"X-Caliber\","921              "A=\"FF:::/PersonalMenu.DD.Z,X-Caliber\"$ icon.\n\n"922              "It has black rectangle background with stars.  The\n"923              "mesh is in front and rotates.  To keep the background\n"924              "rectangle from rotating, "925              "$GREEN$TRANSFORM OFF$FG$ has been used.\n\n"926              "The X-Caliber mesh has a different origin for rotation.\n"927              "To avoid clipping, it also has also been moved in the\n"928              "negative Z direction by editing the sprite as text\n"929              "and changing the first vector.\n\n"930              "For the mesh you are creating, use same origin as\n"931              "the rest of the sprite?  If $GREEN$YES$FG$, you can always\n"932              "shift the mesh origin point in the sprite edit menu.\n")) {933          doc_ce->de_flags=old_de_flags;934          arg1=x; arg2=y;935          SMShiftableMesh(doc,doc_ce,head,x,y,arg1,arg2,&cur_elem_num);936          eletype=SPT_MENU;937        } else938          PopUpOk("Select Origin.\n");939        doc_ce->de_flags=old_de_flags;940        break;941      case SPT_INS_SCRN_BITMAP:942        doc_ce->de_flags|=DOCEF_DONT_DRAW;943        PopUpOk("Drag-out a rect for the extents of the\nbitmap.\n");944        doc_ce->de_flags=old_de_flags;945        Fs->win_inhibit=WIG_TASK_DFT|WIF_FOCUS_TASK_MS_L|WIF_FOCUS_TASK_MS_R|946              WIF_FOCUS_TASK_BORDER-WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL;947        break;948      case SPT_BITMAP:949        doc_ce->de_flags|=DOCEF_DONT_DRAW;950        i=PopUpColor("Background Color\n\n",,FALSE);951        if (i<0)952          eletype=SPT_MENU;953        else {954          bm_bkcolor=i;955          SpriteEdUpdate(doc,doc_ce,head);956          SpriteExtents(doc_ce->bin_data->data,&xx1,&xx2,&yy1,&yy2);957          if (!(xx1<=xx2 && yy1<=yy2))958            xx1=xx2=yy1=yy2=0;959          if (PopUpExtents(&xx1,&xx2,&yy1,&yy2)) {960            doc_ce->de_flags=old_de_flags;961            xx1+=xx; yy1+=yy;962            xx2+=xx; yy2+=yy;963            if (SMBitMap(eletype,doc,doc_ce,head,dc,xx,yy,arg1,arg2,bm_bkcolor,964                  FALSE,xx1,yy1,xx2,yy2,&cur_elem_num)==SPE_EXIT) {965              res=SPE_EXIT;966              goto ei_done;967            }968            eletype=SPT_MENU;969          }970        }971        doc_ce->de_flags=old_de_flags;972        break;973      case SPT_INS_TRANSPARENT_SCRN_BITMAP:974        doc_ce->de_flags|=DOCEF_DONT_DRAW;975        i=PopUpColor("Color to Become Transparent\n\n",,FALSE);976        if (i<0)977          eletype=SPT_MENU;978        else {979          bm_bkcolor=i;980          PopUpOk("Drag-out a rect for the extents of the\nbitmap.\n");981        }982        doc_ce->de_flags=old_de_flags;983        Fs->win_inhibit=WIG_TASK_DFT|WIF_FOCUS_TASK_MS_L|WIF_FOCUS_TASK_MS_R|984              WIF_FOCUS_TASK_BORDER-WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL;985        break;986      case SPT_THICK:987        doc_ce->de_flags|=DOCEF_DONT_DRAW;988        i=PopUpRangeI64(1,16,1,"Thick\n");989        if (i>=1) {990          thick=i;991          tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_THICK));992          tmpg->type=SPT_THICK;993          tmpg->t.thick=thick;994          QueIns(tmpg,insert_pt->last);995          SpriteEdUpdate(doc,doc_ce,head);996          cur_elem_num++;997        }998        doc_ce->de_flags=old_de_flags;999        eletype=SPT_MENU;1000        break;1001      case SPT_TRANSFORM_ON:1002      case SPT_TRANSFORM_OFF:1003        tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_TRANSFORM_ON));1004        if (eletype==SPT_TRANSFORM_ON)1005          tmpg->type=SPT_TRANSFORM_ON;1006        else1007          tmpg->type=SPT_TRANSFORM_OFF;1008        QueIns(tmpg,insert_pt->last);1009        SpriteEdUpdate(doc,doc_ce,head);1010        cur_elem_num++;1011        eletype=SPT_MENU;1012        break;1013      case SPT_POLYGON:1014        doc_ce->de_flags|=DOCEF_DONT_DRAW;1015        i=PopUpRangeI64(3,16,1,"Num of Sides\n");1016        doc_ce->de_flags=old_de_flags;1017        if (i<3)1018          eletype=SPT_MENU;1019        break;1020      case SPT_TEXT:1021      case SPT_TEXT_BOX:1022      case SPT_TEXT_DIAMOND:1023        SMTextFamily(eletype,doc,doc_ce,head,dc,xx,yy,arg1,arg2,1024              color,&cur_elem_num,old_de_flags);1025        eletype=SPT_MENU;1026        break;1027    }1028 1029    if (eletype!=SPT_MENU) {1030      insert_pt=SpriteSetSettings(dc,head,cur_elem_num,xx,yy,1031            &color,&thick,&x,&y);1032      x+=xx; y+=yy;1033      SpriteScrnInit(dc,x,y);1034      if (eletype==SPT_EXIT) {1035        res=SPE_EXIT;1036        goto ei_done;1037      } else if (eletype==DOCM_CANCEL) {1038        res=SPE_ABORT;1039        goto ei_done;1040      }1041      switch (GetMsg(&arg1,&arg2,1042            1<<MSG_KEY_DOWN|1<<MSG_MS_R_UP|1<<MSG_MS_L_DOWN)) {1043        case MSG_KEY_DOWN:1044          switch (arg1) {1045            case CH_ESC:1046              res=SPE_EXIT;1047              goto ei_done;1048            case CH_SHIFT_ESC:1049              res=SPE_ABORT;1050              goto ei_done;1051            case 'c': //eye-dropper1052              dc3=DCScrnCapture(FALSE);1053              color=GrPeek(dc3,ms.pos.x,ms.pos.y)^15;//Mouse cursor is XORed.1054              DCDel(dc3);1055              tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_COLOR));1056              tmpg->type=SPT_COLOR;1057              tmpg->c.color=color;1058              QueIns(tmpg,insert_pt->last);1059              SpriteEdUpdate(doc,doc_ce,head);1060              cur_elem_num++;1061              break;1062            case 't': //Set to transparent color1063              tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_COLOR));1064              tmpg->type=SPT_COLOR;1065              tmpg->c.color=TRANSPARENT;1066              QueIns(tmpg,insert_pt->last);1067              SpriteEdUpdate(doc,doc_ce,head);1068              cur_elem_num++;1069              break;1070          }1071          break;1072        case MSG_MS_R_UP:1073          if (eletype==SPT_PLANAR_SYMMETRY) {1074            tmpg=CAlloc(SpriteElemQuedBaseSize(SPT_PLANAR_SYMMETRY));1075            tmpg->type=SPT_PLANAR_SYMMETRY;1076            QueIns(tmpg,insert_pt->last);1077            SpriteEdUpdate(doc,doc_ce,head);1078            cur_elem_num++;1079            eletype=SPT_MENU;1080          } else1081            eletype=SPT_MENU;1082          break;1083        case MSG_MS_L_DOWN:1084          switch (eletype) {1085            start:1086              case SPT_LINE:1087                tmpg=SMLine(dc,x,y,arg1,arg2,color);1088                break;1089              case SPT_ARROW:1090                tmpg=SMArrow(dc,x,y,arg1,arg2,color);1091                break;1092              case SPT_PLANAR_SYMMETRY:1093                tmpg=SMPlanarSymmetry(dc,x,y,arg1,arg2);1094                eletype=SPT_MENU;1095                break;1096              case SPT_RECT:1097                tmpg=SMRect(dc,x,y,arg1,arg2,color);1098                break;1099              case SPT_INS_SCRN_BITMAP:1100              case SPT_INS_TRANSPARENT_SCRN_BITMAP:1101                tmpg=SMScrnBitMap(eletype,dc,dc2,x,y,arg1,arg2,bm_bkcolor);1102                eletype=SPT_MENU;1103                break;1104              case SPT_CIRCLE:1105                tmpg=SMCircle(dc,x,y,arg1,arg2,color);1106                break;1107              case SPT_ELLIPSE:1108                tmpg=SMEllipse(dc,x,y,arg1,arg2,color);1109                break;1110              case SPT_POLYGON:1111                tmpg=SMPolygon(dc,x,y,arg1,arg2,i,color);1112                eletype=SPT_MENU;1113                break;1114              case SPT_PT:1115              case SPT_FLOOD_FILL:1116              case SPT_FLOOD_FILL_NOT:1117                tmpg=CAlloc(SpriteElemQuedBaseSize(eletype));1118                tmpg->type=eletype;1119                tmpg->p.x1=arg1-x;1120                tmpg->p.y1=arg2-y;1121                break;1122              case SPT_POLYLINE:1123              case SPT_BSPLINE2:1124              case SPT_BSPLINE3:1125              case SPT_BSPLINE2_CLOSED:1126              case SPT_BSPLINE3_CLOSED:1127                tmpg=SMPolyLineFamily(eletype,dc,x,y,arg1,arg2,color);1128                break;1129              case SPT_POLYPT:1130                tmpg=SMPolyPoint(dc,x,y,arg1,arg2,color);1131                break;1132            end:1133              if (tmpg) {1134                QueIns(tmpg,insert_pt->last);1135                SpriteEdUpdate(doc,doc_ce,head);1136                cur_elem_num++;1137              }1138              break;1139            case SPT_BITMAP:1140              if (SMBitMap(eletype,doc,doc_ce,head,dc,xx,yy,1141                    arg1,arg2,bm_bkcolor,TRUE,,,,,&cur_elem_num)==SPE_EXIT) {1142                res=SPE_EXIT;1143                goto ei_done;1144              }1145              doc_ce->de_flags=old_de_flags;1146              eletype=SPT_MENU;1147              break;1148            case SPT_SHIFTABLE_MESH:1149              GetMsg(NULL,NULL,1<<MSG_MS_L_UP);1150              doc_ce->de_flags|=DOCEF_DONT_DRAW;1151              SMShiftableMesh(doc,doc_ce,head,x,y,arg1,arg2,&cur_elem_num);1152              doc_ce->de_flags=old_de_flags;1153              eletype=SPT_MENU;1154              break;1155          }1156          break;1157      }1158    }1159  }1160ei_done:1161  DCFill;1162  SettingsPop;1163  doc_ce->de_flags=old_de_flags;1164  DCDel(dc);1165  DCDel(dc2);1166  StrCpy(Fs->task_title,old_task_title);1167  Free(old_task_title);1168  Fs->border_src=old_border_src;1169  Fs->title_src =old_title_src;1170  QueDel(head);1171  Free(head);1172  return res;1173}1174 1175U0 EdSpriteIns(CDoc *doc)1176{1177  Bool unlock;1178  U8 *st;1179  CDocEntry *doc_e;1180  CDocBin *tmpb;1181  if (Fs!=doc->mem_task)1182    throw('Graphics');1183  if (st=EdSprite(doc->cur_bin_num)) {1184    unlock=DocLock(doc);1185    tmpb=CAlloc(sizeof(CDocBin),doc->mem_task);1186    tmpb->size=sprite_elem_base_sizes[SPT_END];1187    tmpb->data=CAlloc(tmpb->size,doc->mem_task);1188    tmpb->num=doc->cur_bin_num++;1189    tmpb->use_cnt=1;1190    QueIns(tmpb,doc->bin_head.last);1191    doc_e=DocPrint(doc,"%s",st);1192    doc_e->bin_data=tmpb;1193    Free(st);1194    if (doc_e) {1195      if (doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)1196        tmpb->tag=StrNew(doc_e->tag,doc->mem_task);1197      doc->cur_entry=doc_e;1198      doc->cur_col=0;1199      DocUnlock(doc);1200      DocRecalc(doc);

Showing the first 1,200 of 1240 lines. Download the file for the rest.