Annotation of researchv9/jtools/src/pads/x11/paint.c, revision 1.1

1.1     ! root        1: #include "univ.h"
        !             2: #define PADBORDER 3
        !             3: #define CHARWIDTH fontwidth(&defont)
        !             4: 
        !             5: Line *Lsent;
        !             6: Rectangle Trect;
        !             7: Attrib Attributes;
        !             8: int CharsWide;
        !             9: Line FakeLine;
        !            10: Bitmap *Osbm;
        !            11: char Tilde;
        !            12: 
        !            13: DoubleOutline(b,r)
        !            14: register Bitmap *b;
        !            15: Rectangle r;
        !            16: {
        !            17:        outline(b,r);
        !            18:        outline(b,inset(r,1));
        !            19: }
        !            20: 
        !            21: HeavyBorder( p )
        !            22: register Pad *p;
        !            23: {
        !            24:        DoubleOutline( &display, inset(p->rect,PADBORDER+1) );
        !            25: }
        !            26: 
        !            27: Line *Linei(i)
        !            28: register i;
        !            29: {
        !            30:        register Line *lsent = Lsent, *l;
        !            31:        register long ct = 1, k = lsent->key;
        !            32:        Line fake;
        !            33: 
        !            34:        if( !i ) return lsent;
        !            35:        for( l = lsent->down; l != lsent; l = l->down, ++ct )
        !            36:                if( k ? (l->key==i) : (ct==i) )
        !            37:                        return l;
        !            38:        if( k && i<=k ){
        !            39:                FakeLine.key = i;
        !            40:                *(FakeLine.text = itoa((int)i)) = Tilde;
        !            41:                return &FakeLine;
        !            42:        }
        !            43:        return 0;
        !            44: }
        !            45: 
        !            46: Trunc(l)
        !            47: Line *l;
        !            48: {
        !            49:        int a;
        !            50:        return (a=l->attributes)&(FOLD|TRUNCATE) ? a&TRUNCATE : Attributes&TRUNCATE;
        !            51: }
        !            52: 
        !            53: int Expanded;
        !            54: short Tabs = 8;
        !            55: Expand( blanks, tabs )
        !            56: register char *blanks, *tabs;
        !            57: {
        !            58:        register int i, c;
        !            59: 
        !            60:        for( i = 0; (c = *tabs++) && i<250; )
        !            61:                if( c == '\t' )
        !            62:                        do
        !            63:                                blanks[i++] = ' ';
        !            64:                        while( i % Tabs );
        !            65:                else
        !            66:                        blanks[i++] = c;
        !            67:        if( i==0 ) blanks[i++] = ' ';
        !            68:        blanks[i] = '\0';
        !            69:        Expanded = i;
        !            70: }
        !            71: 
        !            72: Needs(i)
        !            73: {
        !            74:        register Line *l = Linei(i);
        !            75:        char blanks[256];
        !            76: 
        !            77:        if( Trunc(l) ) return 1;
        !            78:        Expand( blanks, l->text );
        !            79:        return 1 + (Expanded-1)/CharsWide;
        !            80: }
        !            81: 
        !            82: #define BARWIDTH 10
        !            83: static Rectangle bar;
        !            84: 
        !            85: int ClipPaint(clip,p)                  /* nobody said it would be easy */
        !            86: register Pad *p;
        !            87: Rectangle clip;
        !            88: {
        !            89:        register middle, lines, lo, hi, capacity;
        !            90:        int change, i, selpainted;
        !            91:        register Line *lsent, *l;
        !            92:        char save, *terminate, blanks[256];
        !            93:        Point pt;
        !            94: 
        !            95:        Tabs = p->tabs;
        !            96:        Attributes = p->attributes;
        !            97:        Tilde = Attributes&NO_TILDE ? 0 : '~';
        !            98:        Lsent = lsent = &p->sentinel;
        !            99:        if( !PadSized(p->rect) ) return 1;
        !           100: 
        !           101:        p->srect = Trect = inset( p->rect, PADBORDER+4 );
        !           102:        p->srect.corner.x = (Trect.origin.x += BARWIDTH);
        !           103:        Trect.origin.x += 2;
        !           104:        p->srect.origin.y -= 1;
        !           105:        p->srect.corner.y += 1;
        !           106:        p->srect.origin.x -= 1;
        !           107: 
        !           108:        capacity = (Trect.corner.y-Trect.origin.y) /
        !           109:                fontheight(&defont);
        !           110:        CharsWide = (Trect.corner.x-Trect.origin.x) / CHARWIDTH - 1;
        !           111: 
        !           112:        middle = lines = 0;
        !           113:        for( l = lsent->down; l != lsent; l = l->down ){
        !           114:                ++lines;
        !           115:                if( l == Selected.line && rectinrect(p->rect,clip) )
        !           116:                        middle = lsent->key ? Selected.line->key : lines;
        !           117:        }
        !           118:        if( lsent->key ) lines = lsent->key;
        !           119:        if( Scrolly ){
        !           120:                Scrolly -= p->srect.origin.y;
        !           121:                middle = 1 +
        !           122:                        muldiv(Scrolly,lines,p->srect.corner.y-p->srect.origin.y);
        !           123:                if( middle > lines ) middle = lines;
        !           124:        }
        !           125:        if( !middle ){
        !           126:                middle = (p->lo+p->hi)/2;
        !           127:                if( middle<1 || middle>lines )
        !           128:                        middle = lsent->key ? 1 : lines;
        !           129:        }
        !           130:        lo = middle+1;
        !           131:        hi = middle;
        !           132:        do {
        !           133:                change = 0;
        !           134:                if( lo>0 && capacity>=Needs(lo-1)){
        !           135:                        capacity -= Needs(--lo);
        !           136:                        change = 1;
        !           137:                }
        !           138:                if( hi<lines && capacity>=Needs(hi+1)){
        !           139:                        capacity -= Needs(++hi);
        !           140:                        change = 1;
        !           141:                }
        !           142:        } while( change );
        !           143:        if( lo>hi ){
        !           144:                Selected.line = 0;
        !           145:                return 1;
        !           146:        }
        !           147:        if( Scrolly && lo==p->lo && hi==p->hi ) return 1;
        !           148:        p->lo = lo;
        !           149:        p->hi = hi;
        !           150:        for( l = lsent->down; l != lsent; l = l->down )
        !           151:                l->rect = ZRectangle;
        !           152:        if( Osbm && !eqrect(Osbm->rect,p->rect) && Osbm!=&display ){
        !           153:                bfree(Osbm);
        !           154:                Osbm = 0;
        !           155:        }
        !           156:        if( !Osbm && !(Osbm = balloc(p->rect)) ) Osbm = &display;
        !           157:        rectf( Osbm, p->rect, F_CLR );
        !           158:        DoubleOutline( Osbm, inset(p->rect, PADBORDER-1) );
        !           159:        if( p == Current ) DoubleOutline( Osbm, inset(p->rect,PADBORDER+1) );
        !           160:        rectf( Osbm, bar = scrollbar(p->srect,lo,hi+1,0,lines+1), F_XOR );
        !           161:        pt = Trect.origin;
        !           162:        selpainted = 0;
        !           163:        for( ; lo <= hi; ++lo ){
        !           164:                l = Linei(lo);
        !           165:                l->rect.origin = pt;
        !           166:                Expand( blanks, l->text );
        !           167:                for( i = 0; i < Expanded; i += CharsWide ){
        !           168:                        if( i ){
        !           169:                                if( Trunc(l) ) break;
        !           170:                                pt.x += CHARWIDTH;
        !           171:                        }
        !           172:                        save = '\0';
        !           173:                        if( i+CharsWide < Expanded ){
        !           174:                                save = *(terminate=blanks+i+CharsWide);
        !           175:                                *terminate = '\0';
        !           176:                        }
        !           177:                        string( &defont, blanks+i, Osbm, pt, F_OR );
        !           178:                        pt.x = Trect.origin.x;
        !           179:                        l->rect.corner.y = (pt.y += fontheight(&defont));
        !           180:                        l->rect.corner.x = Trect.corner.x;
        !           181:                        if( save ) *terminate = save;
        !           182:                }
        !           183:                if( Selected.line == l ){
        !           184:                        rectf( Osbm, l->rect, F_XOR );  /* LineXOR(l); */
        !           185:                        selpainted = 1;
        !           186:                }
        !           187:        }
        !           188:        if( !selpainted && Selected.pad == p ) Selected.line = 0;
        !           189:        if( !Scrolly ) RequestLines(p);
        !           190:        if( Osbm != &display )
        !           191:        {
        !           192:                Rectangle clipsrc;
        !           193:                clipsrc = clip;
        !           194:                rectclip(&clipsrc,Osbm->rect);
        !           195:                PadBlt( Osbm, clipsrc, p->front );
        !           196:                return 1;
        !           197: /*             bitblt( Osbm, clipsrc, &display, clipsrc.origin, F_STORE );*/
        !           198:        }
        !           199:        return 0;
        !           200: }
        !           201: 
        !           202: #define rc (r.corner)
        !           203: #define ro (r.origin)
        !           204: #define pc (p->rect.corner)
        !           205: #define po (p->rect.origin)
        !           206: 
        !           207: PadBlt(b,r,p)
        !           208: register Bitmap *b;
        !           209: Rectangle r;
        !           210: register Pad *p;
        !           211: {
        !           212:        extern Pad Sentinel;
        !           213: 
        !           214:        if( p == &Sentinel ){
        !           215:                bitblt( b, r, &display, r.origin, F_STORE );
        !           216:                return;
        !           217:        }
        !           218:        if( !rectXrect(p->rect, r) ){
        !           219:                PadBlt( b, r, p->front );
        !           220:                return;
        !           221:        }
        !           222:        if(ro.y < po.y){
        !           223:                PadBlt( b, Rpt(ro,Pt(rc.x,po.y)), p->front );
        !           224:                ro.y = po.y;
        !           225:        }
        !           226:        if(rc.y > pc.y){
        !           227:                PadBlt( b, Rpt(Pt(ro.x,pc.y),rc), p->front );
        !           228:                rc.y = pc.y;
        !           229:        }
        !           230:        if(ro.x < po.x){
        !           231:                PadBlt( b, Rpt(ro,Pt(po.x,rc.y)), p->front );
        !           232:                ro.x = po.x;
        !           233:        }
        !           234:        if(rc.x > pc.x){
        !           235:                PadBlt( b, Rpt(Pt(pc.x,ro.y),rc), p->front );
        !           236:                rc.x = pc.x;
        !           237:        }
        !           238: }
        !           239: 
        !           240: Paint(p)
        !           241: Pad *p;
        !           242: {
        !           243:        ClipPaint(p->rect,p);
        !           244: }
        !           245: 
        !           246: LineReq(p, lo, hi, fake)
        !           247: register Pad *p;
        !           248: register long lo, hi;
        !           249: {
        !           250:        Line *InsPos();
        !           251: 
        !           252:        if( lo == 0 ) lo = 1;
        !           253:        if( !p || !p->object || hi < lo ) return;
        !           254:        PutRemote( P_LINEREQ );
        !           255:        SendLong( p->object );
        !           256:        SendLong( p->object );
        !           257:        SendLong( lo );
        !           258:        SendLong( hi );
        !           259:        if( fake )
        !           260:                for( FakeLine.key = lo; FakeLine.key <= hi; ++FakeLine.key ){
        !           261:                        *(FakeLine.text = itoa((int)FakeLine.key)) = Tilde;
        !           262:                        InsAbove(InsPos(p,&FakeLine),&FakeLine);
        !           263:                }
        !           264: }
        !           265:        
        !           266: CRequestLines(p)
        !           267: register Pad *p;
        !           268: {
        !           269:        register Line *l;
        !           270:        register reqhi = -1, reqlo = 0, k, i;
        !           271: 
        !           272:        for( i = p->lo; i <= p->hi; ++i ){
        !           273:                l = Linei(i);
        !           274:                k = l->key;
        !           275:                if( l->attributes&FAKELINE ){
        !           276:                        l->attributes &= ~FAKELINE;
        !           277:                        if( k == reqhi+1 )
        !           278:                                reqhi = k;
        !           279:                        else {
        !           280:                                LineReq(p, reqlo, reqhi, 0);
        !           281:                                reqlo = reqhi = k;
        !           282:                        }
        !           283:                }
        !           284:        }
        !           285:        LineReq(p, reqlo, reqhi, 0);
        !           286: }
        !           287: 
        !           288: RequestLines(p)
        !           289: register Pad *p;
        !           290: {
        !           291:        register Line *lsent = Lsent, *l;
        !           292:        register reqlo, cutlo, cuthi, k, cushion;
        !           293: 
        !           294:        if( !lsent || !p ) return;
        !           295:        if( !lsent->key ){
        !           296:                if( p->attributes&FAKELINE )
        !           297:                        CRequestLines(p);
        !           298:                return;
        !           299:        }
        !           300:        cushion = Configuration&BIGMEMORY ? 1000 : 10;
        !           301:        reqlo = p->lo;
        !           302:        cutlo = p->lo - cushion;
        !           303:        cuthi = p->hi + cushion;
        !           304:        for( l = lsent->down; l != lsent; l = l->down ){
        !           305:                k = l->key;
        !           306:                if( k>=reqlo && k<=p->hi ){
        !           307:                        LineReq(p, reqlo, k-1, 1);
        !           308:                        reqlo = k+1;
        !           309:                } else if( k<cutlo || k>cuthi )
        !           310:                        DelLine(l);
        !           311:        }
        !           312:        LineReq(p, reqlo, p->hi, 1);
        !           313:                
        !           314: }
        !           315: 
        !           316: Pointing()
        !           317: {
        !           318:        register Pad *p = PickPad(mouse.xy);
        !           319:        register Line *l, *ll, *lsent = &p->sentinel, *sel;
        !           320:        register int i, paint = 0;
        !           321:        Point pt, ppt;
        !           322:        extern Rectangle KBDrect;
        !           323: 
        !           324:        if( ptinrect(mouse.xy, KBDrect) ) return;
        !           325:        if( !p ){
        !           326:                Select( (Line*)0, (Pad*)0 );
        !           327:                SetCurrent( (Pad *)0 );
        !           328:                return;
        !           329:        }
        !           330:        if( p != Current ){
        !           331:                MakeCurrent(p);
        !           332:                while( butts==BUTT1 ) jnap(2);  /* for rollover */
        !           333:                return;
        !           334:        }
        !           335:        pt = mouse.xy;
        !           336:        for( ; butts==BUTT1; jnap(2)){
        !           337:                paint = 0;
        !           338:                ppt = pt;
        !           339:                pt = mouse.xy;
        !           340:                if( ptinrect(pt,p->srect) ){
        !           341:                        if( !ptinrect(ppt,p->srect) && ptinrect(ppt,p->rect) ){
        !           342:                                pt.y = (bar.origin.y+bar.corner.y)/2;
        !           343:                                cursset( pt );
        !           344:                        }
        !           345:                        Scrolly = pt.y;
        !           346:                        Paint(p);
        !           347:                } else {
        !           348:                        sel = 0;
        !           349:                        for( l = lsent->down, i = 1; l!=lsent ; l = l->down, ++i ){
        !           350:                                if( ptinrect( mouse.xy, l->rect ) ){
        !           351:                                        sel = l;
        !           352:                                        break;
        !           353:                                }
        !           354:                        }
        !           355:                        Select( sel, p);
        !           356:                        if( sel )
        !           357:                                if( p->sentinel.key
        !           358:                                 ? (sel->key == p->lo || sel->key == p->hi )
        !           359:                                 : (i == p->lo || i == p->hi) ){
        !           360:                                        paint = 1;
        !           361:                                        Scrolly = 0;
        !           362:                        }
        !           363:                }
        !           364:        }
        !           365:        if( paint )
        !           366:                Paint(p);
        !           367:        if( Scrolly ){
        !           368:                Scrolly = 0;
        !           369:                RequestLines(p);
        !           370:        }
        !           371: }
        !           372: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.