diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/lib/draw |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/lib/draw')
-rwxr-xr-x | sys/src/ape/lib/draw/colors.c | 203 | ||||
-rwxr-xr-x | sys/src/ape/lib/draw/libc.h | 137 | ||||
-rwxr-xr-x | sys/src/ape/lib/draw/mkfile | 78 |
3 files changed, 418 insertions, 0 deletions
diff --git a/sys/src/ape/lib/draw/colors.c b/sys/src/ape/lib/draw/colors.c new file mode 100755 index 000000000..2f668cdc3 --- /dev/null +++ b/sys/src/ape/lib/draw/colors.c @@ -0,0 +1,203 @@ +#include <u.h> +#include <libc.h> +#include <draw.h> +#include <event.h> + +char *argv0; + +static void +_sysfatalimpl(char *fmt, va_list arg) +{ + char buf[1024]; + + vseprint(buf, buf+sizeof(buf), fmt, arg); + if(argv0) + fprint(2, "%s: %s\n", argv0, buf); + else + fprint(2, "%s\n", buf); + exits(buf); +} + +void (*_sysfatal)(char *fmt, va_list arg) = _sysfatalimpl; + +void +sysfatal(char *fmt, ...) +{ + va_list arg; + + va_start(arg, fmt); + (*_sysfatal)(fmt, arg); + va_end(arg); +} + +int nbit, npix; +Image *pixel; +Rectangle crect[256]; + +Image *color[256]; + +void +eresized(int new) +{ + int x, y, i, n, nx, ny; + Rectangle r, b; + + if(new && getwindow(display, Refnone) < 0){ + fprint(2, "colors: can't reattach to window: %r\n"); + exits("resized"); + } + if(screen->depth > 8){ + n = 256; + nx = 16; + }else{ + n = 1<<screen->depth; + nx = 1<<(screen->depth/2); + } + + ny = n/nx; + draw(screen, screen->r, display->white, nil, ZP); + r = insetrect(screen->r, 5); + r.min.y+=20; + b.max.y=r.min.y; + for(i=n-1, y=0; y!=ny; y++){ + b.min.y=b.max.y; + b.max.y=r.min.y+(r.max.y-r.min.y)*(y+1)/ny; + b.max.x=r.min.x; + for(x=0; x!=nx; x++, --i){ + b.min.x=b.max.x; + b.max.x=r.min.x+(r.max.x-r.min.x)*(x+1)/nx; + crect[i]=insetrect(b, 1); + draw(screen, crect[i], color[i], nil, ZP); + } + } + flushimage(display, 1); +} + +char *buttons[] = +{ + "exit", + 0 +}; + +ulong +grey(int i) +{ + if(i < 0) + return grey(0); + if(i > 255) + return grey(255); + return (i<<16)+(i<<8)+i; +} + +Menu menu = +{ + buttons +}; + +int +dither[16] = { + 0, 8, 2, 10, + 12, 4, 14, 6, + 3, 11, 1, 9, + 15, 7, 13, 5 +}; + +void +main(int argc, char *argv[]) +{ + Point p; + Mouse m; + int i, j, k, l, n, ramp, prev; + char buf[100]; + char *fmt; + Image *dark; + ulong rgb; + + ramp = 0; + + fmt = "index %3d r %3lud g %3lud b %3lud 0x%.8luX "; +/* + ARGBEGIN{ + default: + goto Usage; + case 'x': + fmt = "index %2luX r %3luX g %3luX b %3luX 0x%.8luX "; + break; + case 'r': + ramp = 1; + break; + }ARGEND +*/ + argv0 = argv[0]; + if(argc != 1){ + Usage: + fprint(2, "Usage: %s [-rx]\n", argv0); + exits("usage"); + } + + if(initdraw(nil, nil, "colors") < 0) + sysfatal("initdraw failed: %r"); + einit(Emouse); + + for(i=0; i<256; i++){ + if(ramp){ + if(screen->chan == CMAP8){ + /* dither the fine grey */ + j = i-(i%17); + dark = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(j)<<8)+0xFF); + color[i] = allocimage(display, Rect(0,0,4,4), screen->chan, 1, (grey(j+17)<<8)+0xFF); + for(j=0; j<16; j++){ + k = j%4; + l = j/4; + if(dither[j] > (i%17)) + draw(color[i], Rect(k, l, k+1, l+1), dark, nil, ZP); + } + freeimage(dark); + }else + color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(i)<<8)+0xFF); + }else + color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (cmap2rgb(i)<<8)+0xFF); + if(color[i] == nil) + sysfatal("can't allocate image: %r"); + } + eresized(0); + prev = -1; + for(;;){ + m = emouse(); + switch(m.buttons){ + case 1: + while(m.buttons){ + if(screen->depth > 8) + n = 256; + else + n = 1<<screen->depth; + for(i=0; i!=n; i++) + if(i!=prev && ptinrect(m.xy, crect[i])){ + if(ramp) + rgb = grey(i); + else + rgb = cmap2rgb(i); + sprint(buf, fmt, + i, + (rgb>>16)&0xFF, + (rgb>>8)&0xFF, + rgb&0xFF, + (rgb<<8) | 0xFF); + p = addpt(screen->r.min, Pt(2,2)); + draw(screen, Rpt(p, addpt(p, stringsize(font, buf))), display->white, nil, p); + string(screen, p, display->black, ZP, font, buf); + prev=i; + break; + } + m = emouse(); + } + break; + + case 4: + switch(emenuhit(3, &m, &menu)){ + case 0: + exits(0); + } + } + } +} diff --git a/sys/src/ape/lib/draw/libc.h b/sys/src/ape/lib/draw/libc.h new file mode 100755 index 000000000..97e3deacb --- /dev/null +++ b/sys/src/ape/lib/draw/libc.h @@ -0,0 +1,137 @@ +#define _LOCK_EXTENSION +#define _QLOCK_EXTENSION +#define _BSD_EXTENSION +#include <sys/types.h> +#include <lock.h> +#include <qlock.h> +#include <lib9.h> +#include <stdlib.h> +#include <string.h> +#include <bsd.h> +#include <unistd.h> +#include <fcntl.h> +#include <assert.h> +#include <utf.h> +#include <fmt.h> +#include <signal.h> + +typedef +struct Qid +{ + uvlong path; + ulong vers; + uchar type; +} Qid; + +typedef +struct Dir { + /* system-modified data */ + ushort type; /* server type */ + uint dev; /* server subtype */ + /* file data */ + Qid qid; /* unique id from server */ + ulong mode; /* permissions */ + ulong atime; /* last read time */ + ulong mtime; /* last write time */ + vlong length; /* file length: see <u.h> */ + char *name; /* last element of path */ + char *uid; /* owner name */ + char *gid; /* group name */ + char *muid; /* last modifier name */ +} Dir; + +uint _convM2D(uchar*, uint, Dir*, char*); +uint _convD2M(Dir*, uchar*, uint); +Dir *_dirstat(char*); +int _dirwstat(char*, Dir*); +Dir *_dirfstat(int); +int _dirfwstat(int, Dir*); +long _dirread(int, Dir**); +long _dirreadall(int, Dir**); +void _nulldir(Dir*); +uint _sizeD2M(Dir*); + +typedef +struct Waitmsg +{ + int pid; /* of loved one */ + unsigned long time[3]; /* of loved one & descendants */ + char *msg; +} Waitmsg; + + +extern int _AWAIT(char*, int); +extern int _ALARM(unsigned long); +extern int _BIND(const char*, const char*, int); +extern int _CHDIR(const char*); +extern int _CLOSE(int); +extern int _CREATE(char*, int, unsigned long); +extern int _DUP(int, int); +extern int _ERRSTR(char*, unsigned int); +extern int _EXEC(char*, char*[]); +extern void _EXITS(char *); +extern int _FD2PATH(int, char*, int); +extern int _FAUTH(int, char*); +extern int _FSESSION(int, char*, int); +extern int _FSTAT(int, unsigned char*, int); +extern int _FWSTAT(int, unsigned char*, int); +extern int _MOUNT(int, int, const char*, int, const char*); +extern int _NOTED(int); +extern int _NOTIFY(int(*)(void*, char*)); +extern int _OPEN(const char*, int); +extern int _PIPE(int*); +extern long _PREAD(int, void*, long, long long); +extern long _PWRITE(int, void*, long, long long); +extern long _READ(int, void*, long); +extern int _REMOVE(const char*); +extern int _RENDEZVOUS(unsigned long, unsigned long); +extern int _RFORK(int); +extern int _SEGATTACH(int, char*, void*, unsigned long); +extern int _SEGBRK(void*, void*); +extern int _SEGDETACH(void*); +extern int _SEGFLUSH(void*, unsigned long); +extern int _SEGFREE(void*, unsigned long); +extern long long _SEEK(int, long long, int); +extern int _SLEEP(long); +extern int _STAT(const char*, unsigned char*, int); +extern Waitmsg* _WAIT(void); +extern long _WRITE(int, const void*, long); +extern int _WSTAT(const char*, unsigned char*, int); +extern void *_MALLOCZ(int, int); +extern int _WERRSTR(char*, ...); +extern long _READN(int, void*, long); +extern int _IOUNIT(int); + +#define dirstat _dirstat +#define dirfstat _dirfstat + +#define OREAD 0 +#define OWRITE 1 +#define ORDWR 2 +#define OCEXEC 32 + +#define AREAD 4 +#define AWRITE 2 +#define AEXEC 1 +#define AEXIST 0 + +#define open _OPEN +#define close _CLOSE +#define read _READ +#define write _WRITE +#define _exits(s) _exit(s && *(char*)s ? 1 : 0) +#define exits(s) exit(s && *(char*)s ? 1 : 0) +#define create _CREATE +#define pread _PREAD +#define readn _READN +#define mallocz _MALLOCZ +#define iounit _IOUNIT + +/* assume being called as in event.c */ +#define postnote(x, pid, msg) kill(pid, SIGTERM) +#define atnotify(x, y) signal(SIGTERM, ekill) + +#define ERRMAX 128 + +extern void setmalloctag(void*, ulong); +extern ulong getcallerpc(void*); diff --git a/sys/src/ape/lib/draw/mkfile b/sys/src/ape/lib/draw/mkfile new file mode 100755 index 000000000..278b186b8 --- /dev/null +++ b/sys/src/ape/lib/draw/mkfile @@ -0,0 +1,78 @@ +APE=/sys/src/ape +<$APE/config + +LIB=/$objtype/lib/ape/libdraw.a + +OFILES=\ + alloc.$O\ + allocimagemix.$O\ + arith.$O\ + bezier.$O\ + border.$O\ + buildfont.$O\ + bytesperline.$O\ + chan.$O\ + cloadimage.$O\ + computil.$O\ + creadimage.$O\ + debug.$O\ + defont.$O\ + draw.$O\ + drawrepl.$O\ + egetrect.$O\ + ellipse.$O\ + emenuhit.$O\ + event.$O\ + fmt.$O\ + font.$O\ + freesubfont.$O\ + getdefont.$O\ + getsubfont.$O\ + icossin.$O\ + icossin2.$O\ + init.$O\ + line.$O\ + mkfont.$O\ + newwindow.$O\ + openfont.$O\ + poly.$O\ + loadimage.$O\ + readimage.$O\ + readsubfont.$O\ + rectclip.$O\ + replclipr.$O\ + rgb.$O\ + string.$O\ + stringbg.$O\ + stringsubfont.$O\ + stringwidth.$O\ + subfont.$O\ + subfontcache.$O\ + subfontname.$O\ + unloadimage.$O\ + window.$O\ + writecolmap.$O\ + writeimage.$O\ + writesubfont.$O\ + +HFILES=\ + /sys/include/ape/draw.h\ + /sys/include/ape/event.h\ + /sys/include/ape/mouse.h\ + /sys/include/ape/keyboard.h\ + +UPDATE=\ + mkfile\ + $HFILES\ + ${OFILES:%.$O=%.c}\ + ${LIB:/$objtype/%=/386/%}\ + +</sys/src/cmd/mksyslib + +CFLAGS=-c $CFLAGS -D_POSIX_SOURCE -D_PLAN9_SOURCE -I. + +%.$O: /sys/src/libdraw/%.c + $CC $CFLAGS /sys/src/libdraw/$stem.c + +$O.colors: colors.$O + $LD -o $target colors.$O |