summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/draw
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/lib/draw
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/lib/draw')
-rwxr-xr-xsys/src/ape/lib/draw/colors.c203
-rwxr-xr-xsys/src/ape/lib/draw/libc.h137
-rwxr-xr-xsys/src/ape/lib/draw/mkfile78
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