Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
GrComposites.txt346 linesDownload Raw Back to Gr
1 2#help_index "Graphics"3public I64 GrFillPoly3(CDC *dc=gr.dc,I64 n,CD3I32 *poly)4{//3D. Must be convex.5//Returns cnt of pixs changed6  CD3I32 tri[3];7  I64 i,j,x,y,z,res=0;8  if (n<3) return 0;9  if (dc->flags & DCF_SYMMETRY) {10    for (i=1;i<n-1;i++) {11      j=i-1;12      if (i==1) {13        x=poly[j].x; y=poly[j].y; z=poly[j].z;14        if (dc->flags&DCF_TRANSFORMATION)15          (*dc->transform)(dc,&x,&y,&z);16        DCReflect(dc,&x,&y,&z);17        tri[0].x=x; tri[0].y=y; tri[0].z=z;18      }19 20      j++;21      if (i==1) {22        x=poly[j].x; y=poly[j].y; z=poly[j].z;23        if (dc->flags&DCF_TRANSFORMATION)24          (*dc->transform)(dc,&x,&y,&z);25        DCReflect(dc,&x,&y,&z);26      }27      tri[1].x=x; tri[1].y=y; tri[1].z=z;28 29      j++;30      x=poly[j].x; y=poly[j].y; z=poly[j].z;31      if (dc->flags&DCF_TRANSFORMATION)32        (*dc->transform)(dc,&x,&y,&z);33      DCReflect(dc,&x,&y,&z);34      tri[2].x=x; tri[2].y=y; tri[2].z=z;35 36      res+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);37    }38  }39  if (dc->flags&DCF_JUST_MIRROR)40    return res;41  for (i=1;i<n-1;i++) {42    j=i-1;43    if (i==1) {44      x=poly[j].x; y=poly[j].y; z=poly[j].z;45      if (dc->flags&DCF_TRANSFORMATION)46        (*dc->transform)(dc,&x,&y,&z);47      tri[0].x=x; tri[0].y=y; tri[0].z=z;48    }49 50    j++;51    if (i==1) {52      x=poly[j].x; y=poly[j].y; z=poly[j].z;53      if (dc->flags&DCF_TRANSFORMATION)54        (*dc->transform)(dc,&x,&y,&z);55    }56    tri[1].x=x; tri[1].y=y; tri[1].z=z;57 58    j++;59    x=poly[j].x; y=poly[j].y; z=poly[j].z;60    if (dc->flags&DCF_TRANSFORMATION)61      (*dc->transform)(dc,&x,&y,&z);62    tri[2].x=x; tri[2].y=y; tri[2].z=z;63 64    res+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);65  }66  return res;67}68 69public I64 GrRectB(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2)70{//2D. Two point. Clipping but not transformation.71  if (x2<x1) SwapI64(&x1,&x2);72  if (y2<y1) SwapI64(&y1,&y2);73  return GrRect(dc,x1,y1,x2-x1+1,y2-y1+1);74}75 76public I64 GrRect3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,I64 w,I64 h)77{//3D. Width Height. Clipping and transformation.78  CD3I32 poly[4];79  poly[0].x=x;80  poly[0].y=y;81  poly[0].z=z;82  poly[1].x=x+w;83  poly[1].y=y;84  poly[1].z=z;85  poly[2].x=x+w;86  poly[2].y=y+h;87  poly[2].z=z;88  poly[3].x=x;89  poly[3].y=y+h;90  poly[3].z=z;91  return GrFillPoly3(dc,4,poly);92}93 94public U0 GrBorder(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,95        I64 step=1,I64 start=0)96{//2D. Transformation with thick.97//Can be used with ROPF_DITHER+WHITE<<16+BLACK for dotted rect.98  GrLine3(dc,x1,y1,0,x2,y1,0,step,start);99  GrLine3(dc,x2,y1,0,x2,y2,0,step,start);100  GrLine3(dc,x2,y2,0,x1,y2,0,step,start);101  GrLine3(dc,x1,y2,0,x1,y1,0,step,start);102}103 104public Bool GrArrow3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,105        I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0)106{//3D. Transformation with thick.107  I64 _x1,_y1,_z1,_x2,_y2,_z2,dx,dy;108  F64 d;109  Bool res=FALSE,was_transform=FALSE,was_symmetry=FALSE;110  if (dc->flags & DCF_TRANSFORMATION) {111    (*dc->transform)(dc,&x1,&y1,&z1);112    (*dc->transform)(dc,&x2,&y2,&z2);113    dc->flags&=~DCF_TRANSFORMATION;114    was_transform=TRUE;115  }116  if (dc->flags & DCF_SYMMETRY) {117    _x1=x1; _y1=y1; _z1=z1;118    DCReflect(dc,&_x1,&_y1,&_z1);119    _x2=x2; _y2=y2; _z2=z2;120    DCReflect(dc,&_x2,&_y2,&_z2);121    dc->flags&=~DCF_SYMMETRY;122    res=Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start);123    dx=_x2-_x1; dy=_y2-_y1;124    if (d=Sqrt(dx*dx+dy*dy)) {125      d=w*dc->thick/d;126      res|=Line(dc,_x2-dx*d+dy*d+0.5,_y2-dy*d-dx*d+0.5,_z2,127            _x2,_y2,_z2,&GrPlot3,step);128      res|=Line(dc,_x2-dx*d-dy*d+0.5,_y2-dy*d+dx*d+0.5,_z2,129            _x2,_y2,_z2,&GrPlot3,step);130    }131    was_symmetry=TRUE;132    if (dc->flags&DCF_JUST_MIRROR)133      goto gr_done;134  }135  res|=Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start);136  dx=x2-x1; dy=y2-y1;137  if (d=Sqrt(dx*dx+dy*dy)) {138    d=w*dc->thick/d;139    res|=Line(dc,x2-dx*d+dy*d+0.5,y2-dy*d-dx*d+0.5,z2,140          x2,y2,z2,&GrPlot3,step);141    res|=Line(dc,x2-dx*d-dy*d+0.5,y2-dy*d+dx*d+0.5,z2,142          x2,y2,z2,&GrPlot3,step);143  }144gr_done:145  if (was_transform)146    dc->flags|=DCF_TRANSFORMATION;147  if (was_symmetry)148    dc->flags|=DCF_SYMMETRY;149  return res;150}151 152#help_index "Graphics/Char;Char/Graphics"153public Bool GrTextBox3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)154{//3D. Transformation. DCF_SYMMETRY is silly.155  U8 *ptr;156  I64 ch,res,w,w_max,h;157  if (!s) return FALSE;158  ptr=s;159  w=0;  w_max=0; h=FONT_HEIGHT;160 161  if (dc->flags & DCF_TRANSFORMATION)162    (*dc->transform)(dc,&x1,&y1,&z1);163  while (ch=*ptr++) {164    if (ch=='\t')165      w=CeilU64(w+FONT_WIDTH,FONT_WIDTH*8);166    else if (ch=='\n') {167      if (w>w_max) w_max=w;168      w=0;169      h+=FONT_HEIGHT;170    } else171      w+=FONT_WIDTH;172  }173  if (w>w_max) w_max=w;174  res=GrPrint(dc,x1,y1,"%s",s);175  res|=GrLine(dc,x1-border         ,y1-border  ,x1+w_max+border,y1-border);176  res|=GrLine(dc,x1-border         ,y1+h+border,x1+w_max+border,y1+h+border);177  res|=GrLine(dc,x1-border         ,y1-border  ,x1-border,y1+h+border);178  res|=GrLine(dc,x1+w_max+border,y1-border  ,x1+w_max+border,y1+h+border);179  return ToBool(res);180}181 182#define DIAMOND_SLOPE_MAX       2.75183 184public Bool GrTextDiamond3(CDC *dc=gr.dc,185        I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)186{//3D. Transformation. DCF_SYMMETRY is silly.187  Bool first=TRUE;188  U8 ch,*ptr,*ptr_end,*st,*s;189  I64 res=0,y,dx,dy,dx_old,dy_old,w,h=FONT_HEIGHT;190  F64 m;191  if (!_s) return FALSE;192  if (dc->flags & DCF_TRANSFORMATION)193    (*dc->transform)(dc,&x1,&y1,&z1);194 195  ptr=s=StrNew(_s);196  while (ch=*ptr) {197    if (ch=='\r'||ch=='\t')198      *ptr=CH_SPACE;199    if (ch=='\n') {200      *ptr=0;201      h+=FONT_HEIGHT;202    }203    ptr++;204  }205  ptr_end=ptr+1;206 207  y=y1-h>>1;208  dx=FONT_WIDTH +border;      //Minimum209  dy=FONT_HEIGHT+border+h>>1; //Minimum210  ptr=s;211  while (ptr!=ptr_end) {212    st=ptr;213    while (*ptr++);214    StrUtil(st,SUF_REM_LEADING|SUF_REM_TRAILING);215 216    w=(StrLen(st)*FONT_WIDTH)>>1;217    if (first) {218      res|=GrPrint(dc,x1-w,y,"%s",st);219      first=FALSE;220    } else221      res|=GrPrint(dc,x1-w,y,"%s",st);222    if (w) {223      w+=border;224      do {225        dx_old=dx; dy_old=dy;226        m=ToF64(dx)/dy;227        if (m<1/DIAMOND_SLOPE_MAX) {228          dy=MaxI64(dy,Ceil(DIAMOND_SLOPE_MAX*dx));229          m=1/DIAMOND_SLOPE_MAX;230        } else if (m>DIAMOND_SLOPE_MAX) {231          dy=MaxI64(dy,Ceil(dx/DIAMOND_SLOPE_MAX));232          m=DIAMOND_SLOPE_MAX;233        }234        dx=MaxI64(dx,w+Ceil(m*AbsI64(y-y1)));235        dx=MaxI64(dx,w+Ceil(m*AbsI64(y+FONT_HEIGHT-y1)));236      } while (dx!=dx_old || dy!=dy_old);237    }238    y+=FONT_HEIGHT;239  }240  Free(s);241 242  res|=GrLine(dc,x1,y1-dy,x1+dx,y1);243  res|=GrLine(dc,x1+dx,y1,x1,y1+dy);244  res|=GrLine(dc,x1,y1+dy,x1-dx,y1);245  res|=GrLine(dc,x1-dx,y1,x1,y1-dy);246  return ToBool(res);247}248 249#help_index "Graphics/Mesh"250public I64 Gr3Mesh(CDC *dc=gr.dc,I64 vertex_cnt,CD3I32 *p,251        I64 tri_cnt,CMeshTri *tri)252{//Returns cnt of pixs changed.253  CColorROPU32 old_color=dc->color;254  I64 i,x,y,z,res=0;255  CD3I32 *pt,*pt_sym,*p_sym,*dst;256  CMeshTri *tri_sym=tri;257  if (dc->flags&DCF_TRANSFORMATION) {258    dst=pt=MAlloc(sizeof(CD3I32)*vertex_cnt);259    for (i=0;i<vertex_cnt;i++,p++,dst++) {260      x=p->x; y=p->y; z=p->z;261      (*dc->transform)(dc,&x,&y,&z);262      dst->x=x; dst->y=y; dst->z=z;263    }264    p=pt;265  } else266    pt=NULL;267 268  if (dc->flags & DCF_SYMMETRY) {269    dst=pt_sym=MAlloc(sizeof(CD3I32)*vertex_cnt);270    p_sym=p;271    for (i=0;i<vertex_cnt;i++,p_sym++,dst++) {272      x=p_sym->x; y=p_sym->y; z=p_sym->z;273      DCReflect(dc,&x,&y,&z);274      dst->x=x; dst->y=y; dst->z=z;275    }276    p_sym=pt_sym;277    for (i=0;i<tri_cnt;i++,tri_sym++) {278      (*dc->lighting)(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],279            &p_sym[tri_sym->nums[1]],tri_sym->color);280      res+=GrFillTri0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],281            &p_sym[tri_sym->nums[1]]);282    }283    Free(pt_sym);284    if (dc->flags&DCF_JUST_MIRROR)285      goto mesh_done;286  }287  for (i=0;i<tri_cnt;i++,tri++) {288    (*dc->lighting)(dc,&p[tri->nums[0]],&p[tri->nums[1]],289          &p[tri->nums[2]],tri->color);290    res+=GrFillTri0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]);291  }292mesh_done:293  dc->color=old_color;294  Free(pt);295  return res;296}297 298#help_index "Graphics/Misc;Mouse/Ptr"299public U0 DrawStdMs(CDC *dc,I64 x,I64 y)300{//This is a callback. See ::/Demo/Graphics/Grid.HC.301//Called by DrawMs() which is302  //called by WinFinalUpdate().303  dc->thick=1;304  dc->flags&=~(DCF_TRANSFORMATION|DCF_SYMMETRY);305  GrArrow3(dc,x+8,y+8,0,x,y,0);306}307 308gr.fp_draw_ms=&DrawStdMs;309 310public U0 DrawWaitMs(CDC *dc,I64 x,I64 y)311{//This is a callback. See ::/Demo/Graphics/Grid.HC.312  I64 old_pen_width=dc->thick;313  CColorROPU32 old_color=dc->color;314  dc->thick=3;315  dc->color=LTRED;316  GrCircle3(dc,x,y,0,7);317  GrLine3(dc,x-6,y+6,0,x+6,y-6,0);318  dc->color=RED;319  GrCircle(dc,x,y,7);320  GrLine(dc,x-6,y+6,x+6,y-6);321  dc->thick=old_pen_width;322  dc->color=old_color;323}324 325#help_index "Graphics/GR Files;Graphics/Scrn"326public Bool GRScrnCaptureRead(U8 *filename,CDC *dc=gr.dc,I64 x=0,I64 y=0)327{//GrBlot TempleOS GR File to dc,x,y.328  CDC *dc2;329  if (dc2=GRRead(filename)) {330    dc->color=ROP_EQU;331    GrBlot(dc,x,y,dc2);332    DCDel(dc2);333    return TRUE;334  }335  return FALSE;336}337 338public I64 GRScrnCaptureWrite(U8 *filename,Bool include_zoom=TRUE)339{//Capture scrn to a TempleOS GR File.340  I64 size;341  CDC *dc=DCScrnCapture(include_zoom);342  size=GRWrite(filename,dc,DCSF_COMPRESSED|DCSF_PALETTE_GET);343  DCDel(dc);344  return size;345}346