hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Graphics/Sprite;Sprites"3#help_file "::/Doc/Sprite"4 5U8 polypt_map[9]={0,1,2,3,0,4,5,6,7};6 7I64 sprite_elem_base_sizes[SPT_TYPES_NUM]={8 sizeof(CSpriteBase), //SPT_END9 sizeof(CSpriteColor), //SPT_COLOR10 sizeof(CSpriteDitherColor), //SPT_DITHER_COLOR11 sizeof(CSpriteT), //SPT_THICK12 sizeof(CSpritePtPt), //SPT_PLANAR_SYMMETRY13 sizeof(CSpriteBase), //SPT_TRANSFORM_ON14 sizeof(CSpriteBase), //SPT_TRANSFORM_OFF15 sizeof(CSpritePt), //SPT_SHIFT16 sizeof(CSpritePt), //SPT_PT17 sizeof(CSpriteNumPtU8s), //SPT_POLYPT18 sizeof(CSpritePtPt), //SPT_LINE19 sizeof(CSpriteNumU8s), //SPT_POLYLINE20 sizeof(CSpritePtPt), //SPT_RECT21 sizeof(CSpritePtPtAng), //SPT_ROTATED_RECT22 sizeof(CSpritePtRad), //SPT_CIRCLE23 sizeof(CSpritePtWHAng), //SPT_ELLIPSE24 sizeof(CSpritePtWHAngSides), //SPT_POLYGON25 sizeof(CSpriteNumU8s), //SPT_BSPLINE226 sizeof(CSpriteNumU8s), //SPT_BSPLINE2_CLOSED27 sizeof(CSpriteNumU8s), //SPT_BSPLINE328 sizeof(CSpriteNumU8s), //SPT_BSPLINE3_CLOSED29 sizeof(CSpritePt), //SPT_FLOOD_FILL30 sizeof(CSpritePt), //SPT_FLOOD_FILL_NOT31 sizeof(CSpritePtWHU8s), //SPT_BITMAP32 sizeof(CSpriteMeshU8s), //SPT_MESH33 sizeof(CSpritePtMeshU8s), //SPT_SHIFTABLE_MESH34 sizeof(CSpritePtPt), //SPT_ARROW35 sizeof(CSpritePtStr), //SPT_TEXT36 sizeof(CSpritePtStr), //SPT_TEXT_BOX37 sizeof(CSpritePtStr), //SPT_TEXT_DIAMOND38};39 40I64 SpriteElemQuedBaseSize(I64 type)41{42 return sprite_elem_base_sizes[type&SPG_TYPE_MASK]+offset(CSprite.start);43}44 45I64 SpriteElemSize(CSprite *tmpg)46{47 I64 i=sprite_elem_base_sizes[tmpg->type&SPG_TYPE_MASK];48 switch (tmpg->type&SPG_TYPE_MASK) {49 case SPT_POLYLINE:50 i+=tmpg->nu.num*sizeof(CD2I32);51 break;52 case SPT_TEXT:53 case SPT_TEXT_BOX:54 case SPT_TEXT_DIAMOND:55 i+=StrLen(tmpg->ps.st)+1;56 break;57 case SPT_BITMAP:58 i+=((tmpg->pwhu.width+7)&~7)*tmpg->pwhu.height;59 break;60 case SPT_POLYPT:61 i+=(tmpg->npu.num*3+7)>>3;62 break;63 case SPT_BSPLINE2:64 case SPT_BSPLINE3:65 case SPT_BSPLINE2_CLOSED:66 case SPT_BSPLINE3_CLOSED:67 i+=tmpg->nu.num*sizeof(CD3I32);68 break;69 case SPT_MESH:70 i+=tmpg->mu.vertex_cnt*sizeof(CD3I32)+71 tmpg->mu.tri_cnt*sizeof(CMeshTri);72 break;73 case SPT_SHIFTABLE_MESH:74 i+=tmpg->pmu.vertex_cnt*sizeof(CD3I32)+75 tmpg->pmu.tri_cnt*sizeof(CMeshTri);76 break;77 }78 return i;79}80 81public I64 SpriteSize(U8 *elems)82{//Walk sprite elements and return size of sprite as binary data.83 CSprite *tmpg=elems-offset(CSprite.start),*tmpg1=tmpg;84 while (tmpg->type&SPG_TYPE_MASK)85 tmpg(U8 *)+=SpriteElemSize(tmpg);86 return tmpg(U8 *)-tmpg1(U8 *)+sprite_elem_base_sizes[SPT_END];87}88 89I64 SpriteTypeMask(U8 *elems)90{91 I64 res=0;92 CSprite *tmpg=elems-offset(CSprite.start);93 while (tmpg->type&SPG_TYPE_MASK) {94 if (tmpg->type&SPG_TYPE_MASK>=SPT_TYPES_NUM)95 return 1<<SPT_TYPES_NUM;96 Bts(&res,tmpg->type&SPG_TYPE_MASK);97 tmpg(U8 *)+=SpriteElemSize(tmpg);98 }99 return res;100}101 102U0 SpriteSelAll(U8 *elems,Bool val)103{104 CSprite *tmpg=elems-offset(CSprite.start);105 while (tmpg->type&SPG_TYPE_MASK) {106 BEqu(&tmpg->type,SPf_SEL,val);107 tmpg(U8 *)+=SpriteElemSize(tmpg);108 }109}110 111public U8 *DC2Sprite(CDC *tmpb)112{//Convert device context to sprite.113 CSprite *tmpg;114 tmpg=CAlloc(sprite_elem_base_sizes[SPT_BITMAP]+115 tmpb->width_internal*tmpb->height+116 sprite_elem_base_sizes[SPT_END])117 (U8 *)-offset(CSprite.start);118 tmpg->type=SPT_BITMAP;119 tmpg->pwhu.width=tmpb->width;120 tmpg->pwhu.height=tmpb->height;121 tmpg->pwhu.x1=0;122 tmpg->pwhu.y1=0;123 MemCpy(&tmpg->pwhu.u,tmpb->body,tmpb->width_internal*tmpb->height);124 return tmpg(U8 *)+offset(CSprite.start);125}126 127public U8 *SpriteElem2Summary(CSprite *tmpg)128{//Study ::/Demo/Graphics/SpriteText.HC.129 U8 buf[STR_LEN],buf2[STR_LEN];130 I32 *ptr;131 StrPrint(buf,"%Z",tmpg->type&SPG_TYPE_MASK,"ST_SPRITE_ELEM_TYPES");132 switch (tmpg->type&SPG_TYPE_MASK) {133 case SPT_COLOR:134 CatPrint(buf," %s",Color2Str(buf2,tmpg->c.color));135 break;136 case SPT_DITHER_COLOR:137 CatPrint(buf," %s",Color2Str(buf2,ROPF_DITHER|tmpg->d.dither_color.u8[0]|138 tmpg->d.dither_color.u8[1]<<COLORROP_BITS));139 break;140 case SPT_PT:141 case SPT_FLOOD_FILL:142 case SPT_FLOOD_FILL_NOT:143 case SPT_SHIFT:144 CatPrint(buf," (%d,%d)",tmpg->p.x1,tmpg->p.y1);145 break;146 case SPT_LINE:147 case SPT_ARROW:148 case SPT_PLANAR_SYMMETRY:149 case SPT_RECT:150 case SPT_ROTATED_RECT:151 CatPrint(buf," (%d,%d),(%d,%d)",tmpg->pp.x1,tmpg->pp.y1,152 tmpg->pp.x2,tmpg->pp.y2);153 break;154 case SPT_CIRCLE:155 CatPrint(buf," (%d,%d):%dR",tmpg->pr.x1,tmpg->pr.y1,tmpg->pr.radius);156 break;157 case SPT_THICK:158 CatPrint(buf," %d",tmpg->t.thick);159 break;160 case SPT_TEXT:161 case SPT_TEXT_BOX:162 case SPT_TEXT_DIAMOND:163 CatPrint(buf," %d,%d:%-16t$Q",tmpg->ps.x1,tmpg->ps.y1,tmpg->ps.st);164 break;165 case SPT_POLYLINE:166 case SPT_POLYPT:167 ptr=&tmpg->npu.x;168 CatPrint(buf," %d (%d,%d)",tmpg->npu.num,ptr[0],ptr[1]);169 break;170 case SPT_ELLIPSE:171 case SPT_POLYGON:172 case SPT_BITMAP:173 CatPrint(buf," (%d,%d):%dW,%dH",tmpg->pwhu.x1,tmpg->pwhu.y1,174 tmpg->pwhu.width,tmpg->pwhu.height);175 break;176 case SPT_BSPLINE2:177 case SPT_BSPLINE3:178 case SPT_BSPLINE2_CLOSED:179 case SPT_BSPLINE3_CLOSED:180 CatPrint(buf," %d",tmpg->nu.num);181 break;182 case SPT_MESH:183 CatPrint(buf," %dV,%dT",tmpg->mu.vertex_cnt,tmpg->mu.tri_cnt);184 break;185 case SPT_SHIFTABLE_MESH:186 CatPrint(buf," %dV,%dT",tmpg->pmu.vertex_cnt,tmpg->pmu.tri_cnt);187 break;188 }189 return StrNew(buf);190}191 