hschumann2/TempleOS-Source-Code
0847
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);