TempleOSCDV4.13.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:48:03 +02:00
1 parent b84bbff6db
commit 122df6338e
78 files changed
+3570 -2729

No files matched your search

+4 -1
View File
@@ -114,6 +114,9 @@ public class CSpritePtMeshU8s : CSpriteBase
U8 u[0];
};
#define SPF_SEL 128
#define SPf_SEL 7
#define SPT_END 0 //$LK,"CSpriteBase",A="MN:CSpriteBase"$
#define SPT_COLOR 1 //$LK,"CSpriteColor",A="MN:CSpriteColor"$
#define SPT_DITHER_COLOR 2 //$LK,"CSpriteDitherColor",A="MN:CSpriteDitherColor"$
@@ -145,6 +148,7 @@ public class CSpritePtMeshU8s : CSpriteBase
#define SPT_TEXT_BOX 28 //$LK,"CSpritePtStr",A="MN:CSpritePtStr"$
#define SPT_TEXT_DIAMOND 29 //$LK,"CSpritePtStr",A="MN:CSpritePtStr"$
#define SPT_NUM_TYPES 30
#define SPG_TYPE_MASK 0x7F
#help_index "Graphics/Sprite;Sprites;Sprites/Binary"
@@ -153,7 +157,6 @@ public class CSpritePtMeshU8s : CSpriteBase
public class CSprite
{
CSprite *next,*last;
Bool sel;
U0 start;
union {
U8 type;
+8 -24
View File
@@ -10,10 +10,8 @@ public Bool GrPlot0(CDC *dc=gr.dc,I64 x,I64 y)
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_RECORD_EXTENTS) {
if (x<dc->min_x) dc->min_x=x;
@@ -104,10 +102,8 @@ public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img)
}
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x+img->width>>1,y+img->height>>1,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_SCRN_BITMAP) {
if (x+w1<0) w1=-x;
@@ -671,10 +667,8 @@ public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch)
}
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x+w2>>1,y+h2>>1,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_SCRN_BITMAP) {
if (x+w1<0) w1=-x;
@@ -963,10 +957,8 @@ public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h)
dist=0;
else
dist=DistSqrI64(x+w>>1,y+h>>1,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_SCRN_BITMAP) {
if (x+w1<0) w1=-x;
@@ -1517,10 +1509,8 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
!not_color && c==dc->color2) && plot) {
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_RECORD_EXTENTS) {
if (x3<dc->min_x) dc->min_x=x3;
@@ -1594,10 +1584,8 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
!not_color && c==dc->color2) && plot) {
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_RECORD_EXTENTS) {
if (x3<dc->min_x) dc->min_x=x3;
@@ -1723,10 +1711,8 @@ public I64 GrHLine(CDC *dc=gr.dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
else
dist=SqrI64(dc->cur_x-x2);
dist+=SqrI64(y-dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_DONT_DRAW)
goto gr_done;
@@ -1894,10 +1880,8 @@ public I64 GrVLine(CDC *dc=gr.dc,I64 x,I64 y1,I64 y2,I64 z1=0,I64 z2=0)
else
dist=SqrI64(dc->cur_y-y2);
dist+=SqrI64(x-dc->cur_x);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_DONT_DRAW)
goto gr_done;
+1 -3
View File
@@ -519,10 +519,8 @@ public Bool GrPlot3(CDC *dc=gr.dc,I64 x,I64 y,I64 z)
}
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
if (dist<=dc->nearest_dist)
dc->nearest_dist=dist;
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
}
}
if (dc->flags & DCF_RECORD_EXTENTS) {
if (x-w<dc->min_x) dc->min_x=x-w;
+7 -13
View File
@@ -20,22 +20,17 @@ public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,
{//Plot a sprite into a CDC.
CSprite *tmpg=elems-offset(CSprite.start);
I64 i,j,k,x1,y1,z1,x2,y2,
cur_sprite_elem_num=0,*old_r,*r2,
old_flags=dc->flags,
old_pen_width=dc->pen_width;
*old_r,*r2,old_flags=dc->flags,old_pen_width=dc->pen_width;
I32 *ptr;
CColorROPU32 old_color=dc->color;
CDC *img;
CD3I32 *p,*p2;
CGrSym old_sym;
MemCpy(&old_sym,&dc->sym,sizeof(CGrSym));
if (dc->flags & DCF_LOCATE_NEAREST) {
dc->nearest_sprite_elem_num=0;
if (dc->flags & DCF_LOCATE_NEAREST)
dc->nearest_dist=MAX_I64;
}
while (tmpg->type) {
dc->cur_sprite_elem_num=cur_sprite_elem_num;
switch (tmpg->type) {
while (tmpg->type&SPG_TYPE_MASK) {
switch (tmpg->type&SPG_TYPE_MASK) {
case SPT_COLOR:
dc->color=dc->color&~(COLORROP_COLORS_MASK|ROPF_DITHER)|tmpg->c.color;
break;
@@ -237,7 +232,6 @@ public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,
}
break;
}
cur_sprite_elem_num++;
if (just_one_elem) break;
tmpg(U8 *)+=SpriteElemSize(tmpg);
}
@@ -346,10 +340,10 @@ public U8 *SpriteInterpolate(F64 t,U8 *elems0,U8 *elems1)
MemCpy(res,elems1,i);
}
tmpgr=res-offset(CSprite.start);
while (tmpg0->type) {
if (tmpg0->type!=tmpg1->type)
while (tmpg0->type&SPG_TYPE_MASK) {
if (tmpg0->type&SPG_TYPE_MASK!=tmpg1->type&SPG_TYPE_MASK)
throw('Graphics');
switch (tmpg0->type) {
switch (tmpg0->type&SPG_TYPE_MASK) {
case SPT_ROTATED_RECT:
tmpgr->ppa.angle=(tmpg0->ppa.angle*t0+tmpg1->ppa.angle*t1)/GR_SCALE;
case SPT_RECT:
+6 -5
View File
@@ -8,8 +8,8 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tmpg)
CD3I32 *p;
CMeshTri *tri;
if (!doc) doc=DocPut;
DocPrint(doc,"%Z",tmpg->type,"ST_SPRITE_ELEM_CODES");
switch (tmpg->type) {
DocPrint(doc,"%Z",tmpg->type&SPG_TYPE_MASK,"ST_SPRITE_ELEM_CODES");
switch (tmpg->type&SPG_TYPE_MASK) {
case SPT_COLOR:
DocPrint(doc,"{%s}",
Color2Str(buf1,tmpg->c.color));
@@ -92,7 +92,8 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tmpg)
if (i&3==3 && i+1<tmpg->nu.num)
DocPrint(doc,"\n");
}
if (tmpg->type==SPT_BSPLINE2||tmpg->type==SPT_BSPLINE3)
if (tmpg->type&SPG_TYPE_MASK==SPT_BSPLINE2||
tmpg->type&SPG_TYPE_MASK==SPT_BSPLINE3)
DocPrint(doc,",FALSE}");
else
DocPrint(doc,",TRUE}");
@@ -186,13 +187,13 @@ U0 SpriteElem2Code(CDoc *doc,CSprite *tmpg)
DocPrint(doc,"}");
break;
}
DocPrint(doc,";\n");
DocPrint(doc,";\n");
}
public U0 Sprite2Code(CDoc *doc=NULL,U8 *elems)
{//Sprite to text.
CSprite *tmpg=elems-offset(CSprite.start);
while (tmpg->type) {
while (tmpg->type&SPG_TYPE_MASK) {
SpriteElem2Code(doc,tmpg);
tmpg(U8 *)+=SpriteElemSize(tmpg);
}
+122 -96
View File
@@ -9,7 +9,7 @@ CSprite *SpriteSetSettings(CDC *dc=NULL,CSprite *head,I64 elem_num,
CColorROPU32 color=BLACK;
if (dc) DCRst(dc);
while (elem_num-->0 && res!=head) {
switch (res->type) {
switch (res->type&SPG_TYPE_MASK) {
case SPT_COLOR:
color=res->c.color;
if (dc) dc->color=color;
@@ -65,11 +65,10 @@ CSprite *Sprite2SpriteQue(U8 *elems)
CSprite *res=CAlloc(sizeof(CSprite)),
*tmpg=elems-offset(CSprite.start),*tmpg1;
QueInit(res);
while (tmpg->type) {
while (tmpg->type&SPG_TYPE_MASK) {
tmpg1=MAlloc(SpriteElemSize(tmpg)+offset(CSprite.start));
s=SpriteElemSize(tmpg);
MemCpy(&tmpg1->start,&tmpg->start,s);
tmpg1->sel=FALSE;
QueIns(tmpg1,res->last);
tmpg(U8 *)+=s;
}
@@ -117,8 +116,8 @@ U0 SpriteSetOrigin(CSprite *head,I64 dx,I64 dy,I64 dz)
CD3I32 *p;
CSprite *tmpg=head->next;
while (tmpg!=head) {
if (tmpg->sel)
switch (tmpg->type) {
if (Bt(&tmpg->type,SPf_SEL))
switch (tmpg->type&SPG_TYPE_MASK) {
case SPT_ARROW:
case SPT_LINE:
case SPT_PLANAR_SYMMETRY:
@@ -203,7 +202,7 @@ CSprite *SpriteTransformCircle(I64 *r,CSprite *tmpg)
tmpg1->pwha.height=ToI64(m2)/0x10000;
tmpg1->pwha.angle=-a1;
tmpg1->sel=tmpg->sel;
tmpg1->type|=tmpg->type&SPF_SEL;
return tmpg1;
}
@@ -212,9 +211,9 @@ CSprite *SpriteTransformEllipse(I64 *r,CSprite *tmpg)
I64 x,y,z;
F64 m1,a1,m2,a2,s,c,x_radius=tmpg->pwha.width<<16,
y_radius=tmpg->pwha.height<<16;
CSprite *tmpg1=CAlloc(SpriteElemQuedBaseSize(tmpg->type));
CSprite *tmpg1=CAlloc(SpriteElemQuedBaseSize(tmpg->type&SPG_TYPE_MASK));
tmpg1->type=tmpg->type;
if (tmpg->type==SPT_POLYGON)
if (tmpg->type&SPG_TYPE_MASK==SPT_POLYGON)
tmpg1->pwhas.sides=tmpg->pwhas.sides;
x=tmpg->pwha.x1; y=tmpg->pwha.y1; z=0;
@@ -244,7 +243,7 @@ CSprite *SpriteTransformEllipse(I64 *r,CSprite *tmpg)
if (tmpg1->pwha.height<1) tmpg1->pwha.height=1;
tmpg1->pwha.angle=-a1;
tmpg1->sel=tmpg->sel;
tmpg1->type|=tmpg->type&SPF_SEL;
return tmpg1;
}
@@ -286,7 +285,7 @@ CSprite *SpriteTransformRect(I64 *r,CSprite *tmpg,F64
tmpg1->ppa.y2=tmpg1->ppa.y1+h;
tmpg1->ppa.angle=-a1;
tmpg1->sel=tmpg->sel;
tmpg1->type|=tmpg->type&SPF_SEL;
return tmpg1;
}
@@ -380,8 +379,8 @@ U0 SpriteTransform(I64 *r,CSprite *head)
CD3I32 *p;
CSprite *tmpg=head->next,head2,*tmpg1,*tmpg2,*tmpg3;
while (tmpg!=head) {
if (tmpg->sel)
switch (tmpg->type) {
if (Bt(&tmpg->type,SPf_SEL))
switch (tmpg->type&SPG_TYPE_MASK) {
case SPT_WIDTH:
tmpg->w.width*=Sqrt(Mat4x4NormSqr65536(r))/65536;
if (tmpg->w.width<0) tmpg->w.width=0;
@@ -502,11 +501,10 @@ U0 SpriteTransform(I64 *r,CSprite *head)
Free(tmpg1);
tmpg1=tmpg2;
}
tmpg3->type=SPT_POLYPT;
tmpg3->type=SPT_POLYPT|tmpg->type&SPF_SEL;
tmpg3->npu.num=num;
QueIns(tmpg3,tmpg);
QueRem(tmpg);
tmpg3->sel=tmpg->sel;
Free(tmpg);
tmpg=tmpg3;
break;
@@ -559,7 +557,7 @@ I64 SpriteQueSelCnt(CSprite *head,Bool val=TRUE)
CSprite *tmpg=head->next;
val=ToBool(val);
while (tmpg!=head) {
if (ToBool(tmpg->sel)==val)
if (Bt(&tmpg->type,SPf_SEL)==val)
res++;
tmpg=tmpg->next;
}
@@ -571,7 +569,7 @@ I64 SpriteQueSelAll(CSprite *head,Bool val=TRUE)
I64 res=0;
CSprite *tmpg=head->next;
while (tmpg!=head) {
tmpg->sel=val;
BEqu(&tmpg->type,SPf_SEL,val);
res++;
tmpg=tmpg->next;
}
@@ -590,7 +588,7 @@ CSprite *SpriteSideBar2SpriteQue(CDoc *doc,CSprite *head,I64 *_cur_elem_num)
tmpg=SpriteSetSettings(,head,doc_e->left_exp);
if (tmpg!=head) {
tmpg=MAllocIdent(tmpg);
tmpg->sel=Bt(&doc_e->type,DOCEt_SEL);
BEqu(&tmpg->type,SPf_SEL,Bt(&doc_e->type,DOCEt_SEL));
if (*_cur_elem_num==doc_e->left_exp) {
*_cur_elem_num=num;
found=TRUE;
@@ -627,8 +625,8 @@ U0 SpriteSideBarPickNew(CDoc *doc,CSprite *head,I64 old_num)
DocPrint(doc,"$$LTBLUE$$");
doc_e=DocPrint(doc,"$$MU-UL,\"%$$Q\",LE=%d$$\n",st,cur_elem_num++);
}
BEqu(&doc_e->de_flags,DOCEf_SEL,tmpg->sel);
BEqu(&doc_e->type,DOCEt_SEL,tmpg->sel);
BEqu(&doc_e->de_flags,DOCEf_SEL,Bt(&tmpg->type,&SPf_SEL));
BEqu(&doc_e->type,DOCEt_SEL,Bt(&tmpg->type,SPf_SEL));
Free(st);
tmpg=tmpg->next;
}
@@ -716,25 +714,27 @@ Bool SpriteEdText(CSprite **_head,I64 *_cur_elem_num)
}
#define SPED_SEL_UNSEL_ALL 0
#define SPED_SEL 1
#define SPED_UNSEL 2
#define SPED_SHIFT_PTS 3
#define SPED_SHIFT_RECTS 4
#define SPED_SHIFT_SEL 5
#define SPED_TRANSFORM_SEL 6
#define SPED_SET_ORIGIN 7
#define SPED_SHIFT_SUB_ORIGIN 8
#define SPED_TEXT_ED 9
#define SPED_INS_CLIPBOARD 10
#define SPED_MAIN_MENU 11
#define SPED_EXIT 12
#define SPED_SEL 2
#define SPED_SEL_RECTS 3
#define SPED_UNSEL 4
#define SPED_UNSEL_RECTS 5
#define SPED_SHIFT_PTS 6
#define SPED_SHIFT_RECTS 7
#define SPED_SHIFT_SEL 8
#define SPED_TRANSFORM_SEL 9
#define SPED_SET_ORIGIN 10
#define SPED_SHIFT_SUB_ORIGIN 11
#define SPED_TEXT_ED 12
#define SPED_INS_CLIPBOARD 13
#define SPED_MAIN_MENU 14
#define SPED_EXIT 15
U0 GrInit3()
{
DefineLstLoad("ST_SPRITE_ED_MENU","Select/Unselect All\0"
"Select\0Unselect\0Shift Points\0Shift Rects\0Shift Selected\0"
"Transform Selected\0Set Origin\0Insert Shift SubOrigin\0"
"Edit as Text\0Insert Clipboard\0Main Menu\0");
DefineLstLoad("ST_SPRITE_ED_MENU","Select/Unselect All\0 \0Select\0"
"Select Rects\0Unselect\0Unselect Rects\0Shift Points\0Shift Rects\0"
"Shift Selected\0Transform Selected\0Set Origin\0"
"Insert Shift SubOrigin\0Edit as Text\0Insert Clipboard\0Main Menu\0");
}
GrInit3;
@@ -748,7 +748,9 @@ I64 PopUpSpriteEd(CSprite **_head,I64 *_cur_elem_num)
"$$LK+PU+CX,\"Click for Help\",A=\"FI:::/Doc/SpriteEd.DD.Z\"$$\n\n"
"$$LTBLUE$$$$MU-UL,\"Select/Unselect All\",LE=SPED_SEL_UNSEL_ALL$$\n"
"$$MU-UL,\"Select Elems\",LE=SPED_SEL$$\n"
"$$MU-UL,\"Unsel Elems\",LE=SPED_UNSEL$$\n\n"
"$$MU-UL,\"Select Elems with Rects\",LE=SPED_SEL_RECTS$$\n"
"$$MU-UL,\"Unsel Elems\",LE=SPED_UNSEL$$\n"
"$$MU-UL,\"Unsel Elems with Rects\",LE=SPED_UNSEL_RECTS$$\n\n"
"$$MU-UL,\"Shift Points\",LE=SPED_SHIFT_PTS$$\n"
"$$MU-UL,\"Shift Points with Rects\",LE=SPED_SHIFT_RECTS$$\n"
"$$MU-UL,\"Shift Selected Elems\",LE=SPED_SHIFT_SEL$$\n"
@@ -780,10 +782,21 @@ I64 PopUpSpriteEd(CSprite **_head,I64 *_cur_elem_num)
class CEdSprite
{
CEdSprite *next,*last;
CSprite *g;
I32 type,num,flags,xx,yy,zz;
I32 *x,*y,*z,*w,*h;
};
CEdSprite *EdSpriteNew(I64 type,CSprite *tmpg)
{
CEdSprite *res=CAlloc(sizeof(CEdSprite));
res->g=tmpg;
if (tmpg->type&SPF_SEL)
res->flags|=SPEDF_SEL;
res->type=type;
return res;
}
U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CEdSprite *head)
{
I64 i,num=0;
@@ -792,12 +805,11 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CEdSprite *head)
CEdSprite *tmpes;
CSprite *tmpg=elems-offset(CSprite.start);
QueInit(head);
while (tmpg->type) {
switch (tmpg->type) {
while (tmpg->type&SPG_TYPE_MASK) {
switch (tmpg->type&SPG_TYPE_MASK) {
case SPT_ELLIPSE:
case SPT_POLYGON:
tmpes=CAlloc(sizeof(CEdSprite));
tmpes->type=SPEDT_WIDTH_HEIGHT;
tmpes=EdSpriteNew(SPEDT_WIDTH_HEIGHT,tmpg);
tmpes->xx=x;
tmpes->yy=y;
tmpes->x=&tmpg->pwha.x1;
@@ -812,8 +824,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CEdSprite *head)
case SPT_LINE:
case SPT_ARROW:
case SPT_PLANAR_SYMMETRY:
tmpes=CAlloc(sizeof(CEdSprite));
tmpes->type=SPEDT_SIMPLE_PT;
tmpes=EdSpriteNew(SPEDT_SIMPLE_PT,tmpg);
tmpes->xx=x;
tmpes->yy=y;
tmpes->x=&tmpg->pp.x2;
@@ -829,8 +840,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CEdSprite *head)
case SPT_FLOOD_FILL_NOT:
case SPT_CIRCLE:
pq_x1_y1:
tmpes=CAlloc(sizeof(CEdSprite));
tmpes->type=SPEDT_SIMPLE_PT;
tmpes=EdSpriteNew(SPEDT_SIMPLE_PT,tmpg);
tmpes->xx=x;
tmpes->yy=y;
tmpes->x=&tmpg->p.x1;
@@ -845,8 +855,7 @@ pq_x1_y1:
case SPT_POLYLINE:
ptr=&tmpg->nu.u;
for (i=0;i<tmpg->nu.num;i++) {
tmpes=CAlloc(sizeof(CEdSprite));
tmpes->type=SPEDT_SIMPLE_PT;
tmpes=EdSpriteNew(SPEDT_SIMPLE_PT,tmpg);
tmpes->xx=x;
tmpes->yy=y;
tmpes->x=&ptr[i<<1];
@@ -856,8 +865,7 @@ pq_x1_y1:
}
break;
case SPT_POLYPT:
tmpes=CAlloc(sizeof(CEdSprite));
tmpes->type=SPEDT_SIMPLE_PT;
tmpes=EdSpriteNew(SPEDT_SIMPLE_PT,tmpg);
tmpes->xx=x;
tmpes->yy=y;
tmpes->x=&tmpg->npu.x;
@@ -871,8 +879,7 @@ pq_x1_y1:
case SPT_BSPLINE3_CLOSED:
p=&tmpg->nu.u;
for (i=0;i<tmpg->nu.num;i++) {
tmpes=CAlloc(sizeof(CEdSprite));
tmpes->type=SPEDT_SIMPLE_PT;
tmpes=EdSpriteNew(SPEDT_SIMPLE_PT,tmpg);
tmpes->xx=x;
tmpes->yy=y;
tmpes->x=&p[i].x;
@@ -885,8 +892,7 @@ pq_x1_y1:
case SPT_MESH:
break;
case SPT_SHIFTABLE_MESH:
tmpes=CAlloc(sizeof(CEdSprite));
tmpes->type=SPEDT_SIMPLE_PT;
tmpes=EdSpriteNew(SPEDT_SIMPLE_PT,tmpg);
tmpes->xx=x;
tmpes->yy=y;
tmpes->x=&tmpg->pmu.x;
@@ -952,7 +958,7 @@ U0 SpriteCtrlPtsMove(CEdSprite *head,I64 dx,I64 dy)
}
}
Bool SpriteShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_elem_num,I64 mode)
Bool SpriteSelUnselShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_elem_num,I64 mode)
{
I64 msg_code,a1,a2,xx,yy,xx2,yy2,dd,best_dd,cur_elem_num;
Bool res=TRUE;
@@ -968,6 +974,8 @@ Bool SpriteShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_elem_num,I64 mode)
1<<MSG_IP_R_UP|1<<MSG_IP_L_DOWN|1<<MSG_KEY_DOWN)) {
case MSG_IP_L_DOWN:
switch (mode) {
case SPED_SEL:
case SPED_UNSEL:
case SPED_SHIFT_PTS:
xx=a1; yy=a2;
best_dd=MAX_I64;
@@ -990,9 +998,15 @@ Bool SpriteShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_elem_num,I64 mode)
tmpes=tmpes->next;
}
cur_elem_num=best_es->num;
best_es->flags|=SPEDF_SEL;
if (mode!=SPED_UNSEL) {
best_es->flags|=SPEDF_SEL;
best_es->g->type|=SPF_SEL;
} else {
best_es->flags&=~SPEDF_SEL;
best_es->g->type&=~SPF_SEL;
}
break;
case SPED_SHIFT_RECTS:
start:
xx2=xx=a1; yy2=yy=a2;
while (TRUE) {
SpriteCtrlPtsDraw(dc,&head);
@@ -1012,37 +1026,62 @@ Bool SpriteShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_elem_num,I64 mode)
switch (tmpes->type) {
case SPEDT_SIMPLE_PT:
if (xx<=*tmpes->x+tmpes->xx<=xx2 &&
yy<=*tmpes->y+tmpes->yy<=yy2)
tmpes->flags|=SPEDF_SEL;
yy<=*tmpes->y+tmpes->yy<=yy2) {
if (mode!=SPED_UNSEL_RECTS) {
tmpes->flags|=SPEDF_SEL;
tmpes->g->type|=SPF_SEL;
} else {
tmpes->flags&=~SPEDF_SEL;
tmpes->g->type&=~SPF_SEL;
}
}
break;
case SPEDT_WIDTH_HEIGHT:
if (xx<=*tmpes->x+*tmpes->w+tmpes->xx<=xx2 &&
yy<=*tmpes->y+*tmpes->h+tmpes->yy<=yy2)
tmpes->flags|=SPEDF_SEL;
yy<=*tmpes->y+*tmpes->h+tmpes->yy<=yy2) {
if (mode!=SPED_UNSEL_RECTS) {
tmpes->flags|=SPEDF_SEL;
tmpes->g->type|=SPF_SEL;
} else {
tmpes->flags&=~SPEDF_SEL;
tmpes->g->type&=~SPF_SEL;
}
}
break;
}
tmpes=tmpes->next;
}
case SPED_SEL_RECTS:
case SPED_UNSEL_RECTS:
break;
case SPED_SHIFT_RECTS:
do {
SpriteCtrlPtsDraw(dc,&head);
msg_code=ScanMsg(&a1,&a2,1<<MSG_KEY_DOWN|1<<MSG_IP_L_DOWN);
if (msg_code==MSG_KEY_DOWN) goto gs_key;
} while (msg_code!=MSG_IP_L_DOWN);
xx=a1;yy=a2;
break;
end:
}
switch (mode) {
case SPED_SHIFT_PTS:
case SPED_SHIFT_RECTS:
do {
SpriteCtrlPtsDraw(dc,&head);
msg_code=ScanMsg(&a1,&a2,1<<MSG_KEY_DOWN|1<<MSG_IP_L_DOWN);
if (msg_code==MSG_KEY_DOWN) goto gs_key;
} while (msg_code!=MSG_IP_L_DOWN);
xx=a1;yy=a2;
if (msg_code=ScanMsg(&a1,&a2,1<<MSG_IP_MOVE|1<<MSG_IP_L_UP)) {
SpriteCtrlPtsMove(&head,a1-xx,a2-yy);
xx=a1;yy=a2;
}
} while (msg_code!=MSG_IP_L_UP);
tmpes=head.next;
while (tmpes!=&head) {
tmpes->flags&=~SPEDF_SEL;
tmpes->g->type&=~SPF_SEL;
tmpes=tmpes->next;
}
break;
}
do {
SpriteCtrlPtsDraw(dc,&head);
if (msg_code=ScanMsg(&a1,&a2,1<<MSG_IP_MOVE|1<<MSG_IP_L_UP)) {
SpriteCtrlPtsMove(&head,a1-xx,a2-yy);
xx=a1;yy=a2;
}
} while (msg_code!=MSG_IP_L_UP);
tmpes=head.next;
while (tmpes!=&head) {
tmpes->flags&=~SPEDF_SEL;
tmpes=tmpes->next;
}
break;
case MSG_KEY_DOWN:
gs_key:
@@ -1054,11 +1093,11 @@ gs_key:
goto gs_done;
case 'p':
case 'P':
mode=SPED_SHIFT_PTS;
mode&=~1;
break;
case 'r':
case 'R':
mode=SPED_SHIFT_RECTS;
mode|=1;
break;
}
break;
@@ -1084,7 +1123,7 @@ I64 SpriteEd(CDoc *doc,CDocEntry *doc_ce,I64 x,I64 y,
Bool unlock;
I64 i,r[16],msg_code,a1,a2,xx,yy,
old_de_flags;
CSprite *cur_elem,*head2,*next,*last,*tmpg,*insert_pt;
CSprite *head2,*next,*last,*tmpg,*insert_pt;
old_de_flags=doc_ce->de_flags;
tmpb=doc_ce->bin_data;
@@ -1105,23 +1144,6 @@ I64 SpriteEd(CDoc *doc,CDocEntry *doc_ce,I64 x,I64 y,
else
SpriteQueSelAll(*_head,FALSE);
break;
case SPED_SEL:
case SPED_UNSEL:
doc_ce->de_flags=old_de_flags;
doc->cur_sprite=tmpb->data;
do {
doc->nearest_sprite_elem_num=0;
msg_code=GetMsg(&a1,&a2,1<<MSG_IP_L_DOWN|1<<MSG_IP_R_UP);
Refresh(2);
if (msg_code==MSG_IP_L_DOWN) {
*_cur_elem_num=doc->nearest_sprite_elem_num;
cur_elem=SpriteSetSettings(,*_head,*_cur_elem_num);
cur_elem->sel=ToBool(i==SPED_SEL);
GetMsg(,,1<<MSG_IP_L_UP);
}
} while (msg_code!=MSG_IP_R_UP);
doc->cur_sprite=NULL;
break;
case SPED_SET_ORIGIN:
SpriteQueSelAll(*_head);
doc_ce->de_flags=old_de_flags;
@@ -1146,6 +1168,10 @@ I64 SpriteEd(CDoc *doc,CDocEntry *doc_ce,I64 x,I64 y,
if (!SpriteQueSelCnt(*_head,FALSE))
SpriteQueSelAll(*_head,FALSE);
break;
case SPED_SEL:
case SPED_SEL_RECTS:
case SPED_UNSEL:
case SPED_UNSEL_RECTS:
case SPED_SHIFT_PTS:
case SPED_SHIFT_RECTS:
RegOneTimePopUp(ARf_CSPRITE_PTS_RECTANGLES,
@@ -1154,7 +1180,7 @@ I64 SpriteEd(CDoc *doc,CDocEntry *doc_ce,I64 x,I64 y,
"Press '$$GREEN$$r$$FG$$' after one rectangle\n"
"to OR another rectangle.\n");
doc_ce->de_flags=old_de_flags;
if (SpriteShiftPts(tmpb->data,x,y,_cur_elem_num,i)) {
if (SpriteSelUnselShiftPts(tmpb->data,x,y,_cur_elem_num,i)) {
QueDel(*_head);
Free(*_head);
*_head=Sprite2SpriteQue(tmpb->data);
+15 -12
View File
@@ -627,7 +627,7 @@ I64 SMBitMap(I64 eletype,CDoc *doc,CDocEntry *doc_ce,CSprite *head,
img->color=bm_bkcolor;
GrRect(img,0,0,tmpg->pwhu.width,tmpg->pwhu.height);
tmpg1=insert_pt;
if (tmpg1==head || tmpg1->type!=SPT_BITMAP) {
if (tmpg1==head || tmpg1->type&SPG_TYPE_MASK!=SPT_BITMAP) {
SpriteSetSettings(img,head,0,-(xx1-x),-(yy1-y));
x=xx; y=yy;
Sprite3(img,-(xx1-x),-(yy1-y),0,doc_ce->bin_data->data);
@@ -671,9 +671,9 @@ U0 SMMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,I64 *_cur_elem_num)
CD3I32 *p;
I64 i,size,x1,y1,z1;
I32 *mesh,*old_mesh;
if (tmpg1!=head && tmpg1->type==SPT_MESH)
if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_MESH)
old_mesh=&tmpg1->mu.vertex_cnt;
else if (tmpg1!=head && tmpg1->type==SPT_SHIFTABLE_MESH) {
else if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {
x1=tmpg1->pmu.x;
y1=tmpg1->pmu.y;
z1=tmpg1->pmu.z;
@@ -700,7 +700,7 @@ U0 SMMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,I64 *_cur_elem_num)
SpriteEdUpdate(doc,doc_ce,head);
} else
*_cur_elem_num+=1;
} else if (old_mesh && tmpg1->type==SPT_SHIFTABLE_MESH) {
} else if (old_mesh && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {
x1=tmpg1->pmu.x;
y1=tmpg1->pmu.y;
z1=tmpg1->pmu.z;
@@ -721,7 +721,7 @@ U0 SMShiftableMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,
CD3I32 *p;
I64 i,size,z,x1,y1,z1;
I32 *mesh,*old_mesh;
if (tmpg1!=head && tmpg1->type==SPT_MESH) {
if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_MESH) {
z=0;
x1=-(a1-x);
y1=-(a2-y);
@@ -733,7 +733,7 @@ U0 SMShiftableMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,
p->z+=z1;
}
old_mesh=&tmpg1->mu.vertex_cnt;
} else if (tmpg1!=head && tmpg1->type==SPT_SHIFTABLE_MESH) {
} else if (tmpg1!=head && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {
z=-tmpg1->pmu.z;
x1=tmpg1->pmu.x-(a1-x);
y1=tmpg1->pmu.y-(a2-y);
@@ -766,7 +766,7 @@ U0 SMShiftableMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,
SpriteEdUpdate(doc,doc_ce,head);
} else
*_cur_elem_num+=1;
} else if (old_mesh && tmpg1->type==SPT_SHIFTABLE_MESH) {
} else if (old_mesh && tmpg1->type&SPG_TYPE_MASK==SPT_SHIFTABLE_MESH) {
x1=tmpg1->pmu.x-(a1-x);
y1=tmpg1->pmu.y-(a2-y);
z1=tmpg1->pmu.z+z;
@@ -776,7 +776,7 @@ U0 SMShiftableMesh(CDoc *doc,CDocEntry *doc_ce,CSprite *head,
p->y-=y1;
p->z-=z1;
}
} else if (old_mesh && tmpg1->type==SPT_MESH) {
} else if (old_mesh && tmpg1->type&SPG_TYPE_MASK==SPT_MESH) {
x1=-(a1-x);
y1=-(a2-y);
z1= z;
@@ -901,8 +901,8 @@ I64 SpriteMainEd(CDoc *doc)
case SPT_ED_MENU:
switch (SpriteEd(doc,doc_ce,x,y,&head,&cur_elem_num)) {
case SPE_ABORT: eletype=DOCM_CANCEL; break;
case SPE_EXIT: eletype=SPT_EXIT; break;
case SPE_CONT: eletype=SPT_MENU; break;
case SPE_EXIT: eletype=SPT_EXIT; break;
case SPE_CONT: eletype=SPT_MENU; break;
}
break;
case SPT_MESH:
@@ -1196,7 +1196,8 @@ U0 EdSpriteIns(CDoc *doc)
if (SpriteMainEd(doc)==SPE_ABORT) {
DocLock(doc);
DocEntryDel(doc,doc_e);
}
} else
SpriteSelAll(tmpb->data,FALSE);
} else
DocBinDel(doc,tmpb);
if (unlock)
@@ -1224,8 +1225,10 @@ U0 EdSpriteEd(CDoc *doc)
Free(tmpb->data);
tmpb->data=old_csprite;
tmpb->size=old_size;
} else
} else {
SpriteSelAll(tmpb->data,FALSE);
Free(old_csprite);
}
if (unlock)
DocUnlock(doc);
}
+18 -9
View File
@@ -38,13 +38,13 @@ I64 sprite_elem_base_sizes[SPT_NUM_TYPES]={
I64 SpriteElemQuedBaseSize(I64 type)
{
return sprite_elem_base_sizes[type]+offset(CSprite.start);
return sprite_elem_base_sizes[type&SPG_TYPE_MASK]+offset(CSprite.start);
}
I64 SpriteElemSize(CSprite *tmpg)
{
I64 i=sprite_elem_base_sizes[tmpg->type];
switch (tmpg->type) {
I64 i=sprite_elem_base_sizes[tmpg->type&SPG_TYPE_MASK];
switch (tmpg->type&SPG_TYPE_MASK) {
case SPT_POLYLINE:
i+=tmpg->nu.num*sizeof(CD2I32);
break;
@@ -80,7 +80,7 @@ I64 SpriteElemSize(CSprite *tmpg)
public I64 SpriteSize(U8 *elems)
{//Walk sprite elements and return size of sprite as binary data.
CSprite *tmpg=elems-offset(CSprite.start),*tmpg1=tmpg;
while (tmpg->type)
while (tmpg->type&SPG_TYPE_MASK)
tmpg(U8 *)+=SpriteElemSize(tmpg);
return tmpg(U8 *)-tmpg1(U8 *)+sprite_elem_base_sizes[SPT_END];
}
@@ -89,15 +89,24 @@ I64 SpriteTypeMask(U8 *elems)
{
I64 res=0;
CSprite *tmpg=elems-offset(CSprite.start);
while (tmpg->type) {
if (tmpg->type>=SPT_NUM_TYPES)
while (tmpg->type&SPG_TYPE_MASK) {
if (tmpg->type&SPG_TYPE_MASK>=SPT_NUM_TYPES)
return 1<<SPT_NUM_TYPES;
Bts(&res,tmpg->type);
Bts(&res,tmpg->type&SPG_TYPE_MASK);
tmpg(U8 *)+=SpriteElemSize(tmpg);
}
return res;
}
U0 SpriteSelAll(U8 *elems,Bool val)
{
CSprite *tmpg=elems-offset(CSprite.start);
while (tmpg->type&SPG_TYPE_MASK) {
BEqu(&tmpg->type,SPf_SEL,val);
tmpg(U8 *)+=SpriteElemSize(tmpg);
}
}
public U8 *DC2Sprite(CDC *tmpb)
{//Convert device context to sprite.
CSprite *tmpg;
@@ -118,8 +127,8 @@ public U8 *SpriteElem2Summary(CSprite *tmpg)
{//Study $LK,"::/Demo/Graphics/SpriteText.HC"$.
U8 buf[STR_LEN],buf2[STR_LEN];
I32 *ptr;
StrPrint(buf,"%Z",tmpg->type,"ST_SPRITE_ELEM_TYPES");
switch (tmpg->type) {
StrPrint(buf,"%Z",tmpg->type&SPG_TYPE_MASK,"ST_SPRITE_ELEM_TYPES");
switch (tmpg->type&SPG_TYPE_MASK) {
case SPT_COLOR:
CatPrint(buf," %s",Color2Str(buf2,tmpg->c.color));
break;