Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
SpriteNew.txt191 linesDownload Raw Back to Gr
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