|
|
1.1 ! root 1: #include "frame.h" ! 2: ! 3: frdelete(f, p0, p1) ! 4: register Frame *f; ! 5: Posn p0, p1; ! 6: { ! 7: Point pt0, pt1, ppt0; ! 8: register Box *b; ! 9: register n0, n1, n; ! 10: Rectangle r; ! 11: int nn0; ! 12: if(p0>=f->nchars || p0==p1 || f->b==0) ! 13: return 0; ! 14: if(p1>f->nchars) ! 15: p1=f->nchars; ! 16: n0=findbox(f, 0, 0, p0); ! 17: n1=findbox(f, n0, p0, p1); ! 18: pt0=ptofcharnb(f, p0, n0); ! 19: pt1=ptofchar(f, p1); ! 20: if(f->p0!=p0 || f->p1!=p1) /* likely they ARE equal */ ! 21: selectp(f, F_XOR); /* can do better some day */ ! 22: selectf(f, pt0, pt1, F_CLR); ! 23: if(n0==f->nbox) ! 24: panic("off end in frdelete"); ! 25: nn0=n0; ! 26: ppt0=pt0; ! 27: freebox(f, n0, n1-1); ! 28: /* ! 29: * Invariants: ! 30: * pt0 points to beginning, pt1 points to end ! 31: * n0 is box containing beginning of stuff being deleted ! 32: * n1, b are box containing beginning of stuff to be kept after deletion ! 33: * region between pt0 and pt1 is clear ! 34: */ ! 35: b=&f->box[n1]; ! 36: while(pt1.x!=pt0.x && n1<f->nbox){ ! 37: cklinewrap0(f, &pt0, b); ! 38: cklinewrap(f, &pt1, b); ! 39: if(b->len>0){ ! 40: n=canfit(f, pt0, b); ! 41: if(n==0) ! 42: panic("canfit==0"); ! 43: if(n!=b->len){ ! 44: splitbox(f, n1, n); ! 45: b=&f->box[n1]; ! 46: } ! 47: r.origin=r.corner=pt1; ! 48: r.corner.x+=b->wid, r.corner.y+=f->font->height; ! 49: bitblt(B, r, B, pt0, F_STORE); ! 50: if(pt0.y==pt1.y) ! 51: r.origin.x=r.corner.x-(pt1.x-pt0.x); ! 52: rectf(B, r, F_CLR); ! 53: } ! 54: advance(f, &pt1, b); ! 55: pt0.x+=newwid(f, pt0, b); ! 56: f->box[n0++]=f->box[n1++]; ! 57: b++; ! 58: } ! 59: if(pt1.y!=pt0.y){ ! 60: Point pt2; ! 61: pt2=ptofcharptb(f, 32767, pt1, n1); ! 62: if(pt2.y>f->r.corner.y) ! 63: panic("ptofchar in frdelete"); ! 64: if(n1<f->nbox){ ! 65: int q0, q1, q2; ! 66: q0=pt0.y+f->font->height, q1=pt1.y+f->font->height; ! 67: q2=pt2.y+f->font->height; ! 68: bitblt(B, Rect(pt1.x, pt1.y, f->r.corner.x, q1), ! 69: B, pt0, F_STORE); ! 70: bitblt(B, Rect(f->r.origin.x, q1, f->r.corner.x, q2), ! 71: B, Pt(f->r.origin.x, q0), F_STORE); ! 72: selectf(f, Pt(pt2.x, pt2.y-(pt1.y-pt0.y)), pt2, F_CLR); ! 73: }else ! 74: selectf(f, pt0, pt2, F_CLR); ! 75: } ! 76: closebox(f, n0, n1-1); ! 77: if(nn0>0 && f->box[nn0-1].len>=0 && ppt0.x-f->box[nn0-1].wid>=(int)f->left){ ! 78: --nn0; ! 79: ppt0.x-=f->box[nn0].wid; ! 80: } ! 81: clean(f, ppt0, nn0, n0<f->nbox-1? n0+1 : n0); ! 82: if(f->p1>p1) ! 83: f->p1-=p1-p0; ! 84: else if(f->p1>p0) ! 85: f->p1=p0; ! 86: if(f->p0>p1) ! 87: f->p0-=p1-p0; ! 88: else if(f->p0>p0) ! 89: f->p0=p0; ! 90: selectp(f, F_XOR); ! 91: f->nchars-=p1-p0; ! 92: if(pt0.x!=pt1.x) ! 93: f->lastlinefull=pt0.x==f->left; ! 94: pt0=ptofchar(f, f->nchars); ! 95: n=f->nlines; ! 96: f->nlines=(pt0.y-f->r.origin.y)/f->font->height+(pt0.x>f->left); ! 97: return n-f->nlines; ! 98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.