Initial import.
This commit is contained in:
27
src/cmd/mk/NOTICE
Normal file
27
src/cmd/mk/NOTICE
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
|
||||||
|
Portions Copyright © 1995-1997 C H Forsyth (forsyth@caldo.demon.co.uk). All rights reserved.
|
||||||
|
Portions Copyright © 1997-1999 Vita Nuova Limited. All rights reserved.
|
||||||
|
Portions Copyright © 2000-2002 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
|
||||||
|
|
||||||
|
Under a licence agreement with Lucent Technologies Inc. effective 1st March 2000,
|
||||||
|
Vita Nuova Holdings Limited has the right to determine (within a specified scope)
|
||||||
|
the form and content of sublicences for this software.
|
||||||
|
|
||||||
|
Vita Nuova Holdings Limited now makes this software available as Free
|
||||||
|
Software under the terms of the `GNU General Public LIcense, Version 2'
|
||||||
|
(see the file LICENCE or http://www.fsf.org/copyleft/gpl.html for
|
||||||
|
the full terms and conditions). One of the conditions of that licence
|
||||||
|
is that you must keep intact all notices that refer to that licence and to the absence of
|
||||||
|
of any warranty: for this software, note that includes this NOTICE file in particular.
|
||||||
|
|
||||||
|
This suite of programs is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
`GNU General Public License' for more details.
|
||||||
|
|
||||||
|
This copyright NOTICE applies to all files in this directory and
|
||||||
|
subdirectories, unless another copyright notice appears in a given
|
||||||
|
file or subdirectory. If you take code from this software to use in
|
||||||
|
other programs, you must somehow include with it an appropriate
|
||||||
|
copyright notice that includes the copyright notice and the other
|
||||||
|
notices above.
|
||||||
7
src/cmd/mk/README
Normal file
7
src/cmd/mk/README
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
This is a Unix port of mk,
|
||||||
|
originally done for the Inferno operating system.
|
||||||
|
|
||||||
|
Russ Cox repackaged this to build as a standalone
|
||||||
|
Unix program. Send comments about packaging to
|
||||||
|
Russ Cox <rsc@post.harvard.edu>
|
||||||
|
|
||||||
88
src/cmd/mk/bufblock.c
Normal file
88
src/cmd/mk/bufblock.c
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
#include "mk.h"
|
||||||
|
|
||||||
|
static Bufblock *freelist;
|
||||||
|
#define QUANTA 4096
|
||||||
|
|
||||||
|
Bufblock *
|
||||||
|
newbuf(void)
|
||||||
|
{
|
||||||
|
Bufblock *p;
|
||||||
|
|
||||||
|
if (freelist) {
|
||||||
|
p = freelist;
|
||||||
|
freelist = freelist->next;
|
||||||
|
} else {
|
||||||
|
p = (Bufblock *) Malloc(sizeof(Bufblock));
|
||||||
|
p->start = Malloc(QUANTA*sizeof(*p->start));
|
||||||
|
p->end = p->start+QUANTA;
|
||||||
|
}
|
||||||
|
p->current = p->start;
|
||||||
|
*p->start = 0;
|
||||||
|
p->next = 0;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
freebuf(Bufblock *p)
|
||||||
|
{
|
||||||
|
p->next = freelist;
|
||||||
|
freelist = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
growbuf(Bufblock *p)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
Bufblock *f;
|
||||||
|
char *cp;
|
||||||
|
|
||||||
|
n = p->end-p->start+QUANTA;
|
||||||
|
/* search the free list for a big buffer */
|
||||||
|
for (f = freelist; f; f = f->next) {
|
||||||
|
if (f->end-f->start >= n) {
|
||||||
|
memcpy(f->start, p->start, p->end-p->start);
|
||||||
|
cp = f->start;
|
||||||
|
f->start = p->start;
|
||||||
|
p->start = cp;
|
||||||
|
cp = f->end;
|
||||||
|
f->end = p->end;
|
||||||
|
p->end = cp;
|
||||||
|
f->current = f->start;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!f) { /* not found - grow it */
|
||||||
|
p->start = Realloc(p->start, n);
|
||||||
|
p->end = p->start+n;
|
||||||
|
}
|
||||||
|
p->current = p->start+n-QUANTA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bufcpy(Bufblock *buf, char *cp, int n)
|
||||||
|
{
|
||||||
|
|
||||||
|
while (n--)
|
||||||
|
insert(buf, *cp++);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
insert(Bufblock *buf, int c)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (buf->current >= buf->end)
|
||||||
|
growbuf(buf);
|
||||||
|
*buf->current++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rinsert(Bufblock *buf, Rune r)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = runelen(r);
|
||||||
|
if (buf->current+n > buf->end)
|
||||||
|
growbuf(buf);
|
||||||
|
runetochar(buf->current, &r);
|
||||||
|
buf->current += n;
|
||||||
|
}
|
||||||
33
src/cmd/mk/job.c
Normal file
33
src/cmd/mk/job.c
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#include "mk.h"
|
||||||
|
|
||||||
|
Job *
|
||||||
|
newjob(Rule *r, Node *nlist, char *stem, char **match, Word *pre, Word *npre, Word *tar, Word *atar)
|
||||||
|
{
|
||||||
|
register Job *j;
|
||||||
|
|
||||||
|
j = (Job *)Malloc(sizeof(Job));
|
||||||
|
j->r = r;
|
||||||
|
j->n = nlist;
|
||||||
|
j->stem = stem;
|
||||||
|
j->match = match;
|
||||||
|
j->p = pre;
|
||||||
|
j->np = npre;
|
||||||
|
j->t = tar;
|
||||||
|
j->at = atar;
|
||||||
|
j->nproc = -1;
|
||||||
|
j->next = 0;
|
||||||
|
return(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dumpj(char *s, Job *j, int all)
|
||||||
|
{
|
||||||
|
Bprint(&bout, "%s\n", s);
|
||||||
|
while(j){
|
||||||
|
Bprint(&bout, "job@%ld: r=%ld n=%ld stem='%s' nproc=%d\n",
|
||||||
|
j, j->r, j->n, j->stem, j->nproc);
|
||||||
|
Bprint(&bout, "\ttarget='%s' alltarget='%s' prereq='%s' nprereq='%s'\n",
|
||||||
|
wtos(j->t, ' '), wtos(j->at, ' '), wtos(j->p, ' '), wtos(j->np, ' '));
|
||||||
|
j = all? j->next : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
src/cmd/mk/mk.pdf
Normal file
BIN
src/cmd/mk/mk.pdf
Normal file
Binary file not shown.
29
src/cmd/sam/README
Normal file
29
src/cmd/sam/README
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
This is sam (not including samterm) from the 4th edition of Plan 9,
|
||||||
|
with changes so that it can be compiled under unix.
|
||||||
|
(Tested on Solaris 7 and Debian 3.0r1.)
|
||||||
|
|
||||||
|
Some extra libraries are needed. First, fetch libutf-2.0 and libfmt-2.0
|
||||||
|
from
|
||||||
|
http://pdos.lcs.mit.edu/~rsc/software/
|
||||||
|
|
||||||
|
(Beware that in libfmt/fmt.c there is a line that says:
|
||||||
|
'u', __ifmt, /* in Plan 9, __flagfmt */
|
||||||
|
Thus, sam will have to fmtinstall the other thing. Other ported programs
|
||||||
|
may have to do the same. The fmt library should probably print messages
|
||||||
|
about bad format characters to stderr, since no one seems to check the
|
||||||
|
return codes.)
|
||||||
|
|
||||||
|
Compile and install those two libraries.
|
||||||
|
Set PREFIX in the Makefile to match, then compile sam.
|
||||||
|
|
||||||
|
Your C compiler will emit many complaints of the form:
|
||||||
|
sam.c:496: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
|
||||||
|
This is because the Plan 9 compiler has a slightly different (better,
|
||||||
|
ala Oberon) type system than ISO C. Popular compilers generate the right
|
||||||
|
code, so in an act of civil disobediance I changed just enough to get
|
||||||
|
it to compile, but left the type errors in. Now the next C standard can
|
||||||
|
adopt this extension, because at least one important C program uses it!
|
||||||
|
|
||||||
|
-- Scott Schwartz, 4 July 2003
|
||||||
|
|
||||||
40
src/cmd/sam/_libc.h
Normal file
40
src/cmd/sam/_libc.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#define __USE_UNIX98 // for pread/pwrite, supposedly
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "utf.h"
|
||||||
|
#include "fmt.h"
|
||||||
|
|
||||||
|
#define nil 0
|
||||||
|
#define dup dup2
|
||||||
|
#define exec execv
|
||||||
|
#define seek lseek
|
||||||
|
#define getwd getcwd
|
||||||
|
#define USED(a)
|
||||||
|
#define SET(a)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
OREAD = 0,
|
||||||
|
OWRITE = 1,
|
||||||
|
ORDWR = 2,
|
||||||
|
OCEXEC = 4,
|
||||||
|
ORCLOSE = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
ERRMAX = 255
|
||||||
|
};
|
||||||
|
|
||||||
|
void exits(const char *);
|
||||||
|
void _exits(const char *);
|
||||||
|
int notify (void(*f)(void *, char *));
|
||||||
|
int create(char *, int, int);
|
||||||
|
int errstr(char *, int);
|
||||||
39
src/cmd/sam/err
Normal file
39
src/cmd/sam/err
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
address.c: In function `filematch':
|
||||||
|
address.c:159: warning: passing arg 1 of `bufreset' from incompatible pointer type
|
||||||
|
address.c:160: warning: passing arg 1 of `bufinsert' from incompatible pointer type
|
||||||
|
file.c: In function `mergeextend':
|
||||||
|
file.c:117: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
file.c: In function `fileinsert':
|
||||||
|
file.c:275: warning: passing arg 1 of `bufinsert' from incompatible pointer type
|
||||||
|
file.c: In function `filedelete':
|
||||||
|
file.c:301: warning: passing arg 1 of `bufdelete' from incompatible pointer type
|
||||||
|
file.c: In function `fileundelete':
|
||||||
|
file.c:324: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
file.c: In function `filereadc':
|
||||||
|
file.c:339: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
file.c: In function `fileload':
|
||||||
|
file.c:405: warning: passing arg 1 of `bufload' from incompatible pointer type
|
||||||
|
file.c: In function `fileundo':
|
||||||
|
file.c:528: warning: passing arg 1 of `bufdelete' from incompatible pointer type
|
||||||
|
file.c:546: warning: passing arg 1 of `bufinsert' from incompatible pointer type
|
||||||
|
file.c: In function `fileclose':
|
||||||
|
file.c:604: warning: passing arg 1 of `bufclose' from incompatible pointer type
|
||||||
|
io.c: In function `readio':
|
||||||
|
io.c:90: warning: passing arg 1 of `bufload' from incompatible pointer type
|
||||||
|
io.c: In function `writeio':
|
||||||
|
io.c:152: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
mesg.c: In function `inmesg':
|
||||||
|
mesg.c:248: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
mesg.c: In function `snarf':
|
||||||
|
mesg.c:568: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
mesg.c: In function `setgenstr':
|
||||||
|
mesg.c:612: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
sam.c: In function `readcmd':
|
||||||
|
sam.c:496: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
sam.c: In function `copy':
|
||||||
|
sam.c:676: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
xec.c: In function `s_cmd':
|
||||||
|
xec.c:234: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
xec.c:243: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
|
xec.c: In function `display':
|
||||||
|
xec.c:401: warning: passing arg 1 of `bufread' from incompatible pointer type
|
||||||
17
src/cmd/sam/plumb.h
Normal file
17
src/cmd/sam/plumb.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
typedef struct Plumbmsg Plumbmsg;
|
||||||
|
|
||||||
|
struct Plumbmsg {
|
||||||
|
char *src;
|
||||||
|
char *dst;
|
||||||
|
char *wdir;
|
||||||
|
char *type;
|
||||||
|
char *attr;
|
||||||
|
char *data;
|
||||||
|
int ndata;
|
||||||
|
};
|
||||||
|
|
||||||
|
char *plumbunpackattr(char*);
|
||||||
|
char *plumbpack(Plumbmsg *, int *);
|
||||||
|
int plumbfree(Plumbmsg *);
|
||||||
|
char *cleanname(char*);
|
||||||
|
|
||||||
193
src/cmd/sam/string.c
Normal file
193
src/cmd/sam/string.c
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
#include "sam.h"
|
||||||
|
|
||||||
|
#define MINSIZE 16 /* minimum number of chars allocated */
|
||||||
|
#define MAXSIZE 256 /* maximum number of chars for an empty string */
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Strinit(String *p)
|
||||||
|
{
|
||||||
|
p->s = emalloc(MINSIZE*RUNESIZE);
|
||||||
|
p->n = 0;
|
||||||
|
p->size = MINSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strinit0(String *p)
|
||||||
|
{
|
||||||
|
p->s = emalloc(MINSIZE*RUNESIZE);
|
||||||
|
p->s[0] = 0;
|
||||||
|
p->n = 1;
|
||||||
|
p->size = MINSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strclose(String *p)
|
||||||
|
{
|
||||||
|
free(p->s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strzero(String *p)
|
||||||
|
{
|
||||||
|
if(p->size > MAXSIZE){
|
||||||
|
p->s = erealloc(p->s, RUNESIZE*MAXSIZE); /* throw away the garbage */
|
||||||
|
p->size = MAXSIZE;
|
||||||
|
}
|
||||||
|
p->n = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Strlen(Rune *r)
|
||||||
|
{
|
||||||
|
Rune *s;
|
||||||
|
|
||||||
|
for(s=r; *s; s++)
|
||||||
|
;
|
||||||
|
return s-r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strdupl(String *p, Rune *s) /* copies the null */
|
||||||
|
{
|
||||||
|
p->n = Strlen(s)+1;
|
||||||
|
Strinsure(p, p->n);
|
||||||
|
memmove(p->s, s, p->n*RUNESIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strduplstr(String *p, String *q) /* will copy the null if there's one there */
|
||||||
|
{
|
||||||
|
Strinsure(p, q->n);
|
||||||
|
p->n = q->n;
|
||||||
|
memmove(p->s, q->s, q->n*RUNESIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Straddc(String *p, int c)
|
||||||
|
{
|
||||||
|
Strinsure(p, p->n+1);
|
||||||
|
p->s[p->n++] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strinsure(String *p, ulong n)
|
||||||
|
{
|
||||||
|
if(n > STRSIZE)
|
||||||
|
error(Etoolong);
|
||||||
|
if(p->size < n){ /* p needs to grow */
|
||||||
|
n += 100;
|
||||||
|
p->s = erealloc(p->s, n*RUNESIZE);
|
||||||
|
p->size = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strinsert(String *p, String *q, Posn p0)
|
||||||
|
{
|
||||||
|
Strinsure(p, p->n+q->n);
|
||||||
|
memmove(p->s+p0+q->n, p->s+p0, (p->n-p0)*RUNESIZE);
|
||||||
|
memmove(p->s+p0, q->s, q->n*RUNESIZE);
|
||||||
|
p->n += q->n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Strdelete(String *p, Posn p1, Posn p2)
|
||||||
|
{
|
||||||
|
memmove(p->s+p1, p->s+p2, (p->n-p2)*RUNESIZE);
|
||||||
|
p->n -= p2-p1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Strcmp(String *a, String *b)
|
||||||
|
{
|
||||||
|
int i, c;
|
||||||
|
|
||||||
|
for(i=0; i<a->n && i<b->n; i++)
|
||||||
|
if(c = (a->s[i] - b->s[i])) /* assign = */
|
||||||
|
return c;
|
||||||
|
/* damn NULs confuse everything */
|
||||||
|
i = a->n - b->n;
|
||||||
|
if(i == 1){
|
||||||
|
if(a->s[a->n-1] == 0)
|
||||||
|
return 0;
|
||||||
|
}else if(i == -1){
|
||||||
|
if(b->s[b->n-1] == 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Strispre(String *a, String *b)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<a->n && i<b->n; i++){
|
||||||
|
if(a->s[i] - b->s[i]){ /* assign = */
|
||||||
|
if(a->s[i] == 0)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i == a->n;
|
||||||
|
}
|
||||||
|
|
||||||
|
char*
|
||||||
|
Strtoc(String *s)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *c, *d;
|
||||||
|
Rune *r;
|
||||||
|
c = emalloc(s->n*UTFmax + 1); /* worst case UTFmax bytes per rune, plus NUL */
|
||||||
|
d = c;
|
||||||
|
r = s->s;
|
||||||
|
for(i=0; i<s->n; i++)
|
||||||
|
d += runetochar(d, r++);
|
||||||
|
if(d==c || d[-1]!=0)
|
||||||
|
*d = 0;
|
||||||
|
return c;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build very temporary String from Rune*
|
||||||
|
*/
|
||||||
|
String*
|
||||||
|
tmprstr(Rune *r, int n)
|
||||||
|
{
|
||||||
|
static String p;
|
||||||
|
|
||||||
|
p.s = r;
|
||||||
|
p.n = n;
|
||||||
|
p.size = n;
|
||||||
|
return &p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert null-terminated char* into String
|
||||||
|
*/
|
||||||
|
String*
|
||||||
|
tmpcstr(char *s)
|
||||||
|
{
|
||||||
|
String *p;
|
||||||
|
Rune *r;
|
||||||
|
int i, n;
|
||||||
|
|
||||||
|
n = utflen(s); /* don't include NUL */
|
||||||
|
p = emalloc(sizeof(String));
|
||||||
|
r = emalloc(n*RUNESIZE);
|
||||||
|
p->s = r;
|
||||||
|
for(i=0; i<n; i++,r++)
|
||||||
|
s += chartorune(r, s);
|
||||||
|
p->n = n;
|
||||||
|
p->size = n;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
freetmpstr(String *s)
|
||||||
|
{
|
||||||
|
free(s->s);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
60
src/cmd/sam/sys.c
Normal file
60
src/cmd/sam/sys.c
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
#include "sam.h"
|
||||||
|
|
||||||
|
static int inerror=FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A reasonable interface to the system calls
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
resetsys(void)
|
||||||
|
{
|
||||||
|
inerror = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
syserror(char *a)
|
||||||
|
{
|
||||||
|
char buf[ERRMAX];
|
||||||
|
|
||||||
|
if(!inerror){
|
||||||
|
inerror=TRUE;
|
||||||
|
errstr(buf, sizeof buf);
|
||||||
|
dprint("%s: ", a);
|
||||||
|
error_s(Eio, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Read(int f, void *a, int n)
|
||||||
|
{
|
||||||
|
char buf[ERRMAX];
|
||||||
|
|
||||||
|
if(read(f, (char *)a, n)!=n) {
|
||||||
|
if (lastfile)
|
||||||
|
lastfile->rescuing = 1;
|
||||||
|
errstr(buf, sizeof buf);
|
||||||
|
if (downloaded)
|
||||||
|
fprint(2, "read error: %s\n", buf);
|
||||||
|
rescue();
|
||||||
|
exits("read");
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Write(int f, void *a, int n)
|
||||||
|
{
|
||||||
|
int m;
|
||||||
|
|
||||||
|
if((m=write(f, (char *)a, n))!=n)
|
||||||
|
syserror("write");
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Seek(int f, long n, int w)
|
||||||
|
{
|
||||||
|
if(seek(f, n, w)==-1)
|
||||||
|
syserror("seek");
|
||||||
|
}
|
||||||
54
src/cmd/sam/util.c
Normal file
54
src/cmd/sam/util.c
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#include "sam.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls)
|
||||||
|
{
|
||||||
|
uchar *q;
|
||||||
|
Rune *s;
|
||||||
|
int j, w;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Always guaranteed that n bytes may be interpreted
|
||||||
|
* without worrying about partial runes. This may mean
|
||||||
|
* reading up to UTFmax-1 more bytes than n; the caller
|
||||||
|
* knows this. If n is a firm limit, the caller should
|
||||||
|
* set p[n] = 0.
|
||||||
|
*/
|
||||||
|
q = (uchar*)p;
|
||||||
|
s = r;
|
||||||
|
for(j=0; j<n; j+=w){
|
||||||
|
if(*q < Runeself){
|
||||||
|
w = 1;
|
||||||
|
*s = *q++;
|
||||||
|
}else{
|
||||||
|
w = chartorune(s, (char*)q);
|
||||||
|
q += w;
|
||||||
|
}
|
||||||
|
if(*s)
|
||||||
|
s++;
|
||||||
|
else if(nulls)
|
||||||
|
*nulls = TRUE;
|
||||||
|
}
|
||||||
|
*nb = (char*)q-p;
|
||||||
|
*nr = s-r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void*
|
||||||
|
fbufalloc(void)
|
||||||
|
{
|
||||||
|
return emalloc(BUFSIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fbuffree(void *f)
|
||||||
|
{
|
||||||
|
free(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint
|
||||||
|
min(uint a, uint b)
|
||||||
|
{
|
||||||
|
if(a < b)
|
||||||
|
return a;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
43
src/libdraw/allocimagemix.c
Normal file
43
src/libdraw/allocimagemix.c
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
Image*
|
||||||
|
allocimagemix(Display *d, u32int color1, u32int color3)
|
||||||
|
{
|
||||||
|
Image *t, *b;
|
||||||
|
static Image *qmask;
|
||||||
|
|
||||||
|
if(qmask == nil)
|
||||||
|
qmask = allocimage(d, Rect(0,0,1,1), GREY8, 1, 0x3F3F3FFF);
|
||||||
|
|
||||||
|
if(d->screenimage->depth <= 8){ /* create a 2×2 texture */
|
||||||
|
t = allocimage(d, Rect(0,0,1,1), d->screenimage->chan, 0, color1);
|
||||||
|
if(t == nil)
|
||||||
|
return nil;
|
||||||
|
|
||||||
|
b = allocimage(d, Rect(0,0,2,2), d->screenimage->chan, 1, color3);
|
||||||
|
if(b == nil){
|
||||||
|
freeimage(t);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw(b, Rect(0,0,1,1), t, nil, ZP);
|
||||||
|
freeimage(t);
|
||||||
|
return b;
|
||||||
|
}else{ /* use a solid color, blended using alpha */
|
||||||
|
t = allocimage(d, Rect(0,0,1,1), d->screenimage->chan, 1, color1);
|
||||||
|
if(t == nil)
|
||||||
|
return nil;
|
||||||
|
|
||||||
|
b = allocimage(d, Rect(0,0,1,1), d->screenimage->chan, 1, color3);
|
||||||
|
if(b == nil){
|
||||||
|
freeimage(t);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw(b, b->r, t, qmask, ZP);
|
||||||
|
freeimage(t);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
}
|
||||||
244
src/libdraw/bezier.c
Normal file
244
src/libdraw/bezier.c
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
#define PINC 32 /* realloc granularity */
|
||||||
|
|
||||||
|
typedef struct Plist Plist;
|
||||||
|
struct Plist
|
||||||
|
{
|
||||||
|
Point *p;
|
||||||
|
int np; /* -1 if malloc/realloc failed */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
appendpt(Plist *l, Point p)
|
||||||
|
{
|
||||||
|
if(l->np == -1)
|
||||||
|
return;
|
||||||
|
if(l->np == 0)
|
||||||
|
l->p = malloc(PINC*sizeof(Point));
|
||||||
|
else if(l->np%PINC == 0)
|
||||||
|
l->p = realloc(l->p, (l->np+PINC)*sizeof(Point));
|
||||||
|
if(l->p == 0){
|
||||||
|
l->np = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
l->p[l->np++] = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
normsq(Point p)
|
||||||
|
{
|
||||||
|
return p.x*p.x+p.y*p.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
psdist(Point p, Point a, Point b)
|
||||||
|
{
|
||||||
|
int num, den;
|
||||||
|
|
||||||
|
p = subpt(p, a);
|
||||||
|
b = subpt(b, a);
|
||||||
|
num = p.x*b.x + p.y*b.y;
|
||||||
|
if(num <= 0)
|
||||||
|
return normsq(p);
|
||||||
|
den = normsq(b);
|
||||||
|
if(num >= den)
|
||||||
|
return normsq(subpt(b, p));
|
||||||
|
return normsq(subpt(divpt(mulpt(b, num), den), p));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert cubic Bezier curve control points to polyline
|
||||||
|
* vertices. Leaves the last vertex off, so you can continue
|
||||||
|
* with another curve.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
bpts1(Plist *l, Point p0, Point p1, Point p2, Point p3, int scale)
|
||||||
|
{
|
||||||
|
Point p01, p12, p23, p012, p123, p0123;
|
||||||
|
Point tp0, tp1, tp2, tp3;
|
||||||
|
tp0=divpt(p0, scale);
|
||||||
|
tp1=divpt(p1, scale);
|
||||||
|
tp2=divpt(p2, scale);
|
||||||
|
tp3=divpt(p3, scale);
|
||||||
|
if(psdist(tp1, tp0, tp3)<=1 && psdist(tp2, tp0, tp3)<=1){
|
||||||
|
appendpt(l, tp0);
|
||||||
|
appendpt(l, tp1);
|
||||||
|
appendpt(l, tp2);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
/*
|
||||||
|
* if scale factor is getting too big for comfort,
|
||||||
|
* rescale now & concede the rounding error
|
||||||
|
*/
|
||||||
|
if(scale>(1<<12)){
|
||||||
|
p0=tp0;
|
||||||
|
p1=tp1;
|
||||||
|
p2=tp2;
|
||||||
|
p3=tp3;
|
||||||
|
scale=1;
|
||||||
|
}
|
||||||
|
p01=addpt(p0, p1);
|
||||||
|
p12=addpt(p1, p2);
|
||||||
|
p23=addpt(p2, p3);
|
||||||
|
p012=addpt(p01, p12);
|
||||||
|
p123=addpt(p12, p23);
|
||||||
|
p0123=addpt(p012, p123);
|
||||||
|
bpts1(l, mulpt(p0, 8), mulpt(p01, 4), mulpt(p012, 2), p0123, scale*8);
|
||||||
|
bpts1(l, p0123, mulpt(p123, 2), mulpt(p23, 4), mulpt(p3, 8), scale*8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bpts(Plist *l, Point p0, Point p1, Point p2, Point p3)
|
||||||
|
{
|
||||||
|
bpts1(l, p0, p1, p2, p3, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bezierpts(Plist *l, Point p0, Point p1, Point p2, Point p3)
|
||||||
|
{
|
||||||
|
bpts(l, p0, p1, p2, p3);
|
||||||
|
appendpt(l, p3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_bezsplinepts(Plist *l, Point *pt, int npt)
|
||||||
|
{
|
||||||
|
Point *p, *ep;
|
||||||
|
Point a, b, c, d;
|
||||||
|
int periodic;
|
||||||
|
|
||||||
|
if(npt<3)
|
||||||
|
return;
|
||||||
|
ep = &pt[npt-3];
|
||||||
|
periodic = eqpt(pt[0], ep[2]);
|
||||||
|
if(periodic){
|
||||||
|
a = divpt(addpt(ep[1], pt[0]), 2);
|
||||||
|
b = divpt(addpt(ep[1], mulpt(pt[0], 5)), 6);
|
||||||
|
c = divpt(addpt(mulpt(pt[0], 5), pt[1]), 6);
|
||||||
|
d = divpt(addpt(pt[0], pt[1]), 2);
|
||||||
|
bpts(l, a, b, c, d);
|
||||||
|
}
|
||||||
|
for(p=pt; p<=ep; p++){
|
||||||
|
if(p==pt && !periodic){
|
||||||
|
a = p[0];
|
||||||
|
b = divpt(addpt(p[0], mulpt(p[1], 2)), 3);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
a = divpt(addpt(p[0], p[1]), 2);
|
||||||
|
b = divpt(addpt(p[0], mulpt(p[1], 5)), 6);
|
||||||
|
}
|
||||||
|
if(p==ep && !periodic){
|
||||||
|
c = divpt(addpt(mulpt(p[1], 2), p[2]), 3);
|
||||||
|
d = p[2];
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
c = divpt(addpt(mulpt(p[1], 5), p[2]), 6);
|
||||||
|
d = divpt(addpt(p[1], p[2]), 2);
|
||||||
|
}
|
||||||
|
bpts(l, a, b, c, d);
|
||||||
|
}
|
||||||
|
appendpt(l, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bezsplinepts(Point *pt, int npt, Point **pp)
|
||||||
|
{
|
||||||
|
Plist l;
|
||||||
|
l.np = 0;
|
||||||
|
l.p = nil;
|
||||||
|
_bezsplinepts(&l, pt, npt);
|
||||||
|
*pp = l.p;
|
||||||
|
return l.np;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bezier(Image *dst, Point p0, Point p1, Point p2, Point p3, int end0, int end1, int radius, Image *src, Point sp)
|
||||||
|
{
|
||||||
|
return bezierop(dst, p0, p1, p2, p3, end0, end1, radius, src, sp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bezierop(Image *dst, Point p0, Point p1, Point p2, Point p3, int end0, int end1, int radius, Image *src, Point sp, Drawop op)
|
||||||
|
{
|
||||||
|
Plist l;
|
||||||
|
|
||||||
|
l.np = 0;
|
||||||
|
bezierpts(&l, p0, p1, p2, p3);
|
||||||
|
if(l.np == -1)
|
||||||
|
return 0;
|
||||||
|
if(l.np != 0){
|
||||||
|
polyop(dst, l.p, l.np, end0, end1, radius, src, addpt(subpt(sp, p0), l.p[0]), op);
|
||||||
|
free(l.p);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bezspline(Image *dst, Point *pt, int npt, int end0, int end1, int radius, Image *src, Point sp)
|
||||||
|
{
|
||||||
|
return bezsplineop(dst, pt, npt, end0, end1, radius, src, sp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bezsplineop(Image *dst, Point *pt, int npt, int end0, int end1, int radius, Image *src, Point sp, Drawop op)
|
||||||
|
{
|
||||||
|
Plist l;
|
||||||
|
|
||||||
|
l.np = 0;
|
||||||
|
_bezsplinepts(&l, pt, npt);
|
||||||
|
if(l.np==-1)
|
||||||
|
return 0;
|
||||||
|
if(l.np != 0){
|
||||||
|
polyop(dst, l.p, l.np, end0, end1, radius, src, addpt(subpt(sp, pt[0]), l.p[0]), op);
|
||||||
|
free(l.p);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fillbezier(Image *dst, Point p0, Point p1, Point p2, Point p3, int w, Image *src, Point sp)
|
||||||
|
{
|
||||||
|
return fillbezierop(dst, p0, p1, p2, p3, w, src, sp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fillbezierop(Image *dst, Point p0, Point p1, Point p2, Point p3, int w, Image *src, Point sp, Drawop op)
|
||||||
|
{
|
||||||
|
Plist l;
|
||||||
|
|
||||||
|
l.np = 0;
|
||||||
|
bezierpts(&l, p0, p1, p2, p3);
|
||||||
|
if(l.np == -1)
|
||||||
|
return 0;
|
||||||
|
if(l.np != 0){
|
||||||
|
fillpolyop(dst, l.p, l.np, w, src, addpt(subpt(sp, p0), l.p[0]), op);
|
||||||
|
free(l.p);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fillbezspline(Image *dst, Point *pt, int npt, int w, Image *src, Point sp)
|
||||||
|
{
|
||||||
|
return fillbezsplineop(dst, pt, npt, w, src, sp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
fillbezsplineop(Image *dst, Point *pt, int npt, int w, Image *src, Point sp, Drawop op)
|
||||||
|
{
|
||||||
|
Plist l;
|
||||||
|
|
||||||
|
l.np = 0;
|
||||||
|
_bezsplinepts(&l, pt, npt);
|
||||||
|
if(l.np == -1)
|
||||||
|
return 0;
|
||||||
|
if(l.np > 0){
|
||||||
|
fillpolyop(dst, l.p, l.np, w, src, addpt(subpt(sp, pt[0]), l.p[0]), op);
|
||||||
|
free(l.p);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
21
src/libdraw/border.c
Normal file
21
src/libdraw/border.c
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
border(Image *im, Rectangle r, int i, Image *color, Point sp)
|
||||||
|
{
|
||||||
|
if(i < 0){
|
||||||
|
r = insetrect(r, i);
|
||||||
|
sp = addpt(sp, Pt(i,i));
|
||||||
|
i = -i;
|
||||||
|
}
|
||||||
|
draw(im, Rect(r.min.x, r.min.y, r.max.x, r.min.y+i),
|
||||||
|
color, nil, sp);
|
||||||
|
draw(im, Rect(r.min.x, r.max.y-i, r.max.x, r.max.y),
|
||||||
|
color, nil, Pt(sp.x, sp.y+Dy(r)-i));
|
||||||
|
draw(im, Rect(r.min.x, r.min.y+i, r.min.x+i, r.max.y-i),
|
||||||
|
color, nil, Pt(sp.x, sp.y+i));
|
||||||
|
draw(im, Rect(r.max.x-i, r.min.y+i, r.max.x, r.max.y-i),
|
||||||
|
color, nil, Pt(sp.x+Dx(r)-i, sp.y+i));
|
||||||
|
}
|
||||||
49
src/libdraw/cloadimage.c
Normal file
49
src/libdraw/cloadimage.c
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
cloadimage(Image *i, Rectangle r, uchar *data, int ndata)
|
||||||
|
{
|
||||||
|
int m, nb, miny, maxy, ncblock;
|
||||||
|
uchar *a;
|
||||||
|
|
||||||
|
if(!rectinrect(r, i->r)){
|
||||||
|
werrstr("cloadimage: bad rectangle");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
miny = r.min.y;
|
||||||
|
m = 0;
|
||||||
|
ncblock = _compblocksize(r, i->depth);
|
||||||
|
while(miny != r.max.y){
|
||||||
|
maxy = atoi((char*)data+0*12);
|
||||||
|
nb = atoi((char*)data+1*12);
|
||||||
|
if(maxy<=miny || r.max.y<maxy){
|
||||||
|
werrstr("creadimage: bad maxy %d", maxy);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
data += 2*12;
|
||||||
|
ndata -= 2*12;
|
||||||
|
m += 2*12;
|
||||||
|
if(nb<=0 || ncblock<nb || nb>ndata){
|
||||||
|
werrstr("creadimage: bad count %d", nb);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
a = bufimage(i->display, 21+nb);
|
||||||
|
if(a == nil)
|
||||||
|
return -1;
|
||||||
|
a[0] = 'Y';
|
||||||
|
BPLONG(a+1, i->id);
|
||||||
|
BPLONG(a+5, r.min.x);
|
||||||
|
BPLONG(a+9, miny);
|
||||||
|
BPLONG(a+13, r.max.x);
|
||||||
|
BPLONG(a+17, maxy);
|
||||||
|
memmove(a+21, data, nb);
|
||||||
|
miny = maxy;
|
||||||
|
data += nb;
|
||||||
|
ndata += nb;
|
||||||
|
m += nb;
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
38
src/libdraw/computil.c
Normal file
38
src/libdraw/computil.c
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* compressed data are seuences of byte codes.
|
||||||
|
* if the first byte b has the 0x80 bit set, the next (b^0x80)+1 bytes
|
||||||
|
* are data. otherwise, it's two bytes specifying a previous string to repeat.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
_twiddlecompressed(uchar *buf, int n)
|
||||||
|
{
|
||||||
|
uchar *ebuf;
|
||||||
|
int j, k, c;
|
||||||
|
|
||||||
|
ebuf = buf+n;
|
||||||
|
while(buf < ebuf){
|
||||||
|
c = *buf++;
|
||||||
|
if(c >= 128){
|
||||||
|
k = c-128+1;
|
||||||
|
for(j=0; j<k; j++, buf++)
|
||||||
|
*buf ^= 0xFF;
|
||||||
|
}else
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_compblocksize(Rectangle r, int depth)
|
||||||
|
{
|
||||||
|
int bpl;
|
||||||
|
|
||||||
|
bpl = bytesperline(r, depth);
|
||||||
|
bpl = 2*bpl; /* add plenty extra for blocking, etc. */
|
||||||
|
if(bpl < NCBLOCK)
|
||||||
|
return NCBLOCK;
|
||||||
|
return bpl;
|
||||||
|
}
|
||||||
16
src/libdraw/debug.c
Normal file
16
src/libdraw/debug.c
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
drawsetdebug(int v)
|
||||||
|
{
|
||||||
|
uchar *a;
|
||||||
|
a = bufimage(display, 1+1);
|
||||||
|
if(a == 0){
|
||||||
|
fprint(2, "drawsetdebug: %r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
a[0] = 'D';
|
||||||
|
a[1] = v;
|
||||||
|
}
|
||||||
402
src/libdraw/defont.c
Normal file
402
src/libdraw/defont.c
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* lucm/latin1.9, in uncompressed form
|
||||||
|
*/
|
||||||
|
uchar
|
||||||
|
defontdata[] =
|
||||||
|
{
|
||||||
|
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x20,0x20,0x20,0x20,
|
||||||
|
0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
|
||||||
|
0x20,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x32,0x33,0x30,0x34,0x20,
|
||||||
|
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x35,0x20,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x30,0x06,0x06,0x03,0x42,0x40,0x00,0x00,0x00,0x18,0x03,0x03,
|
||||||
|
0x02,0x43,0x00,0x60,0x60,0x48,0x00,0x0d,0x0c,0x01,0x81,0x80,0xd0,0x90,0x00,0x00,
|
||||||
|
0x18,0x01,0x81,0x81,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x7f,0x9c,0x1c,
|
||||||
|
0x0e,0x07,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x70,
|
||||||
|
0x38,0x1c,0x0e,0x04,0x81,0xc1,0xc0,0x70,0x00,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x80,0xc0,0x63,0xe3,
|
||||||
|
0xf1,0xf8,0xfe,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x7f,0xff,0xff,0x1f,0x8f,
|
||||||
|
0xc7,0xe3,0xf1,0xfb,0x7e,0x3e,0x3f,0x8f,0xff,0xe3,0xe3,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x0c,0x18,0x09,0x05,0x82,0x40,0xc0,0x00,0x00,0x06,0x0c,0x04,
|
||||||
|
0x82,0x40,0xc1,0x80,0x90,0x48,0x00,0x16,0x03,0x06,0x02,0x41,0x60,0x90,0x00,0x00,
|
||||||
|
0x06,0x06,0x02,0x41,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7f,0xa0,0x10,
|
||||||
|
0x08,0x04,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x48,
|
||||||
|
0x24,0x12,0x09,0x06,0x82,0x01,0x00,0x90,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x04,0x80,0x00,0x40,0x00,0x00,0x38,0x06,0x18,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x07,0xc6,0x01,0xf0,0x00,0x00,0x0c,0x00,0x18,0x00,0x00,0x30,0x00,0x3c,
|
||||||
|
0x00,0x60,0x06,0x01,0x8c,0x07,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0xc3,0xc0,0x01,0x54,0x9c,0xc0,0x5f,0xef,
|
||||||
|
0xf7,0xfb,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0x7f,0xff,0xff,0x6f,0xb7,
|
||||||
|
0xdb,0xed,0xf6,0xf9,0x7d,0xfe,0xff,0x6f,0xff,0xdf,0xef,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0x00,0x01,0x00,0x00,0x00,0x00,0x30,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x30,0x06,0x06,0x06,0x82,0x80,0xc0,0x00,
|
||||||
|
0x00,0x18,0x03,0x03,0x02,0x41,0x80,0x30,0x30,0x24,0x76,0x0d,0x0c,0x00,0xc0,0xc0,
|
||||||
|
0xd0,0x50,0x00,0x00,0x18,0x01,0x81,0x81,0x40,0x30,0x00,0x28,0x0f,0x7f,0xbc,0x1c,
|
||||||
|
0x0e,0x07,0x03,0xc0,0x10,0x70,0x24,0x10,0x09,0x07,0x03,0x80,0xe0,0x70,0x90,0x48,
|
||||||
|
0x24,0x12,0x09,0x05,0x81,0x81,0xc0,0x80,0x70,0x18,0x1c,0x07,0x01,0xc1,0xc0,0x90,
|
||||||
|
0x00,0x0c,0x04,0x84,0x83,0xe1,0xc0,0xe0,0x38,0x0c,0x0c,0x02,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x06,0x1c,0x06,0x0f,0x87,0xc0,0x63,0xf8,0x78,0xfe,0x3e,0x0e,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x7c,0x1c,0x0c,0x1f,0x03,0xc7,0xc3,0xf1,0xf8,0x3c,0x63,0x3f,0x0f,
|
||||||
|
0x8c,0x66,0x06,0x19,0x84,0x78,0x7e,0x1e,0x1f,0x07,0xcf,0xf3,0x1b,0x0d,0x86,0x63,
|
||||||
|
0x61,0x9f,0xc6,0x06,0x00,0x30,0x00,0x00,0x10,0x00,0x18,0x00,0x00,0x30,0x00,0x60,
|
||||||
|
0x00,0x60,0x06,0x01,0x8c,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xc0,0x60,0x00,0xaa,0xb6,0xc0,0x43,0xe3,
|
||||||
|
0xf1,0xf8,0xfc,0x3f,0xef,0x8f,0xdb,0xef,0xf6,0xf8,0xfb,0xff,0x1f,0x8f,0x6f,0xb7,
|
||||||
|
0xdb,0xed,0xf6,0xfa,0x7e,0x7e,0x3f,0x7f,0x8f,0xe7,0xe3,0xf8,0xfe,0x3e,0x3f,0x6f,
|
||||||
|
0x00,0x00,0x01,0x01,0xc8,0x0b,0x0c,0x30,0x7c,0x14,0x0f,0x0f,0x00,0x00,0x00,0x00,
|
||||||
|
0x78,0x00,0x1c,0x00,0x0f,0x07,0x81,0x80,0x00,0x7c,0x00,0x00,0x1c,0x0f,0x80,0x04,
|
||||||
|
0x42,0x23,0x90,0x00,0x18,0x0c,0x06,0x03,0x01,0x80,0xc0,0x3c,0x3c,0x3f,0x1f,0x8f,
|
||||||
|
0xc7,0xe7,0xe3,0xf1,0xf8,0xfc,0x7c,0x30,0x8f,0x07,0x83,0xc1,0xe0,0xf0,0x00,0x3d,
|
||||||
|
0x31,0x98,0xcc,0x66,0x36,0x19,0x80,0xcc,0x0c,0x18,0x09,0x0b,0x02,0x81,0x20,0x00,
|
||||||
|
0x00,0x06,0x0c,0x04,0x82,0x40,0x60,0xc0,0x48,0x24,0x18,0x16,0x03,0x03,0x01,0x21,
|
||||||
|
0x60,0x50,0x00,0x00,0x06,0x06,0x02,0x41,0x40,0xc1,0x80,0x28,0x87,0x7f,0x84,0x10,
|
||||||
|
0x08,0x04,0x02,0x40,0x38,0x48,0x24,0x10,0x09,0x04,0x04,0x81,0x00,0x80,0x90,0x48,
|
||||||
|
0x24,0x12,0x09,0x04,0x80,0x41,0x00,0x80,0x40,0x04,0x10,0x04,0x02,0x01,0x20,0x90,
|
||||||
|
0x00,0x0c,0x04,0x84,0x86,0x53,0x65,0xb0,0x08,0x18,0x06,0x0a,0x80,0x00,0x00,0x00,
|
||||||
|
0x00,0x0c,0x36,0x0e,0x19,0xcc,0xe0,0xe3,0xf8,0xcc,0xfe,0x63,0x1b,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0xc6,0x62,0x0c,0x19,0x86,0x66,0x63,0x01,0x80,0x66,0x63,0x0c,0x01,
|
||||||
|
0x8c,0xc6,0x06,0x19,0xc4,0xcc,0x63,0x33,0x19,0x8c,0x61,0x83,0x1b,0x0d,0x86,0x63,
|
||||||
|
0x61,0x80,0xc6,0x03,0x00,0x30,0x30,0x00,0x1c,0x00,0x18,0x00,0x00,0x30,0x00,0x60,
|
||||||
|
0x00,0x60,0x00,0x00,0x0c,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xc0,0x60,0x01,0x54,0x86,0xc0,0x7b,0xef,
|
||||||
|
0xf7,0xfb,0xfd,0xbf,0xc7,0xb7,0xdb,0xef,0xf6,0xfb,0xfb,0x7e,0xff,0x7f,0x6f,0xb7,
|
||||||
|
0xdb,0xed,0xf6,0xfb,0x7f,0xbe,0xff,0x7f,0xbf,0xfb,0xef,0xfb,0xfd,0xfe,0xdf,0x6f,
|
||||||
|
0xff,0x00,0x07,0x83,0x24,0x13,0x0c,0x30,0xc6,0x00,0x10,0x81,0x80,0x00,0x00,0x00,
|
||||||
|
0x84,0x00,0x22,0x00,0x01,0x80,0xc0,0x00,0x00,0xf4,0x00,0x00,0x2c,0x18,0xc0,0x0c,
|
||||||
|
0x46,0x20,0x90,0x00,0x18,0x0c,0x06,0x03,0x01,0x80,0xc0,0x70,0x66,0x30,0x18,0x0c,
|
||||||
|
0x06,0x01,0x80,0xc0,0x60,0x30,0x66,0x38,0x99,0x8c,0xc6,0x63,0x31,0x98,0x00,0x66,
|
||||||
|
0x31,0x98,0xcc,0x66,0x36,0x19,0x80,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0xff,0x7f,0xb8,0x1c,
|
||||||
|
0x0e,0x07,0x02,0x40,0x7c,0x70,0x3c,0x10,0x09,0x07,0x04,0x00,0xc0,0x60,0xe0,0x70,
|
||||||
|
0x38,0x1c,0x0e,0x04,0x83,0x81,0xc0,0x70,0x70,0x38,0x1c,0x07,0x02,0xc1,0xc0,0x90,
|
||||||
|
0x00,0x0c,0x00,0x04,0x86,0x43,0x69,0xb0,0x30,0x18,0x06,0x07,0x01,0x00,0x00,0x00,
|
||||||
|
0x00,0x0c,0x63,0x16,0x00,0xc0,0x61,0x62,0x01,0x80,0x06,0x63,0x31,0x80,0x00,0x00,
|
||||||
|
0x60,0x00,0xc0,0x06,0x43,0x16,0x19,0x8c,0x06,0x33,0x01,0x80,0xc0,0x63,0x0c,0x01,
|
||||||
|
0x8c,0x86,0x07,0x39,0xc5,0x86,0x63,0x61,0x99,0x8c,0x01,0x83,0x1b,0x0d,0xb6,0x63,
|
||||||
|
0x31,0x01,0x86,0x03,0x00,0x30,0x30,0x00,0x1c,0x3e,0x1b,0x03,0xc1,0xf0,0xf0,0x60,
|
||||||
|
0x3e,0x6e,0x3e,0x0f,0x8c,0x60,0xc5,0xb1,0xb8,0x38,0x6c,0x0f,0x8c,0xc7,0xc1,0x83,
|
||||||
|
0x19,0x8d,0x82,0x63,0x31,0x9f,0xc1,0x80,0xc0,0xc0,0x00,0xaa,0x86,0xc0,0x47,0xe3,
|
||||||
|
0xf1,0xf8,0xfd,0xbf,0x83,0x8f,0xc3,0xef,0xf6,0xf8,0xfc,0xff,0x3f,0x9f,0x1f,0x8f,
|
||||||
|
0xc7,0xe3,0xf1,0xfb,0x7c,0x7e,0x3f,0x8f,0x8f,0xc7,0xe3,0xf8,0xfd,0x3e,0x3f,0x6f,
|
||||||
|
0x00,0x0c,0x0d,0x43,0x03,0xe1,0x88,0x30,0xc0,0x00,0x27,0x41,0x80,0x00,0x00,0x01,
|
||||||
|
0x72,0x00,0x22,0x04,0x01,0x80,0xc0,0x03,0x18,0xf4,0x00,0x00,0x0c,0x18,0xc0,0x04,
|
||||||
|
0x82,0x43,0x20,0x18,0x2c,0x16,0x0b,0x05,0x82,0xc1,0x60,0xb0,0xc0,0x30,0x18,0x0c,
|
||||||
|
0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x38,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x00,0xc7,
|
||||||
|
0x31,0x98,0xcc,0x66,0x33,0x11,0xf8,0xc8,0x7c,0x3e,0x1f,0x0f,0x87,0xc3,0xe1,0xd8,
|
||||||
|
0x3c,0x1e,0x0f,0x07,0x83,0xc7,0xc3,0xe1,0xf0,0xf8,0x06,0x37,0x07,0x03,0x81,0xc0,
|
||||||
|
0xe0,0x70,0x10,0x1d,0x31,0x98,0xcc,0x66,0x33,0x19,0xb0,0xc6,0x8f,0x7f,0x87,0x03,
|
||||||
|
0x81,0x80,0x90,0x30,0x6c,0x48,0x24,0x10,0x06,0x04,0x04,0x80,0x20,0x10,0x10,0x0e,
|
||||||
|
0x07,0x03,0x81,0xc0,0x60,0x88,0x38,0x0c,0x40,0x09,0x03,0x84,0x02,0x41,0x40,0x90,
|
||||||
|
0x00,0x0c,0x00,0x1f,0xe7,0x41,0xd1,0xa0,0x00,0x30,0x03,0x0a,0x81,0x00,0x00,0x00,
|
||||||
|
0x00,0x18,0x63,0x06,0x00,0xc0,0xc2,0x62,0x01,0xb0,0x0c,0x72,0x31,0x86,0x03,0x00,
|
||||||
|
0xc0,0x00,0x60,0x06,0x8f,0x16,0x19,0x0c,0x06,0x33,0x01,0x80,0xc0,0x63,0x0c,0x01,
|
||||||
|
0x8d,0x06,0x07,0x39,0x65,0x86,0x63,0x61,0x99,0x0e,0x01,0x83,0x19,0x89,0xb6,0x32,
|
||||||
|
0x33,0x03,0x06,0x01,0x80,0x30,0x78,0x00,0x00,0x03,0x1d,0x86,0x23,0x31,0x99,0xfc,
|
||||||
|
0x66,0x77,0x06,0x01,0x8c,0x40,0xc6,0xd9,0xdc,0x6c,0x76,0x19,0x8d,0xcc,0x27,0xf3,
|
||||||
|
0x19,0x8d,0x82,0x63,0x31,0x80,0xc0,0x80,0xc0,0x80,0x01,0x54,0x8c,0xc0,0x78,0xfc,
|
||||||
|
0x7e,0x7f,0x6f,0xcf,0x93,0xb7,0xdb,0xef,0xf9,0xfb,0xff,0xff,0xdf,0xef,0xef,0xf1,
|
||||||
|
0xf8,0xfc,0x7e,0x3f,0x9f,0x77,0xc7,0xf3,0xbf,0xf6,0xfc,0x7b,0xfd,0xbe,0xbf,0x6f,
|
||||||
|
0xff,0x0c,0x19,0x03,0x03,0x61,0x98,0x30,0x78,0x00,0x28,0x4f,0x83,0x30,0x00,0x01,
|
||||||
|
0x4a,0x00,0x1c,0x04,0x03,0x03,0x80,0x03,0x18,0xf4,0x00,0x00,0x0c,0x18,0xd9,0x84,
|
||||||
|
0x82,0x40,0xa0,0x18,0x2c,0x16,0x0b,0x05,0x82,0xc1,0x60,0xb0,0xc0,0x30,0x18,0x0c,
|
||||||
|
0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x2c,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x64,0xcb,
|
||||||
|
0x31,0x98,0xcc,0x66,0x33,0x31,0x8c,0xd8,0x06,0x03,0x01,0x80,0xc0,0x60,0x30,0x6c,
|
||||||
|
0x62,0x33,0x19,0x8c,0xc6,0x60,0xc0,0x60,0x30,0x18,0x1e,0x3b,0x8d,0x86,0xc3,0x61,
|
||||||
|
0xb0,0xd8,0x10,0x36,0x31,0x98,0xcc,0x66,0x33,0x19,0xd8,0xc6,0x0f,0x7f,0x82,0x01,
|
||||||
|
0x02,0x40,0xd0,0x40,0x6c,0x70,0x24,0x1c,0x06,0x04,0x03,0x01,0xc0,0xe0,0x10,0x12,
|
||||||
|
0x09,0x04,0x82,0x40,0x90,0x50,0x10,0x12,0x70,0x09,0x04,0x04,0x01,0xc1,0x20,0x60,
|
||||||
|
0x00,0x0c,0x00,0x04,0x83,0xc0,0x20,0xcc,0x00,0x30,0x03,0x02,0x01,0x00,0x00,0x00,
|
||||||
|
0x00,0x18,0x63,0x06,0x01,0x83,0x84,0x63,0xf1,0xd8,0x18,0x3c,0x31,0x86,0x03,0x01,
|
||||||
|
0x83,0xf8,0x30,0x1c,0x9b,0x33,0x1e,0x0c,0x06,0x33,0xe1,0x80,0xc0,0x7f,0x0c,0x01,
|
||||||
|
0x8f,0x06,0x07,0x79,0x65,0x86,0x66,0x61,0x9e,0x07,0x81,0x83,0x19,0x89,0xb6,0x1c,
|
||||||
|
0x1a,0x03,0x06,0x01,0x80,0x30,0x48,0x00,0x00,0x03,0x18,0xcc,0x06,0x33,0x18,0x60,
|
||||||
|
0xc6,0x63,0x06,0x01,0x8c,0x80,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8e,0x4c,0x01,0x83,
|
||||||
|
0x19,0x8d,0x92,0x32,0x31,0x81,0x87,0x00,0xc0,0x70,0xe4,0xaa,0x98,0xc0,0x7d,0xfe,
|
||||||
|
0xfd,0xbf,0x2f,0xbf,0x93,0x8f,0xdb,0xe3,0xf9,0xfb,0xff,0x1e,0x3f,0x1f,0xef,0xed,
|
||||||
|
0xf6,0xfb,0x7d,0xbf,0x6f,0xaf,0xef,0xed,0x8f,0xf6,0xfb,0xfb,0xfe,0x3e,0xdf,0x9f,
|
||||||
|
0x00,0x00,0x19,0x0f,0xc6,0x30,0xd0,0x00,0xcc,0x00,0x28,0x59,0x86,0x67,0xf0,0x01,
|
||||||
|
0x72,0x00,0x00,0x3f,0x86,0x00,0xc0,0x03,0x18,0xf4,0x00,0x00,0x0c,0x18,0xcc,0xc5,
|
||||||
|
0x32,0x83,0x4c,0x00,0x66,0x33,0x19,0x8c,0xc6,0x63,0x31,0xbc,0xc0,0x3e,0x1f,0x0f,
|
||||||
|
0x87,0xc1,0x80,0xc0,0x60,0x30,0xfb,0x2c,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x38,0xcb,
|
||||||
|
0x31,0x98,0xcc,0x66,0x31,0xa1,0x8c,0xcc,0x06,0x03,0x01,0x80,0xc0,0x60,0x30,0x6c,
|
||||||
|
0xc0,0x63,0x31,0x98,0xcc,0x60,0xc0,0x60,0x30,0x18,0x37,0x31,0x98,0xcc,0x66,0x33,
|
||||||
|
0x19,0x8c,0x00,0x67,0x31,0x98,0xcc,0x66,0x33,0x19,0x8c,0xc6,0x1f,0x7f,0x82,0x01,
|
||||||
|
0x02,0x40,0xb0,0x40,0x6c,0x07,0x03,0x83,0x80,0xe0,0xe0,0x00,0x18,0x0e,0x10,0x10,
|
||||||
|
0x08,0x04,0x02,0x00,0xf0,0x20,0x10,0x1e,0x08,0x89,0x03,0x00,0xe0,0x38,0x1c,0x0e,
|
||||||
|
0x00,0x0c,0x00,0x04,0x81,0xe0,0x41,0x6c,0x00,0x30,0x03,0x00,0x0f,0xe0,0x03,0xf8,
|
||||||
|
0x00,0x30,0x63,0x06,0x03,0x00,0xc7,0xf0,0x39,0x8c,0x30,0x3e,0x1b,0x80,0x00,0x03,
|
||||||
|
0x00,0x00,0x18,0x30,0x9b,0x23,0x19,0x0c,0x06,0x33,0x01,0xf8,0xc6,0x63,0x0c,0x01,
|
||||||
|
0x8d,0x86,0x05,0xd9,0x35,0x86,0x7c,0x61,0x9b,0x01,0xc1,0x83,0x19,0x99,0xb4,0x1c,
|
||||||
|
0x0c,0x06,0x06,0x00,0xc0,0x30,0xcc,0x00,0x00,0x3f,0x18,0xcc,0x06,0x33,0xf8,0x60,
|
||||||
|
0xc6,0x63,0x06,0x01,0x8f,0x00,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8c,0x0f,0x81,0x83,
|
||||||
|
0x18,0xd9,0xba,0x1c,0x1b,0x03,0x00,0x80,0xc0,0x81,0x75,0x54,0x98,0xc0,0x7d,0xfe,
|
||||||
|
0xfd,0xbf,0x4f,0xbf,0x93,0xf8,0xfc,0x7c,0x7f,0x1f,0x1f,0x6f,0xe7,0xf1,0xef,0xef,
|
||||||
|
0xf7,0xfb,0xfd,0xff,0x0f,0xdf,0xef,0xe1,0xf7,0x76,0xfc,0xff,0x1f,0xc7,0xe3,0xf1,
|
||||||
|
0xff,0x08,0x19,0x03,0x06,0x31,0xf8,0x00,0xc6,0x00,0x28,0x5b,0x8c,0xc0,0x11,0xf1,
|
||||||
|
0x4a,0x00,0x00,0x04,0x0c,0x00,0xc0,0x03,0x18,0x74,0x38,0x00,0x0c,0x18,0xc6,0x65,
|
||||||
|
0x52,0xb8,0x54,0x18,0x46,0x23,0x11,0x88,0xc4,0x62,0x31,0x30,0xc0,0x30,0x18,0x0c,
|
||||||
|
0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x26,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x10,0xd3,
|
||||||
|
0x31,0x98,0xcc,0x66,0x30,0xc1,0x8c,0xc6,0x7e,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xfc,
|
||||||
|
0xc0,0x7f,0x3f,0x9f,0xcf,0xe0,0xc0,0x60,0x30,0x18,0x63,0x31,0x98,0xcc,0x66,0x33,
|
||||||
|
0x19,0x8c,0xfe,0x6b,0x31,0x98,0xcc,0x66,0x31,0xb1,0x8c,0x6c,0x0e,0x7f,0x82,0x01,
|
||||||
|
0x01,0x80,0x90,0x30,0xc6,0x08,0x01,0x02,0x00,0x40,0x80,0xe0,0x24,0x04,0x1c,0x10,
|
||||||
|
0x08,0x04,0x02,0x00,0x90,0x20,0x10,0x12,0x0d,0x86,0x00,0x81,0x00,0x40,0x20,0x10,
|
||||||
|
0x00,0x04,0x00,0x1f,0xe1,0x70,0xbb,0x28,0x00,0x30,0x03,0x00,0x01,0x00,0x00,0x00,
|
||||||
|
0x00,0x30,0x63,0x06,0x06,0x00,0x67,0xf0,0x19,0x8c,0x30,0x67,0x0d,0x80,0x00,0x01,
|
||||||
|
0x83,0xf8,0x30,0x30,0x9b,0x7f,0x19,0x8c,0x06,0x33,0x01,0x80,0xc6,0x63,0x0c,0x01,
|
||||||
|
0x8c,0xc6,0x05,0xd9,0x35,0x86,0x60,0x61,0x99,0x80,0xe1,0x83,0x18,0xd0,0xdc,0x26,
|
||||||
|
0x0c,0x0c,0x06,0x00,0xc0,0x30,0x84,0x00,0x00,0x63,0x18,0xcc,0x06,0x33,0x00,0x60,
|
||||||
|
0xc6,0x63,0x06,0x01,0x8d,0x80,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8c,0x03,0xe1,0x83,
|
||||||
|
0x18,0xd9,0xba,0x1c,0x1b,0x06,0x01,0x80,0xc0,0xc1,0x38,0xaa,0x80,0xc0,0x7d,0xfe,
|
||||||
|
0xfe,0x7f,0x6f,0xcf,0x39,0xf7,0xfe,0xfd,0xff,0xbf,0x7f,0x0f,0xdb,0xfb,0xe3,0xef,
|
||||||
|
0xf7,0xfb,0xfd,0xff,0x6f,0xdf,0xef,0xed,0xf2,0x79,0xff,0x7e,0xff,0xbf,0xdf,0xef,
|
||||||
|
0x00,0x0c,0x19,0x03,0x03,0x60,0x60,0x30,0x66,0x00,0x28,0x4d,0xc6,0x60,0x10,0x00,
|
||||||
|
0x84,0x00,0x00,0x04,0x0f,0x87,0x80,0x03,0x18,0x14,0x38,0x00,0x3f,0x0f,0x8c,0xc2,
|
||||||
|
0x90,0x84,0xa4,0x18,0xfe,0x7f,0x3f,0x9f,0xcf,0xe7,0xf1,0xf0,0xc0,0x30,0x18,0x0c,
|
||||||
|
0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x26,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x38,0xd3,
|
||||||
|
0x31,0x98,0xcc,0x66,0x30,0xc1,0x98,0xc6,0xc6,0x63,0x31,0x98,0xcc,0x66,0x33,0x60,
|
||||||
|
0xc0,0x60,0x30,0x18,0x0c,0x00,0xc0,0x60,0x30,0x18,0x63,0x31,0x98,0xcc,0x66,0x33,
|
||||||
|
0x19,0x8c,0x00,0x6b,0x31,0x98,0xcc,0x66,0x31,0xb1,0x8c,0x6c,0x1c,0x7f,0x81,0x20,
|
||||||
|
0x90,0x38,0x18,0x0b,0x83,0x06,0x01,0x03,0x80,0x40,0xe0,0x90,0x24,0x04,0x03,0x8e,
|
||||||
|
0x86,0xc3,0x61,0x90,0x24,0x12,0x0e,0x04,0x8a,0x81,0xc7,0x70,0xc0,0x30,0x18,0x0c,
|
||||||
|
0x00,0x00,0x00,0x04,0x81,0x31,0x6f,0x30,0x00,0x18,0x06,0x00,0x01,0x00,0x00,0x00,
|
||||||
|
0x00,0x60,0x63,0x06,0x0c,0x00,0x60,0x60,0x19,0x8c,0x60,0x63,0x01,0x80,0x00,0x00,
|
||||||
|
0xc0,0x00,0x60,0x00,0x4d,0xe1,0x99,0x8c,0x06,0x33,0x01,0x80,0xc6,0x63,0x0c,0x01,
|
||||||
|
0x8c,0xc6,0x04,0x99,0x1d,0x86,0x60,0x61,0x99,0x80,0x61,0x83,0x18,0xd0,0xdc,0x63,
|
||||||
|
0x0c,0x0c,0x06,0x00,0x60,0x30,0x84,0x00,0x00,0x63,0x18,0xcc,0x06,0x33,0x00,0x60,
|
||||||
|
0x6e,0x63,0x06,0x01,0x8c,0xc0,0xc6,0xd9,0x8c,0xc6,0x63,0x31,0x8c,0x00,0x61,0x83,
|
||||||
|
0x18,0xd0,0xcc,0x26,0x0e,0x0c,0x03,0x00,0xc0,0x60,0x01,0x54,0x98,0xc0,0x7e,0xdf,
|
||||||
|
0x6f,0xc7,0xe7,0xf4,0x7c,0xf9,0xfe,0xfc,0x7f,0xbf,0x1f,0x5f,0xdb,0xfb,0xfc,0x71,
|
||||||
|
0x79,0x3c,0x9e,0x6f,0xdb,0xed,0xf1,0xfb,0x75,0x7e,0x38,0x8f,0x3f,0xcf,0xe7,0xf3,
|
||||||
|
0xff,0x0c,0x0d,0x03,0x03,0xe1,0xf8,0x30,0x3c,0x00,0x27,0x40,0x03,0x30,0x00,0x00,
|
||||||
|
0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x14,0x00,0x00,0x00,0x00,0x19,0x82,
|
||||||
|
0xf8,0x98,0xbe,0x70,0xc3,0x61,0xb0,0xd8,0x6c,0x36,0x1b,0x30,0xc0,0x30,0x18,0x0c,
|
||||||
|
0x06,0x01,0x80,0xc0,0x60,0x30,0x63,0x23,0xb0,0xd8,0x6c,0x36,0x1b,0x0c,0x4c,0xe3,
|
||||||
|
0x31,0x98,0xcc,0x66,0x30,0xc1,0xf0,0xc6,0xc6,0x63,0x31,0x98,0xcc,0x66,0x33,0x60,
|
||||||
|
0xc0,0x60,0x30,0x18,0x0c,0x00,0xc0,0x60,0x30,0x18,0x63,0x31,0x98,0xcc,0x66,0x33,
|
||||||
|
0x19,0x8c,0x10,0x73,0x31,0x98,0xcc,0x66,0x30,0xe1,0x8c,0x38,0x1c,0x7f,0x80,0xa0,
|
||||||
|
0x50,0x10,0x24,0x0d,0xff,0x01,0x01,0x02,0x00,0x40,0x80,0xf0,0x24,0x04,0x02,0x01,
|
||||||
|
0x81,0x20,0x10,0x30,0x28,0x1a,0x09,0x06,0x8a,0x81,0x20,0x90,0x20,0x08,0x04,0x02,
|
||||||
|
0x00,0x0c,0x00,0x04,0x85,0x32,0x6f,0xb8,0x00,0x18,0x06,0x00,0x01,0x01,0xc0,0x00,
|
||||||
|
0x70,0x60,0x36,0x06,0x1f,0xcc,0xe0,0x63,0x30,0xd8,0x60,0x63,0x33,0x06,0x03,0x00,
|
||||||
|
0x60,0x00,0xc0,0x30,0x60,0x61,0x99,0x86,0x66,0x63,0x01,0x80,0x66,0x63,0x0c,0x03,
|
||||||
|
0x0c,0x66,0x04,0x19,0x1c,0xcc,0x60,0x33,0x18,0xcc,0x61,0x81,0xb0,0x60,0xcc,0x63,
|
||||||
|
0x0c,0x18,0x06,0x00,0x60,0x30,0x00,0x00,0x00,0x67,0x19,0x86,0x23,0x71,0x88,0x60,
|
||||||
|
0x36,0x63,0x06,0x01,0x8c,0x60,0xc6,0xd9,0x8c,0x6c,0x66,0x1b,0x8c,0x08,0x61,0x83,
|
||||||
|
0xb8,0x70,0xcc,0x63,0x0c,0x18,0x03,0x00,0xc0,0x60,0x00,0xaa,0x98,0xc0,0x7f,0x5f,
|
||||||
|
0xaf,0xef,0xdb,0xf2,0x00,0xfe,0xfe,0xfd,0xff,0xbf,0x7f,0x6f,0xdb,0xfb,0xfd,0xfe,
|
||||||
|
0x7e,0xdf,0xef,0xcf,0xd7,0xe5,0xf6,0xf9,0x75,0x7e,0xdf,0x6f,0xdf,0xf7,0xfb,0xfd,
|
||||||
|
0x00,0x0c,0x07,0xc6,0x04,0x10,0x60,0x30,0x06,0x00,0x10,0x80,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x3f,0x80,0x00,0x00,0x03,0xb8,0x14,0x00,0x00,0x00,0x00,0x00,0x04,
|
||||||
|
0x11,0x21,0x04,0xc0,0xc3,0x61,0xb0,0xd8,0x6c,0x36,0x1b,0x30,0x66,0x30,0x18,0x0c,
|
||||||
|
0x06,0x01,0x80,0xc0,0x60,0x30,0x66,0x23,0x99,0x8c,0xc6,0x63,0x31,0x98,0x00,0x66,
|
||||||
|
0x1b,0x0d,0x86,0xc3,0x60,0xc1,0x80,0xc6,0xce,0x67,0x33,0x99,0xcc,0xe6,0x73,0x74,
|
||||||
|
0x62,0x31,0x18,0x8c,0x46,0x20,0xc0,0x60,0x30,0x18,0x36,0x31,0x8d,0x86,0xc3,0x61,
|
||||||
|
0xb0,0xd8,0x10,0x36,0x3b,0x9d,0xce,0xe7,0x70,0xc1,0x98,0x30,0x00,0x7f,0x80,0xc0,
|
||||||
|
0x60,0x10,0x24,0x0c,0x38,0x0e,0x01,0x02,0x00,0x40,0x80,0xa0,0x18,0x0e,0x03,0x00,
|
||||||
|
0x80,0x40,0x60,0x50,0x30,0x16,0x0e,0x05,0x88,0x81,0xc0,0x81,0xc0,0x70,0x38,0x1c,
|
||||||
|
0x00,0x0c,0x00,0x04,0x83,0xe0,0x39,0xcc,0x00,0x0c,0x0c,0x00,0x00,0x01,0xc0,0x00,
|
||||||
|
0x70,0xc0,0x1c,0x06,0x1f,0xc7,0xc0,0x61,0xe0,0x70,0x60,0x3e,0x1e,0x06,0x03,0x00,
|
||||||
|
0x00,0x00,0x00,0x30,0x1e,0x61,0x9f,0x03,0xc7,0xc3,0xf1,0x80,0x3e,0x63,0x3f,0x1e,
|
||||||
|
0x0c,0x67,0xe4,0x19,0x0c,0x78,0x60,0x1e,0x18,0xc7,0xc1,0x80,0xe0,0x60,0xcc,0x63,
|
||||||
|
0x0c,0x1f,0xc6,0x00,0x30,0x30,0x00,0x00,0x00,0x3b,0x9f,0x03,0xc1,0xb0,0xf0,0x60,
|
||||||
|
0x06,0x63,0x06,0x01,0x8c,0x70,0xc6,0xd9,0x8c,0x38,0x7c,0x0d,0x8c,0x07,0xc0,0xf1,
|
||||||
|
0xd8,0x60,0xcc,0x63,0x0c,0x1f,0xc3,0x00,0xc0,0x60,0x01,0x54,0x80,0xc0,0x7f,0x3f,
|
||||||
|
0x9f,0xef,0xdb,0xf3,0xc7,0xf1,0xfe,0xfd,0xff,0xbf,0x7f,0xff,0xe7,0xf1,0xfc,0xff,
|
||||||
|
0x7f,0xbf,0x9f,0xaf,0xcf,0xe9,0xf1,0xfa,0x77,0x7e,0x3f,0x7e,0x3f,0x8f,0xc7,0xe3,
|
||||||
|
0xff,0x0c,0x01,0x0f,0xe8,0x08,0x60,0x30,0xc6,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xd8,0x14,0x00,0x00,0x00,0x00,0x00,0x04,
|
||||||
|
0x11,0x3d,0x04,0xc0,0xc3,0x61,0xb0,0xd8,0x6c,0x36,0x1b,0x3c,0x3c,0x3f,0x1f,0x8f,
|
||||||
|
0xc7,0xe7,0xe3,0xf1,0xf8,0xfc,0x7c,0x21,0x8f,0x07,0x83,0xc1,0xe0,0xf0,0x00,0xbc,
|
||||||
|
0x0e,0x07,0x03,0x81,0xc0,0xc1,0x80,0xcc,0x77,0x3b,0x9d,0xce,0xe7,0x73,0xb9,0x98,
|
||||||
|
0x3c,0x1e,0x0f,0x07,0x83,0xc0,0xc0,0x60,0x30,0x18,0x1c,0x31,0x87,0x03,0x81,0xc0,
|
||||||
|
0xe0,0x70,0x00,0x5c,0x1d,0x8e,0xc7,0x63,0xb0,0xc1,0xf0,0x30,0x00,0x7f,0x81,0x40,
|
||||||
|
0xa0,0x10,0x28,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x02,0x00,
|
||||||
|
0x80,0x80,0x10,0xf8,0x28,0x12,0x09,0x04,0x80,0x01,0x20,0x80,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x06,0x18,0x00,0x00,0x00,0x40,0x00,
|
||||||
|
0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x07,0xc0,0x31,0xf0,0x01,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0xcc,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x80,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x18,0x00,0x01,0xe0,0xc3,0xc0,0x00,0x00,0xff,0xc0,0x7e,0xbf,
|
||||||
|
0x5f,0xef,0xd7,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,
|
||||||
|
0x7f,0x7f,0xef,0x07,0xd7,0xed,0xf6,0xfb,0x7f,0xfe,0xdf,0x7f,0xff,0xff,0xff,0xff,
|
||||||
|
0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x30,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x81,0x80,0x60,0x00,0x7f,0x81,0x20,
|
||||||
|
0x90,0x10,0x1c,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,
|
||||||
|
0x81,0xe0,0x60,0x10,0x24,0x12,0x0e,0x04,0x80,0x01,0xc0,0x70,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x78,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x80,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfe,0xdf,
|
||||||
|
0x6f,0xef,0xe3,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x7f,
|
||||||
|
0x7e,0x1f,0x9f,0xef,0xdb,0xed,0xf1,0xfb,0x7f,0xfe,0x3f,0x8f,0xff,0xff,0xff,0xff,
|
||||||
|
0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x81,0x80,0x60,0x20,0x20,0x20,0x20,
|
||||||
|
0x20,0x20,0x20,0x20,0x32,0x35,0x36,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
|
||||||
|
0x20,0x31,0x35,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x33,0x20,
|
||||||
|
0x00,0x00,0x01,0x0c,0x00,0x09,0x09,0x00,0x01,0x0f,0x00,0x09,0x12,0x00,0x01,0x0f,
|
||||||
|
0x00,0x09,0x1b,0x00,0x01,0x0f,0x00,0x09,0x24,0x00,0x01,0x0f,0x00,0x09,0x2d,0x00,
|
||||||
|
0x01,0x0f,0x00,0x09,0x36,0x00,0x01,0x0f,0x00,0x09,0x3f,0x00,0x03,0x0d,0x00,0x09,
|
||||||
|
0x48,0x00,0x03,0x0d,0x00,0x09,0x51,0x00,0x03,0x0d,0x00,0x09,0x5a,0x00,0x03,0x0d,
|
||||||
|
0x00,0x09,0x63,0x00,0x03,0x0d,0x00,0x09,0x6c,0x00,0x03,0x0d,0x00,0x09,0x75,0x00,
|
||||||
|
0x03,0x0e,0x00,0x09,0x7e,0x00,0x03,0x0d,0x00,0x09,0x87,0x00,0x03,0x0d,0x00,0x09,
|
||||||
|
0x90,0x00,0x01,0x0f,0x00,0x09,0x99,0x00,0x01,0x0f,0x00,0x09,0xa2,0x00,0x01,0x0f,
|
||||||
|
0x00,0x09,0xab,0x00,0x01,0x0f,0x00,0x09,0xb4,0x00,0x01,0x0f,0x00,0x09,0xbd,0x00,
|
||||||
|
0x01,0x0f,0x00,0x09,0xc6,0x00,0x01,0x0f,0x00,0x09,0xcf,0x00,0x01,0x0f,0x00,0x09,
|
||||||
|
0xd8,0x00,0x01,0x0f,0x00,0x09,0xe1,0x00,0x03,0x0d,0x00,0x09,0xea,0x00,0x01,0x0f,
|
||||||
|
0x00,0x09,0xf3,0x00,0x01,0x0f,0x00,0x09,0xfc,0x00,0x03,0x0d,0x00,0x09,0x05,0x01,
|
||||||
|
0x03,0x0d,0x00,0x09,0x0e,0x01,0x03,0x0d,0x00,0x09,0x17,0x01,0x03,0x0d,0x00,0x09,
|
||||||
|
0x20,0x01,0x00,0x00,0x00,0x09,0x29,0x01,0x03,0x0d,0x00,0x09,0x32,0x01,0x02,0x05,
|
||||||
|
0x00,0x09,0x3b,0x01,0x03,0x0d,0x00,0x09,0x44,0x01,0x02,0x0e,0x00,0x09,0x4d,0x01,
|
||||||
|
0x03,0x0d,0x00,0x09,0x56,0x01,0x03,0x0d,0x00,0x09,0x5f,0x01,0x02,0x06,0x00,0x09,
|
||||||
|
0x68,0x01,0x02,0x0e,0x00,0x09,0x71,0x01,0x02,0x0e,0x00,0x09,0x7a,0x01,0x03,0x08,
|
||||||
|
0x00,0x09,0x83,0x01,0x05,0x0c,0x00,0x09,0x8c,0x01,0x0b,0x0f,0x00,0x09,0x95,0x01,
|
||||||
|
0x08,0x09,0x00,0x09,0x9e,0x01,0x0b,0x0d,0x00,0x09,0xa7,0x01,0x02,0x0e,0x00,0x09,
|
||||||
|
0xb0,0x01,0x03,0x0d,0x00,0x09,0xb9,0x01,0x03,0x0d,0x00,0x09,0xc2,0x01,0x03,0x0d,
|
||||||
|
0x00,0x09,0xcb,0x01,0x03,0x0d,0x00,0x09,0xd4,0x01,0x03,0x0d,0x00,0x09,0xdd,0x01,
|
||||||
|
0x03,0x0d,0x00,0x09,0xe6,0x01,0x03,0x0d,0x00,0x09,0xef,0x01,0x03,0x0d,0x00,0x09,
|
||||||
|
0xf8,0x01,0x03,0x0d,0x00,0x09,0x01,0x02,0x03,0x0d,0x00,0x09,0x0a,0x02,0x06,0x0d,
|
||||||
|
0x00,0x09,0x13,0x02,0x06,0x0f,0x00,0x09,0x1c,0x02,0x05,0x0c,0x00,0x09,0x25,0x02,
|
||||||
|
0x07,0x0a,0x00,0x09,0x2e,0x02,0x05,0x0c,0x00,0x09,0x37,0x02,0x03,0x0d,0x00,0x09,
|
||||||
|
0x40,0x02,0x03,0x0d,0x00,0x09,0x49,0x02,0x03,0x0d,0x00,0x09,0x52,0x02,0x03,0x0d,
|
||||||
|
0x00,0x09,0x5b,0x02,0x03,0x0d,0x00,0x09,0x64,0x02,0x03,0x0d,0x00,0x09,0x6d,0x02,
|
||||||
|
0x03,0x0d,0x00,0x09,0x76,0x02,0x03,0x0d,0x00,0x09,0x7f,0x02,0x03,0x0d,0x00,0x09,
|
||||||
|
0x88,0x02,0x03,0x0d,0x00,0x09,0x91,0x02,0x03,0x0d,0x00,0x09,0x9a,0x02,0x03,0x0d,
|
||||||
|
0x00,0x09,0xa3,0x02,0x03,0x0d,0x00,0x09,0xac,0x02,0x03,0x0d,0x00,0x09,0xb5,0x02,
|
||||||
|
0x03,0x0d,0x00,0x09,0xbe,0x02,0x03,0x0d,0x00,0x09,0xc7,0x02,0x03,0x0d,0x00,0x09,
|
||||||
|
0xd0,0x02,0x03,0x0d,0x00,0x09,0xd9,0x02,0x03,0x0f,0x00,0x09,0xe2,0x02,0x03,0x0d,
|
||||||
|
0x00,0x09,0xeb,0x02,0x03,0x0d,0x00,0x09,0xf4,0x02,0x03,0x0d,0x00,0x09,0xfd,0x02,
|
||||||
|
0x03,0x0d,0x00,0x09,0x06,0x03,0x03,0x0d,0x00,0x09,0x0f,0x03,0x03,0x0d,0x00,0x09,
|
||||||
|
0x18,0x03,0x03,0x0d,0x00,0x09,0x21,0x03,0x03,0x0d,0x00,0x09,0x2a,0x03,0x03,0x0d,
|
||||||
|
0x00,0x09,0x33,0x03,0x02,0x0e,0x00,0x09,0x3c,0x03,0x02,0x0e,0x00,0x09,0x45,0x03,
|
||||||
|
0x02,0x0e,0x00,0x09,0x4e,0x03,0x04,0x0b,0x00,0x09,0x57,0x03,0x0d,0x0e,0x00,0x09,
|
||||||
|
0x60,0x03,0x02,0x06,0x00,0x09,0x69,0x03,0x05,0x0d,0x00,0x09,0x72,0x03,0x02,0x0d,
|
||||||
|
0x00,0x09,0x7b,0x03,0x05,0x0d,0x00,0x09,0x84,0x03,0x02,0x0d,0x00,0x09,0x8d,0x03,
|
||||||
|
0x05,0x0d,0x00,0x09,0x96,0x03,0x02,0x0d,0x00,0x09,0x9f,0x03,0x05,0x0f,0x00,0x09,
|
||||||
|
0xa8,0x03,0x02,0x0d,0x00,0x09,0xb1,0x03,0x02,0x0d,0x00,0x09,0xba,0x03,0x02,0x0f,
|
||||||
|
0x00,0x09,0xc3,0x03,0x02,0x0d,0x00,0x09,0xcc,0x03,0x02,0x0d,0x00,0x09,0xd5,0x03,
|
||||||
|
0x05,0x0d,0x00,0x09,0xde,0x03,0x05,0x0d,0x00,0x09,0xe7,0x03,0x05,0x0d,0x00,0x09,
|
||||||
|
0xf0,0x03,0x05,0x0f,0x00,0x09,0xf9,0x03,0x05,0x0f,0x00,0x09,0x02,0x04,0x05,0x0d,
|
||||||
|
0x00,0x09,0x0b,0x04,0x05,0x0d,0x00,0x09,0x14,0x04,0x03,0x0d,0x00,0x09,0x1d,0x04,
|
||||||
|
0x05,0x0d,0x00,0x09,0x26,0x04,0x05,0x0d,0x00,0x09,0x2f,0x04,0x05,0x0d,0x00,0x09,
|
||||||
|
0x38,0x04,0x05,0x0d,0x00,0x09,0x41,0x04,0x05,0x0f,0x00,0x09,0x4a,0x04,0x05,0x0d,
|
||||||
|
0x00,0x09,0x53,0x04,0x02,0x0e,0x00,0x09,0x5c,0x04,0x02,0x0e,0x00,0x09,0x65,0x04,
|
||||||
|
0x02,0x0e,0x00,0x09,0x6e,0x04,0x07,0x0a,0x00,0x09,0x77,0x04,0x01,0x0d,0x00,0x09,
|
||||||
|
0x80,0x04,0x00,0x0e,0x00,0x09,0x89,0x04,0x00,0x0f,0x00,0x09,0x92,0x04,0x00,0x0f,
|
||||||
|
0x00,0x09,0x9b,0x04,0x00,0x0f,0x00,0x09,0xa4,0x04,0x00,0x0f,0x00,0x09,0xad,0x04,
|
||||||
|
0x00,0x0f,0x00,0x09,0xb6,0x04,0x00,0x0f,0x00,0x09,0xbf,0x04,0x00,0x0f,0x00,0x09,
|
||||||
|
0xc8,0x04,0x00,0x0f,0x00,0x09,0xd1,0x04,0x00,0x0f,0x00,0x09,0xda,0x04,0x00,0x0f,
|
||||||
|
0x00,0x09,0xe3,0x04,0x00,0x0f,0x00,0x09,0xec,0x04,0x00,0x0f,0x00,0x09,0xf5,0x04,
|
||||||
|
0x00,0x0f,0x00,0x09,0xfe,0x04,0x00,0x0f,0x00,0x09,0x07,0x05,0x00,0x0f,0x00,0x09,
|
||||||
|
0x10,0x05,0x00,0x0f,0x00,0x09,0x19,0x05,0x00,0x0f,0x00,0x09,0x22,0x05,0x00,0x0f,
|
||||||
|
0x00,0x09,0x2b,0x05,0x00,0x0f,0x00,0x09,0x34,0x05,0x00,0x0f,0x00,0x09,0x3d,0x05,
|
||||||
|
0x00,0x0f,0x00,0x09,0x46,0x05,0x00,0x0f,0x00,0x09,0x4f,0x05,0x00,0x0f,0x00,0x09,
|
||||||
|
0x58,0x05,0x00,0x0f,0x00,0x09,0x61,0x05,0x00,0x0f,0x00,0x09,0x6a,0x05,0x00,0x0f,
|
||||||
|
0x00,0x09,0x73,0x05,0x00,0x0f,0x00,0x09,0x7c,0x05,0x00,0x0f,0x00,0x09,0x85,0x05,
|
||||||
|
0x00,0x0f,0x00,0x09,0x8e,0x05,0x00,0x0f,0x00,0x09,0x97,0x05,0x00,0x0f,0x00,0x09,
|
||||||
|
0xa0,0x05,0x00,0x0d,0x00,0x09,0xa9,0x05,0x05,0x0f,0x00,0x09,0xb2,0x05,0x02,0x0e,
|
||||||
|
0x00,0x09,0xbb,0x05,0x03,0x0d,0x00,0x09,0xc4,0x05,0x03,0x0d,0x00,0x09,0xcd,0x05,
|
||||||
|
0x03,0x0d,0x00,0x09,0xd6,0x05,0x02,0x0e,0x00,0x09,0xdf,0x05,0x03,0x0e,0x00,0x09,
|
||||||
|
0xe8,0x05,0x02,0x04,0x00,0x09,0xf1,0x05,0x03,0x0d,0x00,0x09,0xfa,0x05,0x03,0x0a,
|
||||||
|
0x00,0x09,0x03,0x06,0x06,0x0b,0x00,0x09,0x0c,0x06,0x07,0x0a,0x00,0x09,0x15,0x06,
|
||||||
|
0x08,0x09,0x00,0x09,0x1e,0x06,0x03,0x0b,0x00,0x09,0x27,0x06,0x02,0x03,0x00,0x09,
|
||||||
|
0x30,0x06,0x03,0x07,0x00,0x09,0x39,0x06,0x05,0x0c,0x00,0x09,0x42,0x06,0x03,0x0a,
|
||||||
|
0x00,0x09,0x4b,0x06,0x03,0x0a,0x00,0x09,0x54,0x06,0x02,0x04,0x00,0x09,0x5d,0x06,
|
||||||
|
0x05,0x0f,0x00,0x09,0x66,0x06,0x03,0x0e,0x00,0x09,0x6f,0x06,0x08,0x0a,0x00,0x09,
|
||||||
|
0x78,0x06,0x0d,0x0f,0x00,0x09,0x81,0x06,0x03,0x0a,0x00,0x09,0x8a,0x06,0x03,0x0a,
|
||||||
|
0x00,0x09,0x93,0x06,0x06,0x0b,0x00,0x09,0x9c,0x06,0x03,0x0d,0x00,0x09,0xa5,0x06,
|
||||||
|
0x03,0x0d,0x00,0x09,0xae,0x06,0x03,0x0d,0x00,0x09,0xb7,0x06,0x05,0x0f,0x00,0x09,
|
||||||
|
0xc0,0x06,0x00,0x0d,0x00,0x09,0xc9,0x06,0x00,0x0d,0x00,0x09,0xd2,0x06,0x00,0x0d,
|
||||||
|
0x00,0x09,0xdb,0x06,0x00,0x0d,0x00,0x09,0xe4,0x06,0x00,0x0d,0x00,0x09,0xed,0x06,
|
||||||
|
0x01,0x0d,0x00,0x09,0xf6,0x06,0x03,0x0d,0x00,0x09,0xff,0x06,0x03,0x0f,0x00,0x09,
|
||||||
|
0x08,0x07,0x00,0x0d,0x00,0x09,0x11,0x07,0x00,0x0d,0x00,0x09,0x1a,0x07,0x00,0x0d,
|
||||||
|
0x00,0x09,0x23,0x07,0x00,0x0d,0x00,0x09,0x2c,0x07,0x00,0x0d,0x00,0x09,0x35,0x07,
|
||||||
|
0x00,0x0d,0x00,0x09,0x3e,0x07,0x00,0x0d,0x00,0x09,0x47,0x07,0x00,0x0d,0x00,0x09,
|
||||||
|
0x50,0x07,0x03,0x0d,0x00,0x09,0x59,0x07,0x00,0x0d,0x00,0x09,0x62,0x07,0x00,0x0d,
|
||||||
|
0x00,0x09,0x6b,0x07,0x00,0x0d,0x00,0x09,0x74,0x07,0x00,0x0d,0x00,0x09,0x7d,0x07,
|
||||||
|
0x00,0x0d,0x00,0x09,0x86,0x07,0x00,0x0d,0x00,0x09,0x8f,0x07,0x06,0x0b,0x00,0x09,
|
||||||
|
0x98,0x07,0x03,0x0d,0x00,0x09,0xa1,0x07,0x00,0x0d,0x00,0x09,0xaa,0x07,0x00,0x0d,
|
||||||
|
0x00,0x09,0xb3,0x07,0x00,0x0d,0x00,0x09,0xbc,0x07,0x00,0x0d,0x00,0x09,0xc5,0x07,
|
||||||
|
0x00,0x0d,0x00,0x09,0xce,0x07,0x03,0x0d,0x00,0x09,0xd7,0x07,0x02,0x0d,0x00,0x09,
|
||||||
|
0xe0,0x07,0x02,0x0d,0x00,0x09,0xe9,0x07,0x02,0x0d,0x00,0x09,0xf2,0x07,0x02,0x0d,
|
||||||
|
0x00,0x09,0xfb,0x07,0x02,0x0d,0x00,0x09,0x04,0x08,0x02,0x0d,0x00,0x09,0x0d,0x08,
|
||||||
|
0x02,0x0d,0x00,0x09,0x16,0x08,0x05,0x0d,0x00,0x09,0x1f,0x08,0x05,0x0f,0x00,0x09,
|
||||||
|
0x28,0x08,0x02,0x0d,0x00,0x09,0x31,0x08,0x02,0x0d,0x00,0x09,0x3a,0x08,0x02,0x0d,
|
||||||
|
0x00,0x09,0x43,0x08,0x02,0x0d,0x00,0x09,0x4c,0x08,0x02,0x0d,0x00,0x09,0x55,0x08,
|
||||||
|
0x02,0x0d,0x00,0x09,0x5e,0x08,0x02,0x0d,0x00,0x09,0x67,0x08,0x02,0x0d,0x00,0x09,
|
||||||
|
0x70,0x08,0x02,0x0d,0x00,0x09,0x79,0x08,0x02,0x0d,0x00,0x09,0x82,0x08,0x02,0x0d,
|
||||||
|
0x00,0x09,0x8b,0x08,0x02,0x0d,0x00,0x09,0x94,0x08,0x02,0x0d,0x00,0x09,0x9d,0x08,
|
||||||
|
0x02,0x0d,0x00,0x09,0xa6,0x08,0x02,0x0d,0x00,0x09,0xaf,0x08,0x05,0x0c,0x00,0x09,
|
||||||
|
0xb8,0x08,0x05,0x0d,0x00,0x09,0xc1,0x08,0x02,0x0d,0x00,0x09,0xca,0x08,0x02,0x0d,
|
||||||
|
0x00,0x09,0xd3,0x08,0x02,0x0d,0x00,0x09,0xdc,0x08,0x02,0x0d,0x00,0x09,0xe5,0x08,
|
||||||
|
0x02,0x0f,0x00,0x09,0xee,0x08,0x03,0x0f,0x00,0x09,0xf7,0x08,0x02,0x0f,0x00,0x09,
|
||||||
|
0x00,0x09,0x00,0x00,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
int sizeofdefont = sizeof defontdata;
|
||||||
|
|
||||||
|
void
|
||||||
|
_unpackinfo(Fontchar *fc, uchar *p, int n)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for(j=0; j<=n; j++){
|
||||||
|
fc->x = p[0]|(p[1]<<8);
|
||||||
|
fc->top = p[2];
|
||||||
|
fc->bottom = p[3];
|
||||||
|
fc->left = p[4];
|
||||||
|
fc->width = p[5];
|
||||||
|
fc++;
|
||||||
|
p += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
69
src/libdraw/draw.c
Normal file
69
src/libdraw/draw.c
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
_setdrawop(Display *d, Drawop op)
|
||||||
|
{
|
||||||
|
uchar *a;
|
||||||
|
|
||||||
|
if(op != SoverD){
|
||||||
|
a = bufimage(d, 1+1);
|
||||||
|
if(a == 0)
|
||||||
|
return;
|
||||||
|
a[0] = 'O';
|
||||||
|
a[1] = op;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
draw1(Image *dst, Rectangle *r, Image *src, Point *p0, Image *mask, Point *p1, Drawop op)
|
||||||
|
{
|
||||||
|
uchar *a;
|
||||||
|
|
||||||
|
_setdrawop(dst->display, op);
|
||||||
|
|
||||||
|
a = bufimage(dst->display, 1+4+4+4+4*4+2*4+2*4);
|
||||||
|
if(a == 0)
|
||||||
|
return;
|
||||||
|
if(src == nil)
|
||||||
|
src = dst->display->black;
|
||||||
|
if(mask == nil)
|
||||||
|
mask = dst->display->opaque;
|
||||||
|
a[0] = 'd';
|
||||||
|
BPLONG(a+1, dst->id);
|
||||||
|
BPLONG(a+5, src->id);
|
||||||
|
BPLONG(a+9, mask->id);
|
||||||
|
BPLONG(a+13, r->min.x);
|
||||||
|
BPLONG(a+17, r->min.y);
|
||||||
|
BPLONG(a+21, r->max.x);
|
||||||
|
BPLONG(a+25, r->max.y);
|
||||||
|
BPLONG(a+29, p0->x);
|
||||||
|
BPLONG(a+33, p0->y);
|
||||||
|
BPLONG(a+37, p1->x);
|
||||||
|
BPLONG(a+41, p1->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
draw(Image *dst, Rectangle r, Image *src, Image *mask, Point p1)
|
||||||
|
{
|
||||||
|
draw1(dst, &r, src, &p1, mask, &p1, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drawop(Image *dst, Rectangle r, Image *src, Image *mask, Point p1, Drawop op)
|
||||||
|
{
|
||||||
|
draw1(dst, &r, src, &p1, mask, &p1, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gendraw(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1)
|
||||||
|
{
|
||||||
|
draw1(dst, &r, src, &p0, mask, &p1, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gendrawop(Image *dst, Rectangle r, Image *src, Point p0, Image *mask, Point p1, Drawop op)
|
||||||
|
{
|
||||||
|
draw1(dst, &r, src, &p0, mask, &p1, op);
|
||||||
|
}
|
||||||
23
src/libdraw/drawrepl.c
Normal file
23
src/libdraw/drawrepl.c
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
drawreplxy(int min, int max, int x)
|
||||||
|
{
|
||||||
|
int sx;
|
||||||
|
|
||||||
|
sx = (x-min)%(max-min);
|
||||||
|
if(sx < 0)
|
||||||
|
sx += max-min;
|
||||||
|
return sx+min;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
drawrepl(Rectangle r, Point p)
|
||||||
|
{
|
||||||
|
p.x = drawreplxy(r.min.x, r.max.x, p.x);
|
||||||
|
p.y = drawreplxy(r.min.y, r.max.y, p.y);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
116
src/libdraw/egetrect.c
Normal file
116
src/libdraw/egetrect.c
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
#include <cursor.h>
|
||||||
|
#include <event.h>
|
||||||
|
|
||||||
|
#define W Borderwidth
|
||||||
|
|
||||||
|
static Image *tmp[4];
|
||||||
|
static Image *red;
|
||||||
|
|
||||||
|
static Cursor sweep={
|
||||||
|
{-7, -7},
|
||||||
|
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
|
||||||
|
0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
|
||||||
|
0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
|
||||||
|
0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
|
||||||
|
{0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
|
||||||
|
0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
|
||||||
|
0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
|
||||||
|
0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
|
||||||
|
};
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
brects(Rectangle r, Rectangle rp[4])
|
||||||
|
{
|
||||||
|
if(Dx(r) < 2*W)
|
||||||
|
r.max.x = r.min.x+2*W;
|
||||||
|
if(Dy(r) < 2*W)
|
||||||
|
r.max.y = r.min.y+2*W;
|
||||||
|
rp[0] = Rect(r.min.x, r.min.y, r.max.x, r.min.y+W);
|
||||||
|
rp[1] = Rect(r.min.x, r.max.y-W, r.max.x, r.max.y);
|
||||||
|
rp[2] = Rect(r.min.x, r.min.y+W, r.min.x+W, r.max.y-W);
|
||||||
|
rp[3] = Rect(r.max.x-W, r.min.y+W, r.max.x, r.max.y-W);
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle
|
||||||
|
egetrect(int but, Mouse *m)
|
||||||
|
{
|
||||||
|
Rectangle r, rc;
|
||||||
|
|
||||||
|
but = 1<<(but-1);
|
||||||
|
esetcursor(&sweep);
|
||||||
|
while(m->buttons)
|
||||||
|
*m = emouse();
|
||||||
|
while(!(m->buttons & but)){
|
||||||
|
*m = emouse();
|
||||||
|
if(m->buttons & (7^but))
|
||||||
|
goto Return;
|
||||||
|
}
|
||||||
|
r.min = m->xy;
|
||||||
|
r.max = m->xy;
|
||||||
|
do{
|
||||||
|
rc = canonrect(r);
|
||||||
|
edrawgetrect(rc, 1);
|
||||||
|
*m = emouse();
|
||||||
|
edrawgetrect(rc, 0);
|
||||||
|
r.max = m->xy;
|
||||||
|
}while(m->buttons == but);
|
||||||
|
|
||||||
|
Return:
|
||||||
|
esetcursor(0);
|
||||||
|
if(m->buttons & (7^but)){
|
||||||
|
rc.min.x = rc.max.x = 0;
|
||||||
|
rc.min.y = rc.max.y = 0;
|
||||||
|
while(m->buttons)
|
||||||
|
*m = emouse();
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
freetmp(void)
|
||||||
|
{
|
||||||
|
freeimage(tmp[0]);
|
||||||
|
freeimage(tmp[1]);
|
||||||
|
freeimage(tmp[2]);
|
||||||
|
freeimage(tmp[3]);
|
||||||
|
freeimage(red);
|
||||||
|
tmp[0] = tmp[1] = tmp[2] = tmp[3] = red = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
edrawgetrect(Rectangle rc, int up)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Rectangle r, rects[4];
|
||||||
|
|
||||||
|
if(up && tmp[0]!=nil)
|
||||||
|
if(Dx(tmp[0]->r)<Dx(rc) || Dy(tmp[2]->r)<Dy(rc))
|
||||||
|
freetmp();
|
||||||
|
|
||||||
|
if(tmp[0] == 0){
|
||||||
|
r = Rect(0, 0, Dx(screen->r), W);
|
||||||
|
tmp[0] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
tmp[1] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
r = Rect(0, 0, W, Dy(screen->r));
|
||||||
|
tmp[2] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
tmp[3] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed);
|
||||||
|
if(tmp[0]==0 || tmp[1]==0 || tmp[2]==0 || tmp[3]==0 || red==0)
|
||||||
|
drawerror(display, "getrect: allocimage failed");
|
||||||
|
}
|
||||||
|
brects(rc, rects);
|
||||||
|
if(!up){
|
||||||
|
for(i=0; i<4; i++)
|
||||||
|
draw(screen, rects[i], tmp[i], nil, ZP);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(i=0; i<4; i++){
|
||||||
|
draw(tmp[i], Rect(0, 0, Dx(rects[i]), Dy(rects[i])), screen, nil, rects[i].min);
|
||||||
|
draw(screen, rects[i], red, nil, ZP);
|
||||||
|
}
|
||||||
|
}
|
||||||
17
src/libdraw/freesubfont.c
Normal file
17
src/libdraw/freesubfont.c
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
freesubfont(Subfont *f)
|
||||||
|
{
|
||||||
|
if(f == 0)
|
||||||
|
return;
|
||||||
|
f->ref--;
|
||||||
|
if(f->ref > 0)
|
||||||
|
return;
|
||||||
|
uninstallsubfont(f);
|
||||||
|
free(f->info); /* note: f->info must have been malloc'ed! */
|
||||||
|
freeimage(f->bits);
|
||||||
|
free(f);
|
||||||
|
}
|
||||||
60
src/libdraw/getdefont.c
Normal file
60
src/libdraw/getdefont.c
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
Subfont*
|
||||||
|
getdefont(Display *d)
|
||||||
|
{
|
||||||
|
char *hdr, *p;
|
||||||
|
int n;
|
||||||
|
Fontchar *fc;
|
||||||
|
Subfont *f;
|
||||||
|
int ld;
|
||||||
|
Rectangle r;
|
||||||
|
Image *i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* make sure data is word-aligned. this is true with Plan 9 compilers
|
||||||
|
* but not in general. the byte order is right because the data is
|
||||||
|
* declared as char*, not ulong*.
|
||||||
|
*/
|
||||||
|
p = (char*)defontdata;
|
||||||
|
n = (ulong)p & 3;
|
||||||
|
if(n != 0){
|
||||||
|
memmove(p+(4-n), p, sizeofdefont-n);
|
||||||
|
p += 4-n;
|
||||||
|
}
|
||||||
|
ld = atoi(p+0*12);
|
||||||
|
r.min.x = atoi(p+1*12);
|
||||||
|
r.min.y = atoi(p+2*12);
|
||||||
|
r.max.x = atoi(p+3*12);
|
||||||
|
r.max.y = atoi(p+4*12);
|
||||||
|
|
||||||
|
i = allocimage(d, r, drawld2chan[ld], 0, 0);
|
||||||
|
if(i == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
p += 5*12;
|
||||||
|
n = loadimage(i, r, (uchar*)p, (defontdata+sizeofdefont)-(uchar*)p);
|
||||||
|
if(n < 0){
|
||||||
|
freeimage(i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdr = p+n;
|
||||||
|
n = atoi(hdr);
|
||||||
|
p = hdr+3*12;
|
||||||
|
fc = malloc(sizeof(Fontchar)*(n+1));
|
||||||
|
if(fc == 0){
|
||||||
|
freeimage(i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_unpackinfo(fc, (uchar*)p, n);
|
||||||
|
f = allocsubfont("*default*", n, atoi(hdr+12), atoi(hdr+24), fc, i);
|
||||||
|
if(f == 0){
|
||||||
|
freeimage(i);
|
||||||
|
free(fc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
133
src/libdraw/getrect.c
Normal file
133
src/libdraw/getrect.c
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
#include <thread.h>
|
||||||
|
#include <cursor.h>
|
||||||
|
#include <mouse.h>
|
||||||
|
|
||||||
|
#define W Borderwidth
|
||||||
|
|
||||||
|
static Image *tmp[4];
|
||||||
|
static Image *red;
|
||||||
|
|
||||||
|
static Cursor sweep={
|
||||||
|
{-7, -7},
|
||||||
|
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07,
|
||||||
|
0xE0, 0x07, 0xE0, 0x07, 0xE3, 0xF7, 0xE3, 0xF7,
|
||||||
|
0xE3, 0xE7, 0xE3, 0xF7, 0xE3, 0xFF, 0xE3, 0x7F,
|
||||||
|
0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,},
|
||||||
|
{0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02,
|
||||||
|
0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x41, 0xE2,
|
||||||
|
0x41, 0xC2, 0x41, 0xE2, 0x41, 0x72, 0x40, 0x38,
|
||||||
|
0x40, 0x1C, 0x40, 0x0E, 0x7F, 0xE6, 0x00, 0x00,}
|
||||||
|
};
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
brects(Rectangle r, Rectangle rp[4])
|
||||||
|
{
|
||||||
|
if(Dx(r) < 2*W)
|
||||||
|
r.max.x = r.min.x+2*W;
|
||||||
|
if(Dy(r) < 2*W)
|
||||||
|
r.max.y = r.min.y+2*W;
|
||||||
|
rp[0] = Rect(r.min.x, r.min.y, r.max.x, r.min.y+W);
|
||||||
|
rp[1] = Rect(r.min.x, r.max.y-W, r.max.x, r.max.y);
|
||||||
|
rp[2] = Rect(r.min.x, r.min.y+W, r.min.x+W, r.max.y-W);
|
||||||
|
rp[3] = Rect(r.max.x-W, r.min.y+W, r.max.x, r.max.y-W);
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle
|
||||||
|
getrect(int but, Mousectl *mc)
|
||||||
|
{
|
||||||
|
Rectangle r, rc;
|
||||||
|
|
||||||
|
but = 1<<(but-1);
|
||||||
|
setcursor(mc, &sweep);
|
||||||
|
while(mc->m.buttons)
|
||||||
|
readmouse(mc);
|
||||||
|
while(!(mc->m.buttons & but)){
|
||||||
|
readmouse(mc);
|
||||||
|
if(mc->m.buttons & (7^but))
|
||||||
|
goto Return;
|
||||||
|
}
|
||||||
|
r.min = mc->m.xy;
|
||||||
|
r.max = mc->m.xy;
|
||||||
|
do{
|
||||||
|
rc = canonrect(r);
|
||||||
|
drawgetrect(rc, 1);
|
||||||
|
readmouse(mc);
|
||||||
|
drawgetrect(rc, 0);
|
||||||
|
r.max = mc->m.xy;
|
||||||
|
}while(mc->m.buttons == but);
|
||||||
|
|
||||||
|
Return:
|
||||||
|
setcursor(mc, nil);
|
||||||
|
if(mc->m.buttons & (7^but)){
|
||||||
|
rc.min.x = rc.max.x = 0;
|
||||||
|
rc.min.y = rc.max.y = 0;
|
||||||
|
while(mc->m.buttons)
|
||||||
|
readmouse(mc);
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
freetmp(void)
|
||||||
|
{
|
||||||
|
freeimage(tmp[0]);
|
||||||
|
freeimage(tmp[1]);
|
||||||
|
freeimage(tmp[2]);
|
||||||
|
freeimage(tmp[3]);
|
||||||
|
freeimage(red);
|
||||||
|
tmp[0] = tmp[1] = tmp[2] = tmp[3] = red = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int
|
||||||
|
max(int a, int b)
|
||||||
|
{
|
||||||
|
if(a > b)
|
||||||
|
return a;
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drawgetrect(Rectangle rc, int up)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Rectangle r, rects[4];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BUG: if for some reason we have two of these going on at once
|
||||||
|
* when we must grow the tmp buffers, we lose data. Also if tmp
|
||||||
|
* is unallocated and we ask to restore the screen, it would be nice
|
||||||
|
* to complain, but we silently make a mess.
|
||||||
|
*/
|
||||||
|
if(up && tmp[0]!=nil)
|
||||||
|
if(Dx(tmp[0]->r)<Dx(rc) || Dy(tmp[2]->r)<Dy(rc))
|
||||||
|
freetmp();
|
||||||
|
if(tmp[0] == 0){
|
||||||
|
r = Rect(0, 0, max(Dx(display->screenimage->r), Dx(rc)), W);
|
||||||
|
tmp[0] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
tmp[1] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
r = Rect(0, 0, W, max(Dy(display->screenimage->r), Dy(rc)));
|
||||||
|
tmp[2] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
tmp[3] = allocimage(display, r, screen->chan, 0, -1);
|
||||||
|
red = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DRed);
|
||||||
|
if(tmp[0]==0 || tmp[1]==0 || tmp[2]==0 || tmp[3]==0 || red==0){
|
||||||
|
freetmp();
|
||||||
|
drawerror(display, "getrect: allocimage failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
brects(rc, rects);
|
||||||
|
if(!up){
|
||||||
|
for(i=0; i<4; i++)
|
||||||
|
draw(screen, rects[i], tmp[i], nil, ZP);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(i=0; i<4; i++){
|
||||||
|
draw(tmp[i], Rect(0, 0, Dx(rects[i]), Dy(rects[i])), screen, nil, rects[i].min);
|
||||||
|
draw(screen, rects[i], red, nil, ZP);
|
||||||
|
}
|
||||||
|
}
|
||||||
140
src/libdraw/icossin.c
Normal file
140
src/libdraw/icossin.c
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Integer sine and cosine for integral degree argument.
|
||||||
|
* Tables computed by (sin,cos)(PI*d/180).
|
||||||
|
*/
|
||||||
|
static short sinus[91] = {
|
||||||
|
0, /* 0 */
|
||||||
|
18, /* 1 */
|
||||||
|
36, /* 2 */
|
||||||
|
54, /* 3 */
|
||||||
|
71, /* 4 */
|
||||||
|
89, /* 5 */
|
||||||
|
107, /* 6 */
|
||||||
|
125, /* 7 */
|
||||||
|
143, /* 8 */
|
||||||
|
160, /* 9 */
|
||||||
|
178, /* 10 */
|
||||||
|
195, /* 11 */
|
||||||
|
213, /* 12 */
|
||||||
|
230, /* 13 */
|
||||||
|
248, /* 14 */
|
||||||
|
265, /* 15 */
|
||||||
|
282, /* 16 */
|
||||||
|
299, /* 17 */
|
||||||
|
316, /* 18 */
|
||||||
|
333, /* 19 */
|
||||||
|
350, /* 20 */
|
||||||
|
367, /* 21 */
|
||||||
|
384, /* 22 */
|
||||||
|
400, /* 23 */
|
||||||
|
416, /* 24 */
|
||||||
|
433, /* 25 */
|
||||||
|
449, /* 26 */
|
||||||
|
465, /* 27 */
|
||||||
|
481, /* 28 */
|
||||||
|
496, /* 29 */
|
||||||
|
512, /* 30 */
|
||||||
|
527, /* 31 */
|
||||||
|
543, /* 32 */
|
||||||
|
558, /* 33 */
|
||||||
|
573, /* 34 */
|
||||||
|
587, /* 35 */
|
||||||
|
602, /* 36 */
|
||||||
|
616, /* 37 */
|
||||||
|
630, /* 38 */
|
||||||
|
644, /* 39 */
|
||||||
|
658, /* 40 */
|
||||||
|
672, /* 41 */
|
||||||
|
685, /* 42 */
|
||||||
|
698, /* 43 */
|
||||||
|
711, /* 44 */
|
||||||
|
724, /* 45 */
|
||||||
|
737, /* 46 */
|
||||||
|
749, /* 47 */
|
||||||
|
761, /* 48 */
|
||||||
|
773, /* 49 */
|
||||||
|
784, /* 50 */
|
||||||
|
796, /* 51 */
|
||||||
|
807, /* 52 */
|
||||||
|
818, /* 53 */
|
||||||
|
828, /* 54 */
|
||||||
|
839, /* 55 */
|
||||||
|
849, /* 56 */
|
||||||
|
859, /* 57 */
|
||||||
|
868, /* 58 */
|
||||||
|
878, /* 59 */
|
||||||
|
887, /* 60 */
|
||||||
|
896, /* 61 */
|
||||||
|
904, /* 62 */
|
||||||
|
912, /* 63 */
|
||||||
|
920, /* 64 */
|
||||||
|
928, /* 65 */
|
||||||
|
935, /* 66 */
|
||||||
|
943, /* 67 */
|
||||||
|
949, /* 68 */
|
||||||
|
956, /* 69 */
|
||||||
|
962, /* 70 */
|
||||||
|
968, /* 71 */
|
||||||
|
974, /* 72 */
|
||||||
|
979, /* 73 */
|
||||||
|
984, /* 74 */
|
||||||
|
989, /* 75 */
|
||||||
|
994, /* 76 */
|
||||||
|
998, /* 77 */
|
||||||
|
1002, /* 78 */
|
||||||
|
1005, /* 79 */
|
||||||
|
1008, /* 80 */
|
||||||
|
1011, /* 81 */
|
||||||
|
1014, /* 82 */
|
||||||
|
1016, /* 83 */
|
||||||
|
1018, /* 84 */
|
||||||
|
1020, /* 85 */
|
||||||
|
1022, /* 86 */
|
||||||
|
1023, /* 87 */
|
||||||
|
1023, /* 88 */
|
||||||
|
1024, /* 89 */
|
||||||
|
1024, /* 90 */
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
icossin(int deg, int *cosp, int *sinp)
|
||||||
|
{
|
||||||
|
int sinsign, cossign;
|
||||||
|
short *stp, *ctp;
|
||||||
|
|
||||||
|
deg %= 360;
|
||||||
|
if(deg < 0)
|
||||||
|
deg += 360;
|
||||||
|
sinsign = 1;
|
||||||
|
cossign = 1;
|
||||||
|
stp = 0;
|
||||||
|
ctp = 0;
|
||||||
|
switch(deg/90){
|
||||||
|
case 2:
|
||||||
|
sinsign = -1;
|
||||||
|
cossign = -1;
|
||||||
|
deg -= 180;
|
||||||
|
/* fall through */
|
||||||
|
case 0:
|
||||||
|
stp = &sinus[deg];
|
||||||
|
ctp = &sinus[90-deg];
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
sinsign = -1;
|
||||||
|
cossign = -1;
|
||||||
|
deg -= 180;
|
||||||
|
/* fall through */
|
||||||
|
case 1:
|
||||||
|
deg = 180-deg;
|
||||||
|
cossign = -cossign;
|
||||||
|
stp = &sinus[deg];
|
||||||
|
ctp = &sinus[90-deg];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*sinp = sinsign*stp[0];
|
||||||
|
*cosp = cossign*ctp[0];
|
||||||
|
}
|
||||||
261
src/libdraw/icossin2.c
Normal file
261
src/libdraw/icossin2.c
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sine and Cosine of arctangents, calculated by
|
||||||
|
* (sin(atan(index/100.0))*1024.+0.5)
|
||||||
|
* (cos(atan(index/100.0))*1024.+0.5)
|
||||||
|
* To use, get rational tangent between 0<=tan<=1, scale by 100,
|
||||||
|
* and look up sin and cos, and use linear interpolation. divide by 1024.
|
||||||
|
* Maximum error is 0.0020. Without linear interpolation, it's 0.010.
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
short sinus[] = {
|
||||||
|
0, /* 0.00 */
|
||||||
|
10, /* 0.01 */
|
||||||
|
20, /* 0.02 */
|
||||||
|
31, /* 0.03 */
|
||||||
|
41, /* 0.04 */
|
||||||
|
51, /* 0.05 */
|
||||||
|
61, /* 0.06 */
|
||||||
|
72, /* 0.07 */
|
||||||
|
82, /* 0.08 */
|
||||||
|
92, /* 0.09 */
|
||||||
|
102, /* 0.10 */
|
||||||
|
112, /* 0.11 */
|
||||||
|
122, /* 0.12 */
|
||||||
|
132, /* 0.13 */
|
||||||
|
142, /* 0.14 */
|
||||||
|
152, /* 0.15 */
|
||||||
|
162, /* 0.16 */
|
||||||
|
172, /* 0.17 */
|
||||||
|
181, /* 0.18 */
|
||||||
|
191, /* 0.19 */
|
||||||
|
201, /* 0.20 */
|
||||||
|
210, /* 0.21 */
|
||||||
|
220, /* 0.22 */
|
||||||
|
230, /* 0.23 */
|
||||||
|
239, /* 0.24 */
|
||||||
|
248, /* 0.25 */
|
||||||
|
258, /* 0.26 */
|
||||||
|
267, /* 0.27 */
|
||||||
|
276, /* 0.28 */
|
||||||
|
285, /* 0.29 */
|
||||||
|
294, /* 0.30 */
|
||||||
|
303, /* 0.31 */
|
||||||
|
312, /* 0.32 */
|
||||||
|
321, /* 0.33 */
|
||||||
|
330, /* 0.34 */
|
||||||
|
338, /* 0.35 */
|
||||||
|
347, /* 0.36 */
|
||||||
|
355, /* 0.37 */
|
||||||
|
364, /* 0.38 */
|
||||||
|
372, /* 0.39 */
|
||||||
|
380, /* 0.40 */
|
||||||
|
388, /* 0.41 */
|
||||||
|
397, /* 0.42 */
|
||||||
|
405, /* 0.43 */
|
||||||
|
412, /* 0.44 */
|
||||||
|
420, /* 0.45 */
|
||||||
|
428, /* 0.46 */
|
||||||
|
436, /* 0.47 */
|
||||||
|
443, /* 0.48 */
|
||||||
|
451, /* 0.49 */
|
||||||
|
458, /* 0.50 */
|
||||||
|
465, /* 0.51 */
|
||||||
|
472, /* 0.52 */
|
||||||
|
480, /* 0.53 */
|
||||||
|
487, /* 0.54 */
|
||||||
|
493, /* 0.55 */
|
||||||
|
500, /* 0.56 */
|
||||||
|
507, /* 0.57 */
|
||||||
|
514, /* 0.58 */
|
||||||
|
520, /* 0.59 */
|
||||||
|
527, /* 0.60 */
|
||||||
|
533, /* 0.61 */
|
||||||
|
540, /* 0.62 */
|
||||||
|
546, /* 0.63 */
|
||||||
|
552, /* 0.64 */
|
||||||
|
558, /* 0.65 */
|
||||||
|
564, /* 0.66 */
|
||||||
|
570, /* 0.67 */
|
||||||
|
576, /* 0.68 */
|
||||||
|
582, /* 0.69 */
|
||||||
|
587, /* 0.70 */
|
||||||
|
593, /* 0.71 */
|
||||||
|
598, /* 0.72 */
|
||||||
|
604, /* 0.73 */
|
||||||
|
609, /* 0.74 */
|
||||||
|
614, /* 0.75 */
|
||||||
|
620, /* 0.76 */
|
||||||
|
625, /* 0.77 */
|
||||||
|
630, /* 0.78 */
|
||||||
|
635, /* 0.79 */
|
||||||
|
640, /* 0.80 */
|
||||||
|
645, /* 0.81 */
|
||||||
|
649, /* 0.82 */
|
||||||
|
654, /* 0.83 */
|
||||||
|
659, /* 0.84 */
|
||||||
|
663, /* 0.85 */
|
||||||
|
668, /* 0.86 */
|
||||||
|
672, /* 0.87 */
|
||||||
|
676, /* 0.88 */
|
||||||
|
681, /* 0.89 */
|
||||||
|
685, /* 0.90 */
|
||||||
|
689, /* 0.91 */
|
||||||
|
693, /* 0.92 */
|
||||||
|
697, /* 0.93 */
|
||||||
|
701, /* 0.94 */
|
||||||
|
705, /* 0.95 */
|
||||||
|
709, /* 0.96 */
|
||||||
|
713, /* 0.97 */
|
||||||
|
717, /* 0.98 */
|
||||||
|
720, /* 0.99 */
|
||||||
|
724, /* 1.00 */
|
||||||
|
728, /* 1.01 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static
|
||||||
|
short cosinus[] = {
|
||||||
|
1024, /* 0.00 */
|
||||||
|
1024, /* 0.01 */
|
||||||
|
1024, /* 0.02 */
|
||||||
|
1024, /* 0.03 */
|
||||||
|
1023, /* 0.04 */
|
||||||
|
1023, /* 0.05 */
|
||||||
|
1022, /* 0.06 */
|
||||||
|
1022, /* 0.07 */
|
||||||
|
1021, /* 0.08 */
|
||||||
|
1020, /* 0.09 */
|
||||||
|
1019, /* 0.10 */
|
||||||
|
1018, /* 0.11 */
|
||||||
|
1017, /* 0.12 */
|
||||||
|
1015, /* 0.13 */
|
||||||
|
1014, /* 0.14 */
|
||||||
|
1013, /* 0.15 */
|
||||||
|
1011, /* 0.16 */
|
||||||
|
1010, /* 0.17 */
|
||||||
|
1008, /* 0.18 */
|
||||||
|
1006, /* 0.19 */
|
||||||
|
1004, /* 0.20 */
|
||||||
|
1002, /* 0.21 */
|
||||||
|
1000, /* 0.22 */
|
||||||
|
998, /* 0.23 */
|
||||||
|
996, /* 0.24 */
|
||||||
|
993, /* 0.25 */
|
||||||
|
991, /* 0.26 */
|
||||||
|
989, /* 0.27 */
|
||||||
|
986, /* 0.28 */
|
||||||
|
983, /* 0.29 */
|
||||||
|
981, /* 0.30 */
|
||||||
|
978, /* 0.31 */
|
||||||
|
975, /* 0.32 */
|
||||||
|
972, /* 0.33 */
|
||||||
|
969, /* 0.34 */
|
||||||
|
967, /* 0.35 */
|
||||||
|
963, /* 0.36 */
|
||||||
|
960, /* 0.37 */
|
||||||
|
957, /* 0.38 */
|
||||||
|
954, /* 0.39 */
|
||||||
|
951, /* 0.40 */
|
||||||
|
947, /* 0.41 */
|
||||||
|
944, /* 0.42 */
|
||||||
|
941, /* 0.43 */
|
||||||
|
937, /* 0.44 */
|
||||||
|
934, /* 0.45 */
|
||||||
|
930, /* 0.46 */
|
||||||
|
927, /* 0.47 */
|
||||||
|
923, /* 0.48 */
|
||||||
|
920, /* 0.49 */
|
||||||
|
916, /* 0.50 */
|
||||||
|
912, /* 0.51 */
|
||||||
|
909, /* 0.52 */
|
||||||
|
905, /* 0.53 */
|
||||||
|
901, /* 0.54 */
|
||||||
|
897, /* 0.55 */
|
||||||
|
893, /* 0.56 */
|
||||||
|
890, /* 0.57 */
|
||||||
|
886, /* 0.58 */
|
||||||
|
882, /* 0.59 */
|
||||||
|
878, /* 0.60 */
|
||||||
|
874, /* 0.61 */
|
||||||
|
870, /* 0.62 */
|
||||||
|
866, /* 0.63 */
|
||||||
|
862, /* 0.64 */
|
||||||
|
859, /* 0.65 */
|
||||||
|
855, /* 0.66 */
|
||||||
|
851, /* 0.67 */
|
||||||
|
847, /* 0.68 */
|
||||||
|
843, /* 0.69 */
|
||||||
|
839, /* 0.70 */
|
||||||
|
835, /* 0.71 */
|
||||||
|
831, /* 0.72 */
|
||||||
|
827, /* 0.73 */
|
||||||
|
823, /* 0.74 */
|
||||||
|
819, /* 0.75 */
|
||||||
|
815, /* 0.76 */
|
||||||
|
811, /* 0.77 */
|
||||||
|
807, /* 0.78 */
|
||||||
|
804, /* 0.79 */
|
||||||
|
800, /* 0.80 */
|
||||||
|
796, /* 0.81 */
|
||||||
|
792, /* 0.82 */
|
||||||
|
788, /* 0.83 */
|
||||||
|
784, /* 0.84 */
|
||||||
|
780, /* 0.85 */
|
||||||
|
776, /* 0.86 */
|
||||||
|
773, /* 0.87 */
|
||||||
|
769, /* 0.88 */
|
||||||
|
765, /* 0.89 */
|
||||||
|
761, /* 0.90 */
|
||||||
|
757, /* 0.91 */
|
||||||
|
754, /* 0.92 */
|
||||||
|
750, /* 0.93 */
|
||||||
|
746, /* 0.94 */
|
||||||
|
742, /* 0.95 */
|
||||||
|
739, /* 0.96 */
|
||||||
|
735, /* 0.97 */
|
||||||
|
731, /* 0.98 */
|
||||||
|
728, /* 0.99 */
|
||||||
|
724, /* 1.00 */
|
||||||
|
720, /* 1.01 */
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
icossin2(int x, int y, int *cosp, int *sinp)
|
||||||
|
{
|
||||||
|
int sinsign, cossign, tan, tan10, rem;
|
||||||
|
short *stp, *ctp;
|
||||||
|
|
||||||
|
if(x == 0){
|
||||||
|
if(y >= 0)
|
||||||
|
*sinp = ICOSSCALE, *cosp = 0;
|
||||||
|
else
|
||||||
|
*sinp = -ICOSSCALE, *cosp = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sinsign = cossign = 1;
|
||||||
|
if(x < 0){
|
||||||
|
cossign = -1;
|
||||||
|
x = -x;
|
||||||
|
}
|
||||||
|
if(y < 0){
|
||||||
|
sinsign = -1;
|
||||||
|
y = -y;
|
||||||
|
}
|
||||||
|
if(y > x){
|
||||||
|
tan = 1000*x/y;
|
||||||
|
tan10 = tan/10;
|
||||||
|
stp = &cosinus[tan10];
|
||||||
|
ctp = &sinus[tan10];
|
||||||
|
}else{
|
||||||
|
tan = 1000*y/x;
|
||||||
|
tan10 = tan/10;
|
||||||
|
stp = &sinus[tan10];
|
||||||
|
ctp = &cosinus[tan10];
|
||||||
|
}
|
||||||
|
rem = tan-(tan10*10);
|
||||||
|
*sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
|
||||||
|
*cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
|
||||||
|
}
|
||||||
35
src/libdraw/line.c
Normal file
35
src/libdraw/line.c
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
line(Image *dst, Point p0, Point p1, int end0, int end1, int radius, Image *src, Point sp)
|
||||||
|
{
|
||||||
|
lineop(dst, p0, p1, end0, end1, radius, src, sp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
lineop(Image *dst, Point p0, Point p1, int end0, int end1, int radius, Image *src, Point sp, Drawop op)
|
||||||
|
{
|
||||||
|
uchar *a;
|
||||||
|
|
||||||
|
_setdrawop(dst->display, op);
|
||||||
|
|
||||||
|
a = bufimage(dst->display, 1+4+2*4+2*4+4+4+4+4+2*4);
|
||||||
|
if(a == 0){
|
||||||
|
fprint(2, "image line: %r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
a[0] = 'L';
|
||||||
|
BPLONG(a+1, dst->id);
|
||||||
|
BPLONG(a+5, p0.x);
|
||||||
|
BPLONG(a+9, p0.y);
|
||||||
|
BPLONG(a+13, p1.x);
|
||||||
|
BPLONG(a+17, p1.y);
|
||||||
|
BPLONG(a+21, end0);
|
||||||
|
BPLONG(a+25, end1);
|
||||||
|
BPLONG(a+29, radius);
|
||||||
|
BPLONG(a+33, src->id);
|
||||||
|
BPLONG(a+37, sp.x);
|
||||||
|
BPLONG(a+41, sp.y);
|
||||||
|
}
|
||||||
54
src/libdraw/loadimage.c
Normal file
54
src/libdraw/loadimage.c
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
loadimage(Image *i, Rectangle r, uchar *data, int ndata)
|
||||||
|
{
|
||||||
|
long dy;
|
||||||
|
int n, bpl;
|
||||||
|
uchar *a;
|
||||||
|
int chunk;
|
||||||
|
|
||||||
|
chunk = i->display->bufsize - 64;
|
||||||
|
|
||||||
|
if(!rectinrect(r, i->r)){
|
||||||
|
werrstr("loadimage: bad rectangle");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bpl = bytesperline(r, i->depth);
|
||||||
|
n = bpl*Dy(r);
|
||||||
|
if(n > ndata){
|
||||||
|
werrstr("loadimage: insufficient data");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ndata = 0;
|
||||||
|
while(r.max.y > r.min.y){
|
||||||
|
dy = r.max.y - r.min.y;
|
||||||
|
if(dy*bpl > chunk)
|
||||||
|
dy = chunk/bpl;
|
||||||
|
if(dy <= 0){
|
||||||
|
werrstr("loadimage: image too wide for buffer");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
n = dy*bpl;
|
||||||
|
a = bufimage(i->display, 21+n);
|
||||||
|
if(a == nil){
|
||||||
|
werrstr("bufimage failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
a[0] = 'y';
|
||||||
|
BPLONG(a+1, i->id);
|
||||||
|
BPLONG(a+5, r.min.x);
|
||||||
|
BPLONG(a+9, r.min.y);
|
||||||
|
BPLONG(a+13, r.max.x);
|
||||||
|
BPLONG(a+17, r.min.y+dy);
|
||||||
|
memmove(a+21, data, n);
|
||||||
|
ndata += n;
|
||||||
|
data += n;
|
||||||
|
r.min.y += dy;
|
||||||
|
}
|
||||||
|
if(flushimage(i->display, 0) < 0)
|
||||||
|
return -1;
|
||||||
|
return ndata;
|
||||||
|
}
|
||||||
55
src/libdraw/mkfont.c
Normal file
55
src/libdraw/mkfont.c
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cobble fake font using existing subfont
|
||||||
|
*/
|
||||||
|
Font*
|
||||||
|
mkfont(Subfont *subfont, Rune min)
|
||||||
|
{
|
||||||
|
Font *font;
|
||||||
|
Cachefont *c;
|
||||||
|
|
||||||
|
font = malloc(sizeof(Font));
|
||||||
|
if(font == 0)
|
||||||
|
return 0;
|
||||||
|
memset(font, 0, sizeof(Font));
|
||||||
|
font->display = subfont->bits->display;
|
||||||
|
font->name = strdup("<synthetic>");
|
||||||
|
font->ncache = NFCACHE+NFLOOK;
|
||||||
|
font->nsubf = NFSUBF;
|
||||||
|
font->cache = malloc(font->ncache * sizeof(font->cache[0]));
|
||||||
|
font->subf = malloc(font->nsubf * sizeof(font->subf[0]));
|
||||||
|
if(font->name==0 || font->cache==0 || font->subf==0){
|
||||||
|
Err:
|
||||||
|
free(font->name);
|
||||||
|
free(font->cache);
|
||||||
|
free(font->subf);
|
||||||
|
free(font->sub);
|
||||||
|
free(font);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memset(font->cache, 0, font->ncache*sizeof(font->cache[0]));
|
||||||
|
memset(font->subf, 0, font->nsubf*sizeof(font->subf[0]));
|
||||||
|
font->height = subfont->height;
|
||||||
|
font->ascent = subfont->ascent;
|
||||||
|
font->age = 1;
|
||||||
|
font->sub = malloc(sizeof(Cachefont*));
|
||||||
|
if(font->sub == 0)
|
||||||
|
goto Err;
|
||||||
|
c = malloc(sizeof(Cachefont));
|
||||||
|
if(c == 0)
|
||||||
|
goto Err;
|
||||||
|
font->nsub = 1;
|
||||||
|
font->sub[0] = c;
|
||||||
|
c->min = min;
|
||||||
|
c->max = min+subfont->n-1;
|
||||||
|
c->offset = 0;
|
||||||
|
c->name = 0; /* noticed by freeup() and agefont() */
|
||||||
|
c->subfontname = 0;
|
||||||
|
font->subf[0].age = 0;
|
||||||
|
font->subf[0].cf = c;
|
||||||
|
font->subf[0].f = subfont;
|
||||||
|
return font;
|
||||||
|
}
|
||||||
27
src/libdraw/newwindow.c
Normal file
27
src/libdraw/newwindow.c
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
/* Connect us to new window, if possible */
|
||||||
|
int
|
||||||
|
newwindow(char *str)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
char *wsys;
|
||||||
|
char buf[256];
|
||||||
|
|
||||||
|
wsys = getenv("wsys");
|
||||||
|
if(wsys == nil)
|
||||||
|
return -1;
|
||||||
|
fd = open(wsys, ORDWR);
|
||||||
|
free(wsys);
|
||||||
|
if(fd < 0)
|
||||||
|
return -1;
|
||||||
|
rfork(RFNAMEG);
|
||||||
|
if(str)
|
||||||
|
snprint(buf, sizeof buf, "new %s", str);
|
||||||
|
else
|
||||||
|
strcpy(buf, "new");
|
||||||
|
return mount(fd, -1, "/dev", MBEFORE, buf);
|
||||||
|
}
|
||||||
|
|
||||||
87
src/libdraw/poly.c
Normal file
87
src/libdraw/poly.c
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
static
|
||||||
|
uchar*
|
||||||
|
addcoord(uchar *p, int oldx, int newx)
|
||||||
|
{
|
||||||
|
int dx;
|
||||||
|
|
||||||
|
dx = newx-oldx;
|
||||||
|
/* does dx fit in 7 signed bits? */
|
||||||
|
if((unsigned)(dx - -0x40) <= 0x7F)
|
||||||
|
*p++ = dx&0x7F;
|
||||||
|
else{
|
||||||
|
*p++ = 0x80 | (newx&0x7F);
|
||||||
|
*p++ = newx>>7;
|
||||||
|
*p++ = newx>>15;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
dopoly(int cmd, Image *dst, Point *pp, int np, int end0, int end1, int radius, Image *src, Point *sp, Drawop op)
|
||||||
|
{
|
||||||
|
uchar *a, *t, *u;
|
||||||
|
int i, ox, oy;
|
||||||
|
|
||||||
|
if(np == 0)
|
||||||
|
return;
|
||||||
|
t = malloc(np*2*3);
|
||||||
|
if(t == nil)
|
||||||
|
return;
|
||||||
|
u = t;
|
||||||
|
ox = oy = 0;
|
||||||
|
for(i=0; i<np; i++){
|
||||||
|
u = addcoord(u, ox, pp[i].x);
|
||||||
|
ox = pp[i].x;
|
||||||
|
u = addcoord(u, oy, pp[i].y);
|
||||||
|
oy = pp[i].y;
|
||||||
|
}
|
||||||
|
|
||||||
|
_setdrawop(dst->display, op);
|
||||||
|
|
||||||
|
a = bufimage(dst->display, 1+4+2+4+4+4+4+2*4+(u-t));
|
||||||
|
if(a == 0){
|
||||||
|
free(t);
|
||||||
|
fprint(2, "image poly: %r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
a[0] = cmd;
|
||||||
|
BPLONG(a+1, dst->id);
|
||||||
|
BPSHORT(a+5, np-1);
|
||||||
|
BPLONG(a+7, end0);
|
||||||
|
BPLONG(a+11, end1);
|
||||||
|
BPLONG(a+15, radius);
|
||||||
|
BPLONG(a+19, src->id);
|
||||||
|
BPLONG(a+23, sp->x);
|
||||||
|
BPLONG(a+27, sp->y);
|
||||||
|
memmove(a+31, t, u-t);
|
||||||
|
free(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
poly(Image *dst, Point *p, int np, int end0, int end1, int radius, Image *src, Point sp)
|
||||||
|
{
|
||||||
|
dopoly('p', dst, p, np, end0, end1, radius, src, &sp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
polyop(Image *dst, Point *p, int np, int end0, int end1, int radius, Image *src, Point sp, Drawop op)
|
||||||
|
{
|
||||||
|
dopoly('p', dst, p, np, end0, end1, radius, src, &sp, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fillpoly(Image *dst, Point *p, int np, int wind, Image *src, Point sp)
|
||||||
|
{
|
||||||
|
dopoly('P', dst, p, np, wind, 0, 0, src, &sp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fillpolyop(Image *dst, Point *p, int np, int wind, Image *src, Point sp, Drawop op)
|
||||||
|
{
|
||||||
|
dopoly('P', dst, p, np, wind, 0, 0, src, &sp, op);
|
||||||
|
}
|
||||||
25
src/libdraw/rectclip.c
Normal file
25
src/libdraw/rectclip.c
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
rectclip(Rectangle *rp, Rectangle b) /* first by reference, second by value */
|
||||||
|
{
|
||||||
|
Rectangle *bp = &b;
|
||||||
|
/*
|
||||||
|
* Expand rectXrect() in line for speed
|
||||||
|
*/
|
||||||
|
if((rp->min.x<bp->max.x && bp->min.x<rp->max.x &&
|
||||||
|
rp->min.y<bp->max.y && bp->min.y<rp->max.y)==0)
|
||||||
|
return 0;
|
||||||
|
/* They must overlap */
|
||||||
|
if(rp->min.x < bp->min.x)
|
||||||
|
rp->min.x = bp->min.x;
|
||||||
|
if(rp->min.y < bp->min.y)
|
||||||
|
rp->min.y = bp->min.y;
|
||||||
|
if(rp->max.x > bp->max.x)
|
||||||
|
rp->max.x = bp->max.x;
|
||||||
|
if(rp->max.y > bp->max.y)
|
||||||
|
rp->max.y = bp->max.y;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
21
src/libdraw/replclipr.c
Normal file
21
src/libdraw/replclipr.c
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
replclipr(Image *i, int repl, Rectangle clipr)
|
||||||
|
{
|
||||||
|
uchar *b;
|
||||||
|
|
||||||
|
b = bufimage(i->display, 22);
|
||||||
|
b[0] = 'c';
|
||||||
|
BPLONG(b+1, i->id);
|
||||||
|
repl = repl!=0;
|
||||||
|
b[5] = repl;
|
||||||
|
BPLONG(b+6, clipr.min.x);
|
||||||
|
BPLONG(b+10, clipr.min.y);
|
||||||
|
BPLONG(b+14, clipr.max.x);
|
||||||
|
BPLONG(b+18, clipr.max.y);
|
||||||
|
i->repl = repl;
|
||||||
|
i->clipr = clipr;
|
||||||
|
}
|
||||||
99
src/libdraw/rgb.c
Normal file
99
src/libdraw/rgb.c
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This original version, although fast and a true inverse of
|
||||||
|
* cmap2rgb, in the sense that rgb2cmap(cmap2rgb(c))
|
||||||
|
* returned the original color, does a terrible job for RGB
|
||||||
|
* triples that do not appear in the color map, so it has been
|
||||||
|
* replaced by the much slower version below, that loops
|
||||||
|
* over the color map looking for the nearest point in RGB
|
||||||
|
* space. There is no visual psychology reason for that
|
||||||
|
* criterion, but it's easy to implement and the results are
|
||||||
|
* far more pleasing.
|
||||||
|
*
|
||||||
|
int
|
||||||
|
rgb2cmap(int cr, int cg, int cb)
|
||||||
|
{
|
||||||
|
int r, g, b, v, cv;
|
||||||
|
|
||||||
|
if(cr < 0)
|
||||||
|
cr = 0;
|
||||||
|
else if(cr > 255)
|
||||||
|
cr = 255;
|
||||||
|
if(cg < 0)
|
||||||
|
cg = 0;
|
||||||
|
else if(cg > 255)
|
||||||
|
cg = 255;
|
||||||
|
if(cb < 0)
|
||||||
|
cb = 0;
|
||||||
|
else if(cb > 255)
|
||||||
|
cb = 255;
|
||||||
|
r = cr>>6;
|
||||||
|
g = cg>>6;
|
||||||
|
b = cb>>6;
|
||||||
|
cv = cr;
|
||||||
|
if(cg > cv)
|
||||||
|
cv = cg;
|
||||||
|
if(cb > cv)
|
||||||
|
cv = cb;
|
||||||
|
v = (cv>>4)&3;
|
||||||
|
return ((((r<<2)+v)<<4)+(((g<<2)+b+v-r)&15));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
rgb2cmap(int cr, int cg, int cb)
|
||||||
|
{
|
||||||
|
int i, r, g, b, sq;
|
||||||
|
u32int rgb;
|
||||||
|
int best, bestsq;
|
||||||
|
|
||||||
|
best = 0;
|
||||||
|
bestsq = 0x7FFFFFFF;
|
||||||
|
for(i=0; i<256; i++){
|
||||||
|
rgb = cmap2rgb(i);
|
||||||
|
r = (rgb>>16) & 0xFF;
|
||||||
|
g = (rgb>>8) & 0xFF;
|
||||||
|
b = (rgb>>0) & 0xFF;
|
||||||
|
sq = (r-cr)*(r-cr)+(g-cg)*(g-cg)+(b-cb)*(b-cb);
|
||||||
|
if(sq < bestsq){
|
||||||
|
bestsq = sq;
|
||||||
|
best = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return best;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
cmap2rgb(int c)
|
||||||
|
{
|
||||||
|
int j, num, den, r, g, b, v, rgb;
|
||||||
|
|
||||||
|
r = c>>6;
|
||||||
|
v = (c>>4)&3;
|
||||||
|
j = (c-v+r)&15;
|
||||||
|
g = j>>2;
|
||||||
|
b = j&3;
|
||||||
|
den=r;
|
||||||
|
if(g>den)
|
||||||
|
den=g;
|
||||||
|
if(b>den)
|
||||||
|
den=b;
|
||||||
|
if(den==0) {
|
||||||
|
v *= 17;
|
||||||
|
rgb = (v<<16)|(v<<8)|v;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
num=17*(4*den+v);
|
||||||
|
rgb = ((r*num/den)<<16)|((g*num/den)<<8)|(b*num/den);
|
||||||
|
}
|
||||||
|
return rgb;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
cmap2rgba(int c)
|
||||||
|
{
|
||||||
|
return (cmap2rgb(c)<<8)|0xFF;
|
||||||
|
}
|
||||||
51
src/libdraw/stringbg.c
Normal file
51
src/libdraw/stringbg.c
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
Point
|
||||||
|
stringbg(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Image *bg, Point bgp)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, s, nil, 1<<24, dst->clipr, bg, bgp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
stringbgop(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Image *bg, Point bgp, Drawop op)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, s, nil, 1<<24, dst->clipr, bg, bgp, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
stringnbg(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, int len, Image *bg, Point bgp)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, s, nil, len, dst->clipr, bg, bgp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
stringnbgop(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, int len, Image *bg, Point bgp, Drawop op)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, s, nil, len, dst->clipr, bg, bgp, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
runestringbg(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, Image *bg, Point bgp)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, nil, r, 1<<24, dst->clipr, bg, bgp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
runestringbgop(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, Image *bg, Point bgp, Drawop op)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, nil, r, 1<<24, dst->clipr, bg, bgp, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
runestringnbg(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, int len, Image *bg, Point bgp)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, nil, r, len, dst->clipr, bg, bgp, SoverD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
runestringnbgop(Image *dst, Point pt, Image *src, Point sp, Font *f, Rune *r, int len, Image *bg, Point bgp, Drawop op)
|
||||||
|
{
|
||||||
|
return _string(dst, pt, src, sp, f, nil, r, len, dst->clipr, bg, bgp, op);
|
||||||
|
}
|
||||||
65
src/libdraw/stringsubfont.c
Normal file
65
src/libdraw/stringsubfont.c
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
Point
|
||||||
|
stringsubfont(Image *b, Point p, Image *color, Subfont *f, char *cs)
|
||||||
|
{
|
||||||
|
int w, width;
|
||||||
|
uchar *s;
|
||||||
|
Rune c;
|
||||||
|
Fontchar *i;
|
||||||
|
|
||||||
|
s = (uchar*)cs;
|
||||||
|
for(; c=*s; p.x+=width){
|
||||||
|
width = 0;
|
||||||
|
if(c < Runeself)
|
||||||
|
s++;
|
||||||
|
else{
|
||||||
|
w = chartorune(&c, (char*)s);
|
||||||
|
if(w == 0){
|
||||||
|
s++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
s += w;
|
||||||
|
}
|
||||||
|
if(c >= f->n)
|
||||||
|
continue;
|
||||||
|
i = f->info+c;
|
||||||
|
width = i->width;
|
||||||
|
draw(b, Rect(p.x+i->left, p.y+i->top, p.x+i->left+(i[1].x-i[0].x), p.y+i->bottom),
|
||||||
|
color, f->bits, Pt(i->x, i->top));
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
strsubfontwidth(Subfont *f, char *cs)
|
||||||
|
{
|
||||||
|
Rune c;
|
||||||
|
Point p;
|
||||||
|
uchar *s;
|
||||||
|
Fontchar *i;
|
||||||
|
int w, width;
|
||||||
|
|
||||||
|
p = Pt(0, f->height);
|
||||||
|
s = (uchar*)cs;
|
||||||
|
for(; c=*s; p.x+=width){
|
||||||
|
width = 0;
|
||||||
|
if(c < Runeself)
|
||||||
|
s++;
|
||||||
|
else{
|
||||||
|
w = chartorune(&c, (char*)s);
|
||||||
|
if(w == 0){
|
||||||
|
s++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
s += w;
|
||||||
|
}
|
||||||
|
if(c >= f->n)
|
||||||
|
continue;
|
||||||
|
i = f->info+c;
|
||||||
|
width = i->width;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
44
src/libdraw/test.c
Normal file
44
src/libdraw/test.c
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
#include <event.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
eresized(int new)
|
||||||
|
{
|
||||||
|
if(new && getwindow(display, Refnone) < 0){
|
||||||
|
fprint(2, "colors: can't reattach to window: %r\n");
|
||||||
|
exits("resized");
|
||||||
|
}
|
||||||
|
draw(screen, screen->r, display->white, nil, ZP);
|
||||||
|
flushimage(display, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *buttons[] =
|
||||||
|
{
|
||||||
|
"exit",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
Menu menu =
|
||||||
|
{
|
||||||
|
buttons
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
Mouse m;
|
||||||
|
|
||||||
|
initdraw(0,0,0);
|
||||||
|
eresized(0);
|
||||||
|
einit(Emouse);
|
||||||
|
for(;;){
|
||||||
|
m = emouse();
|
||||||
|
if(m.buttons == 4)
|
||||||
|
switch(emenuhit(3, &m, &menu)){
|
||||||
|
case 0:
|
||||||
|
exits(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
214
src/libdraw/window.c
Normal file
214
src/libdraw/window.c
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
typedef struct Memimage Memimage;
|
||||||
|
|
||||||
|
static int screenid;
|
||||||
|
|
||||||
|
Screen*
|
||||||
|
allocscreen(Image *image, Image *fill, int public)
|
||||||
|
{
|
||||||
|
uchar *a;
|
||||||
|
Screen *s;
|
||||||
|
int id, try;
|
||||||
|
Display *d;
|
||||||
|
|
||||||
|
d = image->display;
|
||||||
|
if(d != fill->display){
|
||||||
|
werrstr("allocscreen: image and fill on different displays");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
s = malloc(sizeof(Screen));
|
||||||
|
if(s == 0)
|
||||||
|
return 0;
|
||||||
|
SET(id);
|
||||||
|
for(try=0; try<25; try++){
|
||||||
|
/* loop until find a free id */
|
||||||
|
a = bufimage(d, 1+4+4+4+1);
|
||||||
|
if(a == 0){
|
||||||
|
free(s);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
id = ++screenid;
|
||||||
|
a[0] = 'A';
|
||||||
|
BPLONG(a+1, id);
|
||||||
|
BPLONG(a+5, image->id);
|
||||||
|
BPLONG(a+9, fill->id);
|
||||||
|
a[13] = public;
|
||||||
|
if(flushimage(d, 0) != -1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s->display = d;
|
||||||
|
s->id = id;
|
||||||
|
s->image = image;
|
||||||
|
assert(s->image && s->image->chan != 0);
|
||||||
|
|
||||||
|
s->fill = fill;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Screen*
|
||||||
|
publicscreen(Display *d, int id, u32int chan)
|
||||||
|
{
|
||||||
|
uchar *a;
|
||||||
|
Screen *s;
|
||||||
|
|
||||||
|
s = malloc(sizeof(Screen));
|
||||||
|
if(s == 0)
|
||||||
|
return 0;
|
||||||
|
a = bufimage(d, 1+4+4);
|
||||||
|
if(a == 0){
|
||||||
|
Error:
|
||||||
|
free(s);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
a[0] = 'S';
|
||||||
|
BPLONG(a+1, id);
|
||||||
|
BPLONG(a+5, chan);
|
||||||
|
if(flushimage(d, 0) < 0)
|
||||||
|
goto Error;
|
||||||
|
|
||||||
|
s->display = d;
|
||||||
|
s->id = id;
|
||||||
|
s->image = 0;
|
||||||
|
s->fill = 0;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
freescreen(Screen *s)
|
||||||
|
{
|
||||||
|
uchar *a;
|
||||||
|
Display *d;
|
||||||
|
|
||||||
|
if(s == 0)
|
||||||
|
return 0;
|
||||||
|
d = s->display;
|
||||||
|
a = bufimage(d, 1+4);
|
||||||
|
if(a == 0)
|
||||||
|
return -1;
|
||||||
|
a[0] = 'F';
|
||||||
|
BPLONG(a+1, s->id);
|
||||||
|
/*
|
||||||
|
* flush(1) because screen is likely holding last reference to
|
||||||
|
* window, and want it to disappear visually.
|
||||||
|
*/
|
||||||
|
if(flushimage(d, 1) < 0)
|
||||||
|
return -1;
|
||||||
|
free(s);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Image*
|
||||||
|
allocwindow(Screen *s, Rectangle r, int ref, u32int val)
|
||||||
|
{
|
||||||
|
return _allocwindow(nil, s, r, ref, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
Image*
|
||||||
|
_allocwindow(Image *i, Screen *s, Rectangle r, int ref, u32int val)
|
||||||
|
{
|
||||||
|
Display *d;
|
||||||
|
|
||||||
|
d = s->display;
|
||||||
|
i = _allocimage(i, d, r, d->screenimage->chan, 0, val, s->id, ref);
|
||||||
|
if(i == 0)
|
||||||
|
return 0;
|
||||||
|
i->screen = s;
|
||||||
|
i->next = s->display->windows;
|
||||||
|
s->display->windows = i;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
topbottom(Image **w, int n, int top)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uchar *b;
|
||||||
|
Display *d;
|
||||||
|
|
||||||
|
if(n < 0){
|
||||||
|
Ridiculous:
|
||||||
|
fprint(2, "top/bottom: ridiculous number of windows\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(n == 0)
|
||||||
|
return;
|
||||||
|
if(n > (w[0]->display->bufsize-100)/4)
|
||||||
|
goto Ridiculous;
|
||||||
|
/*
|
||||||
|
* this used to check that all images were on the same screen.
|
||||||
|
* we don't know the screen associated with images we acquired
|
||||||
|
* by name. instead, check that all images are on the same display.
|
||||||
|
* the display will check that they are all on the same screen.
|
||||||
|
*/
|
||||||
|
d = w[0]->display;
|
||||||
|
for(i=1; i<n; i++)
|
||||||
|
if(w[i]->display != d){
|
||||||
|
fprint(2, "top/bottom: windows not on same screen\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(n==0)
|
||||||
|
return;
|
||||||
|
b = bufimage(d, 1+1+2+4*n);
|
||||||
|
b[0] = 't';
|
||||||
|
b[1] = top;
|
||||||
|
BPSHORT(b+2, n);
|
||||||
|
for(i=0; i<n; i++)
|
||||||
|
BPLONG(b+4+4*i, w[i]->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bottomwindow(Image *w)
|
||||||
|
{
|
||||||
|
if(w->screen == 0)
|
||||||
|
return;
|
||||||
|
topbottom(&w, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
topwindow(Image *w)
|
||||||
|
{
|
||||||
|
if(w->screen == 0)
|
||||||
|
return;
|
||||||
|
topbottom(&w, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bottomnwindows(Image **w, int n)
|
||||||
|
{
|
||||||
|
topbottom(w, n, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
topnwindows(Image **w, int n)
|
||||||
|
{
|
||||||
|
topbottom(w, n, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
originwindow(Image *w, Point log, Point scr)
|
||||||
|
{
|
||||||
|
uchar *b;
|
||||||
|
Point delta;
|
||||||
|
|
||||||
|
flushimage(w->display, 0);
|
||||||
|
b = bufimage(w->display, 1+4+2*4+2*4);
|
||||||
|
if(b == nil)
|
||||||
|
return 0;
|
||||||
|
b[0] = 'o';
|
||||||
|
BPLONG(b+1, w->id);
|
||||||
|
BPLONG(b+5, log.x);
|
||||||
|
BPLONG(b+9, log.y);
|
||||||
|
BPLONG(b+13, scr.x);
|
||||||
|
BPLONG(b+17, scr.y);
|
||||||
|
if(flushimage(w->display, 1) < 0)
|
||||||
|
return -1;
|
||||||
|
delta = subpt(log, w->r.min);
|
||||||
|
w->r = rectaddpt(w->r, delta);
|
||||||
|
w->clipr = rectaddpt(w->clipr, delta);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
185
src/libdraw/writeimage.c
Normal file
185
src/libdraw/writeimage.c
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
#define HSHIFT 3 /* HSHIFT==5 runs slightly faster, but hash table is 64x bigger */
|
||||||
|
#define NHASH (1<<(HSHIFT*NMATCH))
|
||||||
|
#define HMASK (NHASH-1)
|
||||||
|
#define hupdate(h, c) ((((h)<<HSHIFT)^(c))&HMASK)
|
||||||
|
typedef struct Hlist Hlist;
|
||||||
|
struct Hlist{
|
||||||
|
uchar *s;
|
||||||
|
Hlist *next, *prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
writeimage(int fd, Image *i, int dolock)
|
||||||
|
{
|
||||||
|
uchar *outbuf, *outp, *eout; /* encoded data, pointer, end */
|
||||||
|
uchar *loutp; /* start of encoded line */
|
||||||
|
Hlist *hash; /* heads of hash chains of past strings */
|
||||||
|
Hlist *chain, *hp; /* hash chain members, pointer */
|
||||||
|
Hlist *cp; /* next Hlist to fall out of window */
|
||||||
|
int h; /* hash value */
|
||||||
|
uchar *line, *eline; /* input line, end pointer */
|
||||||
|
uchar *data, *edata; /* input buffer, end pointer */
|
||||||
|
ulong n; /* length of input buffer */
|
||||||
|
ulong nb; /* # of bytes returned by unloadimage */
|
||||||
|
int bpl; /* input line length */
|
||||||
|
int offs, runlen; /* offset, length of consumed data */
|
||||||
|
uchar dumpbuf[NDUMP]; /* dump accumulator */
|
||||||
|
int ndump; /* length of dump accumulator */
|
||||||
|
int miny, dy; /* y values while unloading input */
|
||||||
|
int chunk, ncblock;
|
||||||
|
Rectangle r;
|
||||||
|
uchar *p, *q, *s, *es, *t;
|
||||||
|
char hdr[11+5*12+1];
|
||||||
|
char cbuf[20];
|
||||||
|
|
||||||
|
chunk = i->display->bufsize - 32; /* a little room for header */
|
||||||
|
r = i->r;
|
||||||
|
bpl = bytesperline(r, i->depth);
|
||||||
|
n = Dy(r)*bpl;
|
||||||
|
data = malloc(n);
|
||||||
|
ncblock = _compblocksize(r, i->depth);
|
||||||
|
outbuf = malloc(ncblock);
|
||||||
|
hash = malloc(NHASH*sizeof(Hlist));
|
||||||
|
chain = malloc(NMEM*sizeof(Hlist));
|
||||||
|
if(data == 0 || outbuf == 0 || hash == 0 || chain == 0){
|
||||||
|
ErrOut:
|
||||||
|
free(data);
|
||||||
|
free(outbuf);
|
||||||
|
free(hash);
|
||||||
|
free(chain);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for(miny = r.min.y; miny != r.max.y; miny += dy){
|
||||||
|
dy = r.max.y-miny;
|
||||||
|
if(dy*bpl > chunk)
|
||||||
|
dy = chunk/bpl;
|
||||||
|
if(dolock)
|
||||||
|
lockdisplay(i->display);
|
||||||
|
nb = unloadimage(i, Rect(r.min.x, miny, r.max.x, miny+dy),
|
||||||
|
data+(miny-r.min.y)*bpl, dy*bpl);
|
||||||
|
if(dolock)
|
||||||
|
unlockdisplay(i->display);
|
||||||
|
if(nb != dy*bpl)
|
||||||
|
goto ErrOut;
|
||||||
|
}
|
||||||
|
sprint(hdr, "compressed\n%11s %11d %11d %11d %11d ",
|
||||||
|
chantostr(cbuf, i->chan), r.min.x, r.min.y, r.max.x, r.max.y);
|
||||||
|
if(write(fd, hdr, 11+5*12) != 11+5*12)
|
||||||
|
goto ErrOut;
|
||||||
|
edata = data+n;
|
||||||
|
eout = outbuf+ncblock;
|
||||||
|
line = data;
|
||||||
|
r.max.y = r.min.y;
|
||||||
|
while(line != edata){
|
||||||
|
memset(hash, 0, NHASH*sizeof(Hlist));
|
||||||
|
memset(chain, 0, NMEM*sizeof(Hlist));
|
||||||
|
cp = chain;
|
||||||
|
h = 0;
|
||||||
|
outp = outbuf;
|
||||||
|
for(n = 0; n != NMATCH; n++)
|
||||||
|
h = hupdate(h, line[n]);
|
||||||
|
loutp = outbuf;
|
||||||
|
while(line != edata){
|
||||||
|
ndump = 0;
|
||||||
|
eline = line+bpl;
|
||||||
|
for(p = line; p != eline; ){
|
||||||
|
if(eline-p < NRUN)
|
||||||
|
es = eline;
|
||||||
|
else
|
||||||
|
es = p+NRUN;
|
||||||
|
q = 0;
|
||||||
|
runlen = 0;
|
||||||
|
for(hp = hash[h].next; hp; hp = hp->next){
|
||||||
|
s = p + runlen;
|
||||||
|
if(s >= es)
|
||||||
|
continue;
|
||||||
|
t = hp->s + runlen;
|
||||||
|
for(; s >= p; s--)
|
||||||
|
if(*s != *t--)
|
||||||
|
goto matchloop;
|
||||||
|
t += runlen+2;
|
||||||
|
s += runlen+2;
|
||||||
|
for(; s < es; s++)
|
||||||
|
if(*s != *t++)
|
||||||
|
break;
|
||||||
|
n = s-p;
|
||||||
|
if(n > runlen){
|
||||||
|
runlen = n;
|
||||||
|
q = hp->s;
|
||||||
|
if(n == NRUN)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
matchloop: ;
|
||||||
|
}
|
||||||
|
if(runlen < NMATCH){
|
||||||
|
if(ndump == NDUMP){
|
||||||
|
if(eout-outp < ndump+1)
|
||||||
|
goto Bfull;
|
||||||
|
*outp++ = ndump-1+128;
|
||||||
|
memmove(outp, dumpbuf, ndump);
|
||||||
|
outp += ndump;
|
||||||
|
ndump = 0;
|
||||||
|
}
|
||||||
|
dumpbuf[ndump++] = *p;
|
||||||
|
runlen = 1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(ndump != 0){
|
||||||
|
if(eout-outp < ndump+1)
|
||||||
|
goto Bfull;
|
||||||
|
*outp++ = ndump-1+128;
|
||||||
|
memmove(outp, dumpbuf, ndump);
|
||||||
|
outp += ndump;
|
||||||
|
ndump = 0;
|
||||||
|
}
|
||||||
|
offs = p-q-1;
|
||||||
|
if(eout-outp < 2)
|
||||||
|
goto Bfull;
|
||||||
|
*outp++ = ((runlen-NMATCH)<<2) + (offs>>8);
|
||||||
|
*outp++ = offs&255;
|
||||||
|
}
|
||||||
|
for(q = p+runlen; p != q; p++){
|
||||||
|
if(cp->prev)
|
||||||
|
cp->prev->next = 0;
|
||||||
|
cp->next = hash[h].next;
|
||||||
|
cp->prev = &hash[h];
|
||||||
|
if(cp->next)
|
||||||
|
cp->next->prev = cp;
|
||||||
|
cp->prev->next = cp;
|
||||||
|
cp->s = p;
|
||||||
|
if(++cp == &chain[NMEM])
|
||||||
|
cp = chain;
|
||||||
|
if(edata-p > NMATCH)
|
||||||
|
h = hupdate(h, p[NMATCH]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ndump != 0){
|
||||||
|
if(eout-outp < ndump+1)
|
||||||
|
goto Bfull;
|
||||||
|
*outp++ = ndump-1+128;
|
||||||
|
memmove(outp, dumpbuf, ndump);
|
||||||
|
outp += ndump;
|
||||||
|
}
|
||||||
|
line = eline;
|
||||||
|
loutp = outp;
|
||||||
|
r.max.y++;
|
||||||
|
}
|
||||||
|
Bfull:
|
||||||
|
if(loutp == outbuf)
|
||||||
|
goto ErrOut;
|
||||||
|
n = loutp-outbuf;
|
||||||
|
sprint(hdr, "%11d %11ld ", r.max.y, n);
|
||||||
|
write(fd, hdr, 2*12);
|
||||||
|
write(fd, outbuf, n);
|
||||||
|
r.min.y = r.max.y;
|
||||||
|
}
|
||||||
|
free(data);
|
||||||
|
free(outbuf);
|
||||||
|
free(hash);
|
||||||
|
free(chain);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
45
src/libdraw/writesubfont.c
Normal file
45
src/libdraw/writesubfont.c
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <draw.h>
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
packinfo(Fontchar *fc, uchar *p, int n)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for(j=0; j<=n; j++){
|
||||||
|
p[0] = fc->x;
|
||||||
|
p[1] = fc->x>>8;
|
||||||
|
p[2] = fc->top;
|
||||||
|
p[3] = fc->bottom;
|
||||||
|
p[4] = fc->left;
|
||||||
|
p[5] = fc->width;
|
||||||
|
fc++;
|
||||||
|
p += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
writesubfont(int fd, Subfont *f)
|
||||||
|
{
|
||||||
|
char hdr[3*12+1];
|
||||||
|
uchar *data;
|
||||||
|
int nb;
|
||||||
|
|
||||||
|
sprint(hdr, "%11d %11d %11d ", f->n, f->height, f->ascent);
|
||||||
|
if(write(fd, hdr, 3*12) != 3*12){
|
||||||
|
Err:
|
||||||
|
werrstr("writesubfont: bad write: %r");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
nb = 6*(f->n+1);
|
||||||
|
data = malloc(nb);
|
||||||
|
if(data == nil)
|
||||||
|
return -1;
|
||||||
|
packinfo(f->info, data, f->n);
|
||||||
|
if(write(fd, data, nb) != nb)
|
||||||
|
goto Err;
|
||||||
|
free(data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user