mirror of https://github.com/0intro/conterm
consolidate
This commit is contained in:
parent
972518cb05
commit
6c519f3309
|
@ -3,11 +3,7 @@ include ../Make.config
|
|||
LIB=libgui.a
|
||||
|
||||
OFILES=\
|
||||
alloc.$O\
|
||||
cload.$O\
|
||||
draw.$O\
|
||||
load.$O\
|
||||
screen.$O\
|
||||
x11.$O\
|
||||
keysym2ucs-x11.$O
|
||||
|
||||
default: $(LIB)
|
||||
|
|
206
gui-x11/alloc.c
206
gui-x11/alloc.c
|
@ -1,206 +0,0 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <draw.h>
|
||||
#include <memdraw.h>
|
||||
#include "xmem.h"
|
||||
|
||||
/* perfect approximation to NTSC = .299r+.587g+.114b when 0 ≤ r,g,b < 256 */
|
||||
#define RGB2K(r,g,b) ((156763*(r)+307758*(g)+59769*(b))>>19)
|
||||
|
||||
Memimage*
|
||||
xallocmemimage(Rectangle r, ulong chan, int pmid)
|
||||
{
|
||||
Memimage *m;
|
||||
Xmem *xm;
|
||||
XImage *xi;
|
||||
int offset;
|
||||
int d;
|
||||
|
||||
m = _allocmemimage(r, chan);
|
||||
if(m == nil)
|
||||
return nil;
|
||||
if(chan != GREY1 && chan != xscreenchan)
|
||||
return m;
|
||||
|
||||
d = m->depth;
|
||||
xm = mallocz(sizeof(Xmem), 1);
|
||||
if(pmid != PMundef)
|
||||
xm->pmid = pmid;
|
||||
else
|
||||
xm->pmid = XCreatePixmap(xdisplay, xscreenid, Dx(r), Dy(r), (d==32) ? 24 : d);
|
||||
|
||||
if(m->depth == 24)
|
||||
offset = r.min.x&(4-1);
|
||||
else
|
||||
offset = r.min.x&(31/m->depth);
|
||||
r.min.x -= offset;
|
||||
|
||||
assert(wordsperline(r, m->depth) <= m->width);
|
||||
|
||||
xi = XCreateImage(xdisplay, xvis, m->depth==32?24:m->depth, ZPixmap, 0,
|
||||
(char*)m->data->bdata, Dx(r), Dy(r), 32, m->width*sizeof(ulong));
|
||||
|
||||
if(xi == nil){
|
||||
_freememimage(m);
|
||||
return nil;
|
||||
}
|
||||
|
||||
xm->xi = xi;
|
||||
xm->pc = getcallerpc(&r);
|
||||
xm->r = r;
|
||||
|
||||
/*
|
||||
* Set the parameters of the XImage so its memory looks exactly like a
|
||||
* Memimage, so we can call _memimagedraw on the same data. All frame
|
||||
* buffers we've seen, and Plan 9's graphics code, require big-endian
|
||||
* bits within bytes, but little endian byte order within pixels.
|
||||
*/
|
||||
xi->bitmap_unit = m->depth < 8 || m->depth == 24 ? 8 : m->depth;
|
||||
xi->byte_order = LSBFirst;
|
||||
xi->bitmap_bit_order = MSBFirst;
|
||||
xi->bitmap_pad = 32;
|
||||
xm->r = Rect(0,0,0,0);
|
||||
XInitImage(xi);
|
||||
XFlush(xdisplay);
|
||||
|
||||
m->X = xm;
|
||||
return m;
|
||||
}
|
||||
|
||||
Memimage*
|
||||
allocmemimage(Rectangle r, ulong chan)
|
||||
{
|
||||
return xallocmemimage(r, chan, PMundef);
|
||||
}
|
||||
|
||||
void
|
||||
freememimage(Memimage *m)
|
||||
{
|
||||
Xmem *xm;
|
||||
|
||||
if(m == nil)
|
||||
return;
|
||||
|
||||
if(m->data->ref == 1){
|
||||
if((xm = m->X) != nil){
|
||||
if(xm->xi){
|
||||
xm->xi->data = nil;
|
||||
XFree(xm->xi);
|
||||
}
|
||||
XFreePixmap(xdisplay, xm->pmid);
|
||||
free(xm);
|
||||
m->X = nil;
|
||||
}
|
||||
}
|
||||
_freememimage(m);
|
||||
}
|
||||
|
||||
void
|
||||
memfillcolor(Memimage *m, ulong val)
|
||||
{
|
||||
_memfillcolor(m, val);
|
||||
if(m->X){
|
||||
if((val & 0xFF) == 0xFF)
|
||||
xfillcolor(m, m->r, _rgbatoimg(m, val));
|
||||
else
|
||||
putXdata(m, m->r);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
addrect(Rectangle *rp, Rectangle r)
|
||||
{
|
||||
if(rp->min.x >= rp->max.x)
|
||||
*rp = r;
|
||||
else
|
||||
combinerect(rp, r);
|
||||
}
|
||||
|
||||
XImage*
|
||||
getXdata(Memimage *m, Rectangle r)
|
||||
{
|
||||
uchar *p;
|
||||
int x, y;
|
||||
Xmem *xm;
|
||||
Point xdelta, delta;
|
||||
Point tp;
|
||||
|
||||
xm = m->X;
|
||||
if(xm == nil)
|
||||
return nil;
|
||||
|
||||
assert(xm != nil && xm->xi != nil);
|
||||
|
||||
if(xm->dirty == 0)
|
||||
return xm->xi;
|
||||
|
||||
r = xm->dirtyr;
|
||||
if(Dx(r)==0 || Dy(r)==0)
|
||||
return xm->xi;
|
||||
|
||||
delta = subpt(r.min, m->r.min);
|
||||
tp = xm->r.min; /* avoid unaligned access on digital unix */
|
||||
xdelta = subpt(r.min, tp);
|
||||
|
||||
XGetSubImage(xdisplay, xm->pmid, delta.x, delta.y, Dx(r), Dy(r),
|
||||
AllPlanes, ZPixmap, xm->xi, xdelta.x, xdelta.y);
|
||||
|
||||
if(xtblbit && m->chan == CMAP8)
|
||||
for(y=r.min.y; y<r.max.y; y++)
|
||||
for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
|
||||
*p = x11toplan9[*p];
|
||||
|
||||
xm->dirty = 0;
|
||||
xm->dirtyr = Rect(0,0,0,0);
|
||||
return xm->xi;
|
||||
}
|
||||
|
||||
void
|
||||
putXdata(Memimage *m, Rectangle r)
|
||||
{
|
||||
Xmem *xm;
|
||||
XImage *xi;
|
||||
GC g;
|
||||
Point xdelta, delta;
|
||||
Point tp;
|
||||
int x, y;
|
||||
uchar *p;
|
||||
|
||||
xm = m->X;
|
||||
if(xm == nil)
|
||||
return;
|
||||
|
||||
assert(xm != nil);
|
||||
assert(xm->xi != nil);
|
||||
|
||||
xi = xm->xi;
|
||||
|
||||
g = (m->chan == GREY1) ? xgccopy0 : xgccopy;
|
||||
|
||||
delta = subpt(r.min, m->r.min);
|
||||
tp = xm->r.min; /* avoid unaligned access on digital unix */
|
||||
xdelta = subpt(r.min, tp);
|
||||
|
||||
if(xtblbit && m->chan == CMAP8)
|
||||
for(y=r.min.y; y<r.max.y; y++)
|
||||
for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
|
||||
*p = plan9tox11[*p];
|
||||
|
||||
XPutImage(xdisplay, xm->pmid, g, xi, xdelta.x, xdelta.y, delta.x, delta.y, Dx(r), Dy(r));
|
||||
|
||||
if(xtblbit && m->chan == CMAP8)
|
||||
for(y=r.min.y; y<r.max.y; y++)
|
||||
for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
|
||||
*p = x11toplan9[*p];
|
||||
}
|
||||
|
||||
void
|
||||
dirtyXdata(Memimage *m, Rectangle r)
|
||||
{
|
||||
Xmem *xm;
|
||||
|
||||
if((xm = m->X) != nil){
|
||||
xm->dirty = 1;
|
||||
addrect(&xm->dirtyr, r);
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <draw.h>
|
||||
#include <memdraw.h>
|
||||
#include "xmem.h"
|
||||
|
||||
int
|
||||
cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = _cloadmemimage(i, r, data, ndata);
|
||||
if(n > 0 && i->X)
|
||||
putXdata(i, r);
|
||||
return n;
|
||||
}
|
186
gui-x11/draw.c
186
gui-x11/draw.c
|
@ -1,186 +0,0 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <draw.h>
|
||||
#include <memdraw.h>
|
||||
#include "xmem.h"
|
||||
|
||||
void xfillcolor(Memimage*, Rectangle, ulong);
|
||||
static int xdraw(Memdrawparam*);
|
||||
|
||||
int xgcfillcolor = 0;
|
||||
int xgcfillcolor0 = 0;
|
||||
int xgczeropm = 0;
|
||||
int xgczeropm0 = 0;
|
||||
int xgcsimplecolor = 0;
|
||||
int xgcsimplecolor0 = 0;
|
||||
int xgcsimplepm = 0;
|
||||
int xgcsimplepm0 = 0;
|
||||
int xgcreplsrctile = 0;
|
||||
int xgcreplsrctile0 = 0;
|
||||
|
||||
void
|
||||
memimageinit(void)
|
||||
{
|
||||
static int didinit = 0;
|
||||
|
||||
if(didinit)
|
||||
return;
|
||||
|
||||
didinit = 1;
|
||||
_memimageinit();
|
||||
|
||||
xfillcolor(memblack, memblack->r, 0);
|
||||
xfillcolor(memwhite, memwhite->r, 1);
|
||||
}
|
||||
|
||||
void
|
||||
memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point sp, Memimage *mask, Point mp, int op)
|
||||
{
|
||||
Memdrawparam *par;
|
||||
|
||||
if((par = _memimagedrawsetup(dst, r, src, sp, mask, mp, op)) == nil)
|
||||
return;
|
||||
_memimagedraw(par);
|
||||
if(!xdraw(par))
|
||||
putXdata(dst, par->r);
|
||||
}
|
||||
|
||||
void
|
||||
xfillcolor(Memimage *m, Rectangle r, ulong v)
|
||||
{
|
||||
GC gc;
|
||||
Xmem *dxm;
|
||||
|
||||
dxm = m->X;
|
||||
assert(dxm != nil);
|
||||
r = rectsubpt(r, m->r.min);
|
||||
|
||||
if(m->chan == GREY1){
|
||||
gc = xgcfill0;
|
||||
if(xgcfillcolor0 != v){
|
||||
XSetForeground(xdisplay, gc, v);
|
||||
xgcfillcolor0 = v;
|
||||
}
|
||||
}else{
|
||||
if(m->chan == CMAP8 && xtblbit)
|
||||
v = plan9tox11[v];
|
||||
|
||||
gc = xgcfill;
|
||||
if(xgcfillcolor != v){
|
||||
XSetForeground(xdisplay, gc, v);
|
||||
xgcfillcolor = v;
|
||||
}
|
||||
}
|
||||
XFillRectangle(xdisplay, dxm->pmid, gc, r.min.x, r.min.y, Dx(r), Dy(r));
|
||||
}
|
||||
|
||||
static int
|
||||
xdraw(Memdrawparam *par)
|
||||
{
|
||||
int dy, dx;
|
||||
unsigned m;
|
||||
Memimage *src, *dst, *mask;
|
||||
Xmem *dxm, *sxm, *mxm;
|
||||
GC gc;
|
||||
Rectangle r, sr, mr;
|
||||
ulong sdval;
|
||||
|
||||
dx = Dx(par->r);
|
||||
dy = Dy(par->r);
|
||||
src = par->src;
|
||||
dst = par->dst;
|
||||
mask = par->mask;
|
||||
r = par->r;
|
||||
sr = par->sr;
|
||||
mr = par->mr;
|
||||
sdval = par->sdval;
|
||||
|
||||
return 0;
|
||||
if((dxm = dst->X) == nil)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If we have an opaque mask and source is one opaque pixel we can convert to the
|
||||
* destination format and just XFillRectangle.
|
||||
*/
|
||||
m = Simplesrc|Simplemask|Fullmask;
|
||||
if((par->state&m)==m){
|
||||
xfillcolor(dst, r, sdval);
|
||||
dirtyXdata(dst, par->r);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If no source alpha, an opaque mask, we can just copy the
|
||||
* source onto the destination. If the channels are the same and
|
||||
* the source is not replicated, XCopyArea suffices.
|
||||
*/
|
||||
m = Simplemask|Fullmask;
|
||||
if((par->state&(m|Replsrc))==m && src->chan == dst->chan && src->X){
|
||||
sxm = src->X;
|
||||
r = rectsubpt(r, dst->r.min);
|
||||
sr = rectsubpt(sr, src->r.min);
|
||||
if(dst->chan == GREY1)
|
||||
gc = xgccopy0;
|
||||
else
|
||||
gc = xgccopy;
|
||||
XCopyArea(xdisplay, sxm->pmid, dxm->pmid, gc,
|
||||
sr.min.x, sr.min.y, dx, dy, r.min.x, r.min.y);
|
||||
dirtyXdata(dst, par->r);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If no source alpha, a 1-bit mask, and a simple source
|
||||
* we can just copy through the mask onto the destination.
|
||||
*/
|
||||
if(dst->X && mask->X && !(mask->flags&Frepl)
|
||||
&& mask->chan == GREY1 && (par->state&Simplesrc)){
|
||||
Point p;
|
||||
|
||||
mxm = mask->X;
|
||||
r = rectsubpt(r, dst->r.min);
|
||||
mr = rectsubpt(mr, mask->r.min);
|
||||
p = subpt(r.min, mr.min);
|
||||
if(dst->chan == GREY1){
|
||||
gc = xgcsimplesrc0;
|
||||
if(xgcsimplecolor0 != sdval){
|
||||
XSetForeground(xdisplay, gc, sdval);
|
||||
xgcsimplecolor0 = sdval;
|
||||
}
|
||||
if(xgcsimplepm0 != mxm->pmid){
|
||||
XSetStipple(xdisplay, gc, mxm->pmid);
|
||||
xgcsimplepm0 = mxm->pmid;
|
||||
}
|
||||
}else{
|
||||
/* somehow this doesn't work on rob's mac
|
||||
gc = xgcsimplesrc;
|
||||
if(dst->chan == CMAP8 && xtblbit)
|
||||
sdval = plan9tox11[sdval];
|
||||
|
||||
if(xgcsimplecolor != sdval){
|
||||
XSetForeground(xdisplay, gc, sdval);
|
||||
xgcsimplecolor = sdval;
|
||||
}
|
||||
if(xgcsimplepm != mxm->pmid){
|
||||
XSetStipple(xdisplay, gc, mxm->pmid);
|
||||
xgcsimplepm = mxm->pmid;
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
XSetTSOrigin(xdisplay, gc, p.x, p.y);
|
||||
XFillRectangle(xdisplay, dxm->pmid, gc, r.min.x, r.min.y, dx, dy);
|
||||
dirtyXdata(dst, par->r);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ulong
|
||||
pixelbits(Memimage *m, Point p)
|
||||
{
|
||||
if(m->X)
|
||||
getXdata(m, Rect(p.x, p.y, p.x+1, p.y+1));
|
||||
return _pixelbits(m, p);
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
#define icon_bitmap_width 48
|
||||
#define icon_bitmap_height 48
|
||||
static unsigned short icon_bitmap_bits[] = {
|
||||
0xffff, 0xffff, 0xffff, 0xffff, 0xffe9, 0xffff, 0x7fff, 0xffae, 0xffff,
|
||||
0xffff, 0xffbe, 0xffff, 0x1fff, 0xff3f, 0xffff, 0xbfff, 0xfe6e, 0xffff,
|
||||
0xbbff, 0xfcce, 0xffff, 0xffff, 0xf98c, 0xffff, 0xe5ff, 0xf31b, 0xffff,
|
||||
0x87ff, 0xe617, 0xffff, 0x05ff, 0xdf37, 0xffff, 0x0fff, 0x7ffe, 0xffff,
|
||||
0x1bff, 0xfffc, 0xfffa, 0x37ff, 0xfffc, 0xfffb, 0xd7ff, 0xfffc, 0xfff7,
|
||||
0xcfff, 0xffff, 0xfff7, 0xcfff, 0xffff, 0xffef, 0xdfff, 0xffff, 0xffef,
|
||||
0xafff, 0xffff, 0xffdf, 0xefff, 0xffff, 0xfff3, 0xdfff, 0xefff, 0xffd3,
|
||||
0xdfff, 0xc7ff, 0xffdf, 0xefff, 0xefff, 0xffef, 0xcfff, 0xffff, 0xffcf,
|
||||
0xdfff, 0xffff, 0xffd9, 0x9fff, 0x7fff, 0xffd0, 0xbfff, 0xffff, 0xffd7,
|
||||
0x7fff, 0xbfff, 0xffd0, 0x3fff, 0x3fff, 0xffd9, 0x7fff, 0x3fff, 0xffcb,
|
||||
0x3fff, 0xffff, 0xffdc, 0x3fff, 0xffff, 0xffdf, 0x3fff, 0xffff, 0xff9f,
|
||||
0x3fff, 0xffff, 0xffdf, 0x8fff, 0xffff, 0xff9f, 0xa7ff, 0xffff, 0xffdf,
|
||||
0xe3ff, 0xffff, 0xffcf, 0xe9ff, 0xffff, 0xffcf, 0xf1ff, 0xffff, 0xffef,
|
||||
0xf3ff, 0xffff, 0xffe7, 0xf9ff, 0xffff, 0xffe7, 0x53ff, 0xffff, 0xffe1,
|
||||
0x07ff, 0x7ffc, 0xffc6, 0x17ff, 0xeff0, 0xffee, 0xffff, 0xc781, 0xffe5,
|
||||
0xffff, 0x8807, 0xffe0, 0xffff, 0x003f, 0xfff0, 0xffff, 0x1fff, 0xfffe };
|
|
@ -1,754 +0,0 @@
|
|||
static ulong
|
||||
ksym2utf[] = {
|
||||
[0x01a1] 0x0104,
|
||||
[0x01a2] 0x02d8,
|
||||
[0x01a3] 0x0141,
|
||||
[0x01a5] 0x013d,
|
||||
[0x01a6] 0x015a,
|
||||
[0x01a9] 0x0160,
|
||||
[0x01aa] 0x015e,
|
||||
[0x01ab] 0x0164,
|
||||
[0x01ac] 0x0179,
|
||||
[0x01ae] 0x017d,
|
||||
[0x01af] 0x017b,
|
||||
[0x01b1] 0x0105,
|
||||
[0x01b2] 0x02db,
|
||||
[0x01b3] 0x0142,
|
||||
[0x01b5] 0x013e,
|
||||
[0x01b6] 0x015b,
|
||||
[0x01b7] 0x02c7,
|
||||
[0x01b9] 0x0161,
|
||||
[0x01ba] 0x015f,
|
||||
[0x01bb] 0x0165,
|
||||
[0x01bc] 0x017a,
|
||||
[0x01bd] 0x02dd,
|
||||
[0x01be] 0x017e,
|
||||
[0x01bf] 0x017c,
|
||||
[0x01c0] 0x0154,
|
||||
[0x01c3] 0x0102,
|
||||
[0x01c5] 0x0139,
|
||||
[0x01c6] 0x0106,
|
||||
[0x01c8] 0x010c,
|
||||
[0x01ca] 0x0118,
|
||||
[0x01cc] 0x011a,
|
||||
[0x01cf] 0x010e,
|
||||
[0x01d0] 0x0110,
|
||||
[0x01d1] 0x0143,
|
||||
[0x01d2] 0x0147,
|
||||
[0x01d5] 0x0150,
|
||||
[0x01d8] 0x0158,
|
||||
[0x01d9] 0x016e,
|
||||
[0x01db] 0x0170,
|
||||
[0x01de] 0x0162,
|
||||
[0x01e0] 0x0155,
|
||||
[0x01e3] 0x0103,
|
||||
[0x01e5] 0x013a,
|
||||
[0x01e6] 0x0107,
|
||||
[0x01e8] 0x010d,
|
||||
[0x01ea] 0x0119,
|
||||
[0x01ec] 0x011b,
|
||||
[0x01ef] 0x010f,
|
||||
[0x01f0] 0x0111,
|
||||
[0x01f1] 0x0144,
|
||||
[0x01f2] 0x0148,
|
||||
[0x01f5] 0x0151,
|
||||
[0x01f8] 0x0159,
|
||||
[0x01f9] 0x016f,
|
||||
[0x01fb] 0x0171,
|
||||
[0x01fe] 0x0163,
|
||||
[0x01ff] 0x02d9,
|
||||
[0x02a1] 0x0126,
|
||||
[0x02a6] 0x0124,
|
||||
[0x02a9] 0x0130,
|
||||
[0x02ab] 0x011e,
|
||||
[0x02ac] 0x0134,
|
||||
[0x02b1] 0x0127,
|
||||
[0x02b6] 0x0125,
|
||||
[0x02b9] 0x0131,
|
||||
[0x02bb] 0x011f,
|
||||
[0x02bc] 0x0135,
|
||||
[0x02c5] 0x010a,
|
||||
[0x02c6] 0x0108,
|
||||
[0x02d5] 0x0120,
|
||||
[0x02d8] 0x011c,
|
||||
[0x02dd] 0x016c,
|
||||
[0x02de] 0x015c,
|
||||
[0x02e5] 0x010b,
|
||||
[0x02e6] 0x0109,
|
||||
[0x02f5] 0x0121,
|
||||
[0x02f8] 0x011d,
|
||||
[0x02fd] 0x016d,
|
||||
[0x02fe] 0x015d,
|
||||
[0x03a2] 0x0138,
|
||||
[0x03a3] 0x0156,
|
||||
[0x03a5] 0x0128,
|
||||
[0x03a6] 0x013b,
|
||||
[0x03aa] 0x0112,
|
||||
[0x03ab] 0x0122,
|
||||
[0x03ac] 0x0166,
|
||||
[0x03b3] 0x0157,
|
||||
[0x03b5] 0x0129,
|
||||
[0x03b6] 0x013c,
|
||||
[0x03ba] 0x0113,
|
||||
[0x03bb] 0x0123,
|
||||
[0x03bc] 0x0167,
|
||||
[0x03bd] 0x014a,
|
||||
[0x03bf] 0x014b,
|
||||
[0x03c0] 0x0100,
|
||||
[0x03c7] 0x012e,
|
||||
[0x03cc] 0x0116,
|
||||
[0x03cf] 0x012a,
|
||||
[0x03d1] 0x0145,
|
||||
[0x03d2] 0x014c,
|
||||
[0x03d3] 0x0136,
|
||||
[0x03d9] 0x0172,
|
||||
[0x03dd] 0x0168,
|
||||
[0x03de] 0x016a,
|
||||
[0x03e0] 0x0101,
|
||||
[0x03e7] 0x012f,
|
||||
[0x03ec] 0x0117,
|
||||
[0x03ef] 0x012b,
|
||||
[0x03f1] 0x0146,
|
||||
[0x03f2] 0x014d,
|
||||
[0x03f3] 0x0137,
|
||||
[0x03f9] 0x0173,
|
||||
[0x03fd] 0x0169,
|
||||
[0x03fe] 0x016b,
|
||||
[0x047e] 0x203e,
|
||||
[0x04a1] 0x3002,
|
||||
[0x04a2] 0x300c,
|
||||
[0x04a3] 0x300d,
|
||||
[0x04a4] 0x3001,
|
||||
[0x04a5] 0x30fb,
|
||||
[0x04a6] 0x30f2,
|
||||
[0x04a7] 0x30a1,
|
||||
[0x04a8] 0x30a3,
|
||||
[0x04a9] 0x30a5,
|
||||
[0x04aa] 0x30a7,
|
||||
[0x04ab] 0x30a9,
|
||||
[0x04ac] 0x30e3,
|
||||
[0x04ad] 0x30e5,
|
||||
[0x04ae] 0x30e7,
|
||||
[0x04af] 0x30c3,
|
||||
[0x04b0] 0x30fc,
|
||||
[0x04b1] 0x30a2,
|
||||
[0x04b2] 0x30a4,
|
||||
[0x04b3] 0x30a6,
|
||||
[0x04b4] 0x30a8,
|
||||
[0x04b5] 0x30aa,
|
||||
[0x04b6] 0x30ab,
|
||||
[0x04b7] 0x30ad,
|
||||
[0x04b8] 0x30af,
|
||||
[0x04b9] 0x30b1,
|
||||
[0x04ba] 0x30b3,
|
||||
[0x04bb] 0x30b5,
|
||||
[0x04bc] 0x30b7,
|
||||
[0x04bd] 0x30b9,
|
||||
[0x04be] 0x30bb,
|
||||
[0x04bf] 0x30bd,
|
||||
[0x04c0] 0x30bf,
|
||||
[0x04c1] 0x30c1,
|
||||
[0x04c2] 0x30c4,
|
||||
[0x04c3] 0x30c6,
|
||||
[0x04c4] 0x30c8,
|
||||
[0x04c5] 0x30ca,
|
||||
[0x04c6] 0x30cb,
|
||||
[0x04c7] 0x30cc,
|
||||
[0x04c8] 0x30cd,
|
||||
[0x04c9] 0x30ce,
|
||||
[0x04ca] 0x30cf,
|
||||
[0x04cb] 0x30d2,
|
||||
[0x04cc] 0x30d5,
|
||||
[0x04cd] 0x30d8,
|
||||
[0x04ce] 0x30db,
|
||||
[0x04cf] 0x30de,
|
||||
[0x04d0] 0x30df,
|
||||
[0x04d1] 0x30e0,
|
||||
[0x04d2] 0x30e1,
|
||||
[0x04d3] 0x30e2,
|
||||
[0x04d4] 0x30e4,
|
||||
[0x04d5] 0x30e6,
|
||||
[0x04d6] 0x30e8,
|
||||
[0x04d7] 0x30e9,
|
||||
[0x04d8] 0x30ea,
|
||||
[0x04d9] 0x30eb,
|
||||
[0x04da] 0x30ec,
|
||||
[0x04db] 0x30ed,
|
||||
[0x04dc] 0x30ef,
|
||||
[0x04dd] 0x30f3,
|
||||
[0x04de] 0x309b,
|
||||
[0x04df] 0x309c,
|
||||
[0x05ac] 0x060c,
|
||||
[0x05bb] 0x061b,
|
||||
[0x05bf] 0x061f,
|
||||
[0x05c1] 0x0621,
|
||||
[0x05c2] 0x0622,
|
||||
[0x05c3] 0x0623,
|
||||
[0x05c4] 0x0624,
|
||||
[0x05c5] 0x0625,
|
||||
[0x05c6] 0x0626,
|
||||
[0x05c7] 0x0627,
|
||||
[0x05c8] 0x0628,
|
||||
[0x05c9] 0x0629,
|
||||
[0x05ca] 0x062a,
|
||||
[0x05cb] 0x062b,
|
||||
[0x05cc] 0x062c,
|
||||
[0x05cd] 0x062d,
|
||||
[0x05ce] 0x062e,
|
||||
[0x05cf] 0x062f,
|
||||
[0x05d0] 0x0630,
|
||||
[0x05d1] 0x0631,
|
||||
[0x05d2] 0x0632,
|
||||
[0x05d3] 0x0633,
|
||||
[0x05d4] 0x0634,
|
||||
[0x05d5] 0x0635,
|
||||
[0x05d6] 0x0636,
|
||||
[0x05d7] 0x0637,
|
||||
[0x05d8] 0x0638,
|
||||
[0x05d9] 0x0639,
|
||||
[0x05da] 0x063a,
|
||||
[0x05e0] 0x0640,
|
||||
[0x05e1] 0x0641,
|
||||
[0x05e2] 0x0642,
|
||||
[0x05e3] 0x0643,
|
||||
[0x05e4] 0x0644,
|
||||
[0x05e5] 0x0645,
|
||||
[0x05e6] 0x0646,
|
||||
[0x05e7] 0x0647,
|
||||
[0x05e8] 0x0648,
|
||||
[0x05e9] 0x0649,
|
||||
[0x05ea] 0x064a,
|
||||
[0x05eb] 0x064b,
|
||||
[0x05ec] 0x064c,
|
||||
[0x05ed] 0x064d,
|
||||
[0x05ee] 0x064e,
|
||||
[0x05ef] 0x064f,
|
||||
[0x05f0] 0x0650,
|
||||
[0x05f1] 0x0651,
|
||||
[0x05f2] 0x0652,
|
||||
[0x06a1] 0x0452,
|
||||
[0x06a2] 0x0453,
|
||||
[0x06a3] 0x0451,
|
||||
[0x06a4] 0x0454,
|
||||
[0x06a5] 0x0455,
|
||||
[0x06a6] 0x0456,
|
||||
[0x06a7] 0x0457,
|
||||
[0x06a8] 0x0458,
|
||||
[0x06a9] 0x0459,
|
||||
[0x06aa] 0x045a,
|
||||
[0x06ab] 0x045b,
|
||||
[0x06ac] 0x045c,
|
||||
[0x06ae] 0x045e,
|
||||
[0x06af] 0x045f,
|
||||
[0x06b0] 0x2116,
|
||||
[0x06b1] 0x0402,
|
||||
[0x06b2] 0x0403,
|
||||
[0x06b3] 0x0401,
|
||||
[0x06b4] 0x0404,
|
||||
[0x06b5] 0x0405,
|
||||
[0x06b6] 0x0406,
|
||||
[0x06b7] 0x0407,
|
||||
[0x06b8] 0x0408,
|
||||
[0x06b9] 0x0409,
|
||||
[0x06ba] 0x040a,
|
||||
[0x06bb] 0x040b,
|
||||
[0x06bc] 0x040c,
|
||||
[0x06be] 0x040e,
|
||||
[0x06bf] 0x040f,
|
||||
[0x06c0] 0x044e,
|
||||
[0x06c1] 0x0430,
|
||||
[0x06c2] 0x0431,
|
||||
[0x06c3] 0x0446,
|
||||
[0x06c4] 0x0434,
|
||||
[0x06c5] 0x0435,
|
||||
[0x06c6] 0x0444,
|
||||
[0x06c7] 0x0433,
|
||||
[0x06c8] 0x0445,
|
||||
[0x06c9] 0x0438,
|
||||
[0x06ca] 0x0439,
|
||||
[0x06cb] 0x043a,
|
||||
[0x06cc] 0x043b,
|
||||
[0x06cd] 0x043c,
|
||||
[0x06ce] 0x043d,
|
||||
[0x06cf] 0x043e,
|
||||
[0x06d0] 0x043f,
|
||||
[0x06d1] 0x044f,
|
||||
[0x06d2] 0x0440,
|
||||
[0x06d3] 0x0441,
|
||||
[0x06d4] 0x0442,
|
||||
[0x06d5] 0x0443,
|
||||
[0x06d6] 0x0436,
|
||||
[0x06d7] 0x0432,
|
||||
[0x06d8] 0x044c,
|
||||
[0x06d9] 0x044b,
|
||||
[0x06da] 0x0437,
|
||||
[0x06db] 0x0448,
|
||||
[0x06dc] 0x044d,
|
||||
[0x06dd] 0x0449,
|
||||
[0x06de] 0x0447,
|
||||
[0x06df] 0x044a,
|
||||
[0x06e0] 0x042e,
|
||||
[0x06e1] 0x0410,
|
||||
[0x06e2] 0x0411,
|
||||
[0x06e3] 0x0426,
|
||||
[0x06e4] 0x0414,
|
||||
[0x06e5] 0x0415,
|
||||
[0x06e6] 0x0424,
|
||||
[0x06e7] 0x0413,
|
||||
[0x06e8] 0x0425,
|
||||
[0x06e9] 0x0418,
|
||||
[0x06ea] 0x0419,
|
||||
[0x06eb] 0x041a,
|
||||
[0x06ec] 0x041b,
|
||||
[0x06ed] 0x041c,
|
||||
[0x06ee] 0x041d,
|
||||
[0x06ef] 0x041e,
|
||||
[0x06f0] 0x041f,
|
||||
[0x06f1] 0x042f,
|
||||
[0x06f2] 0x0420,
|
||||
[0x06f3] 0x0421,
|
||||
[0x06f4] 0x0422,
|
||||
[0x06f5] 0x0423,
|
||||
[0x06f6] 0x0416,
|
||||
[0x06f7] 0x0412,
|
||||
[0x06f8] 0x042c,
|
||||
[0x06f9] 0x042b,
|
||||
[0x06fa] 0x0417,
|
||||
[0x06fb] 0x0428,
|
||||
[0x06fc] 0x042d,
|
||||
[0x06fd] 0x0429,
|
||||
[0x06fe] 0x0427,
|
||||
[0x06ff] 0x042a,
|
||||
[0x07a1] 0x0386,
|
||||
[0x07a2] 0x0388,
|
||||
[0x07a3] 0x0389,
|
||||
[0x07a4] 0x038a,
|
||||
[0x07a5] 0x03aa,
|
||||
[0x07a7] 0x038c,
|
||||
[0x07a8] 0x038e,
|
||||
[0x07a9] 0x03ab,
|
||||
[0x07ab] 0x038f,
|
||||
[0x07ae] 0x0385,
|
||||
[0x07af] 0x2015,
|
||||
[0x07b1] 0x03ac,
|
||||
[0x07b2] 0x03ad,
|
||||
[0x07b3] 0x03ae,
|
||||
[0x07b4] 0x03af,
|
||||
[0x07b5] 0x03ca,
|
||||
[0x07b6] 0x0390,
|
||||
[0x07b7] 0x03cc,
|
||||
[0x07b8] 0x03cd,
|
||||
[0x07b9] 0x03cb,
|
||||
[0x07ba] 0x03b0,
|
||||
[0x07bb] 0x03ce,
|
||||
[0x07c1] 0x0391,
|
||||
[0x07c2] 0x0392,
|
||||
[0x07c3] 0x0393,
|
||||
[0x07c4] 0x0394,
|
||||
[0x07c5] 0x0395,
|
||||
[0x07c6] 0x0396,
|
||||
[0x07c7] 0x0397,
|
||||
[0x07c8] 0x0398,
|
||||
[0x07c9] 0x0399,
|
||||
[0x07ca] 0x039a,
|
||||
[0x07cb] 0x039b,
|
||||
[0x07cc] 0x039c,
|
||||
[0x07cd] 0x039d,
|
||||
[0x07ce] 0x039e,
|
||||
[0x07cf] 0x039f,
|
||||
[0x07d0] 0x03a0,
|
||||
[0x07d1] 0x03a1,
|
||||
[0x07d2] 0x03a3,
|
||||
[0x07d4] 0x03a4,
|
||||
[0x07d5] 0x03a5,
|
||||
[0x07d6] 0x03a6,
|
||||
[0x07d7] 0x03a7,
|
||||
[0x07d8] 0x03a8,
|
||||
[0x07d9] 0x03a9,
|
||||
[0x07e1] 0x03b1,
|
||||
[0x07e2] 0x03b2,
|
||||
[0x07e3] 0x03b3,
|
||||
[0x07e4] 0x03b4,
|
||||
[0x07e5] 0x03b5,
|
||||
[0x07e6] 0x03b6,
|
||||
[0x07e7] 0x03b7,
|
||||
[0x07e8] 0x03b8,
|
||||
[0x07e9] 0x03b9,
|
||||
[0x07ea] 0x03ba,
|
||||
[0x07eb] 0x03bb,
|
||||
[0x07ec] 0x03bc,
|
||||
[0x07ed] 0x03bd,
|
||||
[0x07ee] 0x03be,
|
||||
[0x07ef] 0x03bf,
|
||||
[0x07f0] 0x03c0,
|
||||
[0x07f1] 0x03c1,
|
||||
[0x07f2] 0x03c3,
|
||||
[0x07f3] 0x03c2,
|
||||
[0x07f4] 0x03c4,
|
||||
[0x07f5] 0x03c5,
|
||||
[0x07f6] 0x03c6,
|
||||
[0x07f7] 0x03c7,
|
||||
[0x07f8] 0x03c8,
|
||||
[0x07f9] 0x03c9,
|
||||
[0x08a4] 0x2320,
|
||||
[0x08a5] 0x2321,
|
||||
[0x08a6] 0x2502,
|
||||
[0x08bc] 0x2264,
|
||||
[0x08bd] 0x2260,
|
||||
[0x08be] 0x2265,
|
||||
[0x08bf] 0x222b,
|
||||
[0x08c0] 0x2234,
|
||||
[0x08c1] 0x221d,
|
||||
[0x08c2] 0x221e,
|
||||
[0x08c5] 0x2207,
|
||||
[0x08c8] 0x2245,
|
||||
[0x08cd] 0x21d4,
|
||||
[0x08ce] 0x21d2,
|
||||
[0x08cf] 0x2261,
|
||||
[0x08d6] 0x221a,
|
||||
[0x08da] 0x2282,
|
||||
[0x08db] 0x2283,
|
||||
[0x08dc] 0x2229,
|
||||
[0x08dd] 0x222a,
|
||||
[0x08de] 0x2227,
|
||||
[0x08df] 0x2228,
|
||||
[0x08ef] 0x2202,
|
||||
[0x08f6] 0x0192,
|
||||
[0x08fb] 0x2190,
|
||||
[0x08fc] 0x2191,
|
||||
[0x08fd] 0x2192,
|
||||
[0x08fe] 0x2193,
|
||||
[0x09df] 0x2422,
|
||||
[0x09e0] 0x25c6,
|
||||
[0x09e1] 0x2592,
|
||||
[0x09e2] 0x2409,
|
||||
[0x09e3] 0x240c,
|
||||
[0x09e4] 0x240d,
|
||||
[0x09e5] 0x240a,
|
||||
[0x09e8] 0x2424,
|
||||
[0x09e9] 0x240b,
|
||||
[0x09ea] 0x2518,
|
||||
[0x09eb] 0x2510,
|
||||
[0x09ec] 0x250c,
|
||||
[0x09ed] 0x2514,
|
||||
[0x09ee] 0x253c,
|
||||
[0x09f1] 0x2500,
|
||||
[0x09f4] 0x251c,
|
||||
[0x09f5] 0x2524,
|
||||
[0x09f6] 0x2534,
|
||||
[0x09f7] 0x252c,
|
||||
[0x09f8] 0x2502,
|
||||
[0x0aa1] 0x2003,
|
||||
[0x0aa2] 0x2002,
|
||||
[0x0aa3] 0x2004,
|
||||
[0x0aa4] 0x2005,
|
||||
[0x0aa5] 0x2007,
|
||||
[0x0aa6] 0x2008,
|
||||
[0x0aa7] 0x2009,
|
||||
[0x0aa8] 0x200a,
|
||||
[0x0aa9] 0x2014,
|
||||
[0x0aaa] 0x2013,
|
||||
[0x0aae] 0x2026,
|
||||
[0x0ab0] 0x2153,
|
||||
[0x0ab1] 0x2154,
|
||||
[0x0ab2] 0x2155,
|
||||
[0x0ab3] 0x2156,
|
||||
[0x0ab4] 0x2157,
|
||||
[0x0ab5] 0x2158,
|
||||
[0x0ab6] 0x2159,
|
||||
[0x0ab7] 0x215a,
|
||||
[0x0ab8] 0x2105,
|
||||
[0x0abb] 0x2012,
|
||||
[0x0abc] 0x2329,
|
||||
[0x0abd] 0x002e,
|
||||
[0x0abe] 0x232a,
|
||||
[0x0ac3] 0x215b,
|
||||
[0x0ac4] 0x215c,
|
||||
[0x0ac5] 0x215d,
|
||||
[0x0ac6] 0x215e,
|
||||
[0x0ac9] 0x2122,
|
||||
[0x0aca] 0x2613,
|
||||
[0x0acc] 0x25c1,
|
||||
[0x0acd] 0x25b7,
|
||||
[0x0ace] 0x25cb,
|
||||
[0x0acf] 0x25a1,
|
||||
[0x0ad0] 0x2018,
|
||||
[0x0ad1] 0x2019,
|
||||
[0x0ad2] 0x201c,
|
||||
[0x0ad3] 0x201d,
|
||||
[0x0ad4] 0x211e,
|
||||
[0x0ad6] 0x2032,
|
||||
[0x0ad7] 0x2033,
|
||||
[0x0ad9] 0x271d,
|
||||
[0x0adb] 0x25ac,
|
||||
[0x0adc] 0x25c0,
|
||||
[0x0add] 0x25b6,
|
||||
[0x0ade] 0x25cf,
|
||||
[0x0adf] 0x25a0,
|
||||
[0x0ae0] 0x25e6,
|
||||
[0x0ae1] 0x25ab,
|
||||
[0x0ae2] 0x25ad,
|
||||
[0x0ae3] 0x25b3,
|
||||
[0x0ae4] 0x25bd,
|
||||
[0x0ae5] 0x2606,
|
||||
[0x0ae6] 0x2022,
|
||||
[0x0ae7] 0x25aa,
|
||||
[0x0ae8] 0x25b2,
|
||||
[0x0ae9] 0x25bc,
|
||||
[0x0aea] 0x261c,
|
||||
[0x0aeb] 0x261e,
|
||||
[0x0aec] 0x2663,
|
||||
[0x0aed] 0x2666,
|
||||
[0x0aee] 0x2665,
|
||||
[0x0af0] 0x2720,
|
||||
[0x0af1] 0x2020,
|
||||
[0x0af2] 0x2021,
|
||||
[0x0af3] 0x2713,
|
||||
[0x0af4] 0x2717,
|
||||
[0x0af5] 0x266f,
|
||||
[0x0af6] 0x266d,
|
||||
[0x0af7] 0x2642,
|
||||
[0x0af8] 0x2640,
|
||||
[0x0af9] 0x260e,
|
||||
[0x0afa] 0x2315,
|
||||
[0x0afb] 0x2117,
|
||||
[0x0afc] 0x2038,
|
||||
[0x0afd] 0x201a,
|
||||
[0x0afe] 0x201e,
|
||||
[0x0ba3] 0x003c,
|
||||
[0x0ba6] 0x003e,
|
||||
[0x0ba8] 0x2228,
|
||||
[0x0ba9] 0x2227,
|
||||
[0x0bc0] 0x00af,
|
||||
[0x0bc2] 0x22a4,
|
||||
[0x0bc3] 0x2229,
|
||||
[0x0bc4] 0x230a,
|
||||
[0x0bc6] 0x005f,
|
||||
[0x0bca] 0x2218,
|
||||
[0x0bcc] 0x2395,
|
||||
[0x0bce] 0x22a5,
|
||||
[0x0bcf] 0x25cb,
|
||||
[0x0bd3] 0x2308,
|
||||
[0x0bd6] 0x222a,
|
||||
[0x0bd8] 0x2283,
|
||||
[0x0bda] 0x2282,
|
||||
[0x0bdc] 0x22a3,
|
||||
[0x0bfc] 0x22a2,
|
||||
[0x0cdf] 0x2017,
|
||||
[0x0ce0] 0x05d0,
|
||||
[0x0ce1] 0x05d1,
|
||||
[0x0ce2] 0x05d2,
|
||||
[0x0ce3] 0x05d3,
|
||||
[0x0ce4] 0x05d4,
|
||||
[0x0ce5] 0x05d5,
|
||||
[0x0ce6] 0x05d6,
|
||||
[0x0ce7] 0x05d7,
|
||||
[0x0ce8] 0x05d8,
|
||||
[0x0ce9] 0x05d9,
|
||||
[0x0cea] 0x05da,
|
||||
[0x0ceb] 0x05db,
|
||||
[0x0cec] 0x05dc,
|
||||
[0x0ced] 0x05dd,
|
||||
[0x0cee] 0x05de,
|
||||
[0x0cef] 0x05df,
|
||||
[0x0cf0] 0x05e0,
|
||||
[0x0cf1] 0x05e1,
|
||||
[0x0cf2] 0x05e2,
|
||||
[0x0cf3] 0x05e3,
|
||||
[0x0cf4] 0x05e4,
|
||||
[0x0cf5] 0x05e5,
|
||||
[0x0cf6] 0x05e6,
|
||||
[0x0cf7] 0x05e7,
|
||||
[0x0cf8] 0x05e8,
|
||||
[0x0cf9] 0x05e9,
|
||||
[0x0cfa] 0x05ea,
|
||||
[0x0da1] 0x0e01,
|
||||
[0x0da2] 0x0e02,
|
||||
[0x0da3] 0x0e03,
|
||||
[0x0da4] 0x0e04,
|
||||
[0x0da5] 0x0e05,
|
||||
[0x0da6] 0x0e06,
|
||||
[0x0da7] 0x0e07,
|
||||
[0x0da8] 0x0e08,
|
||||
[0x0da9] 0x0e09,
|
||||
[0x0daa] 0x0e0a,
|
||||
[0x0dab] 0x0e0b,
|
||||
[0x0dac] 0x0e0c,
|
||||
[0x0dad] 0x0e0d,
|
||||
[0x0dae] 0x0e0e,
|
||||
[0x0daf] 0x0e0f,
|
||||
[0x0db0] 0x0e10,
|
||||
[0x0db1] 0x0e11,
|
||||
[0x0db2] 0x0e12,
|
||||
[0x0db3] 0x0e13,
|
||||
[0x0db4] 0x0e14,
|
||||
[0x0db5] 0x0e15,
|
||||
[0x0db6] 0x0e16,
|
||||
[0x0db7] 0x0e17,
|
||||
[0x0db8] 0x0e18,
|
||||
[0x0db9] 0x0e19,
|
||||
[0x0dba] 0x0e1a,
|
||||
[0x0dbb] 0x0e1b,
|
||||
[0x0dbc] 0x0e1c,
|
||||
[0x0dbd] 0x0e1d,
|
||||
[0x0dbe] 0x0e1e,
|
||||
[0x0dbf] 0x0e1f,
|
||||
[0x0dc0] 0x0e20,
|
||||
[0x0dc1] 0x0e21,
|
||||
[0x0dc2] 0x0e22,
|
||||
[0x0dc3] 0x0e23,
|
||||
[0x0dc4] 0x0e24,
|
||||
[0x0dc5] 0x0e25,
|
||||
[0x0dc6] 0x0e26,
|
||||
[0x0dc7] 0x0e27,
|
||||
[0x0dc8] 0x0e28,
|
||||
[0x0dc9] 0x0e29,
|
||||
[0x0dca] 0x0e2a,
|
||||
[0x0dcb] 0x0e2b,
|
||||
[0x0dcc] 0x0e2c,
|
||||
[0x0dcd] 0x0e2d,
|
||||
[0x0dce] 0x0e2e,
|
||||
[0x0dcf] 0x0e2f,
|
||||
[0x0dd0] 0x0e30,
|
||||
[0x0dd1] 0x0e31,
|
||||
[0x0dd2] 0x0e32,
|
||||
[0x0dd3] 0x0e33,
|
||||
[0x0dd4] 0x0e34,
|
||||
[0x0dd5] 0x0e35,
|
||||
[0x0dd6] 0x0e36,
|
||||
[0x0dd7] 0x0e37,
|
||||
[0x0dd8] 0x0e38,
|
||||
[0x0dd9] 0x0e39,
|
||||
[0x0dda] 0x0e3a,
|
||||
[0x0dde] 0x0e3e,
|
||||
[0x0ddf] 0x0e3f,
|
||||
[0x0de0] 0x0e40,
|
||||
[0x0de1] 0x0e41,
|
||||
[0x0de2] 0x0e42,
|
||||
[0x0de3] 0x0e43,
|
||||
[0x0de4] 0x0e44,
|
||||
[0x0de5] 0x0e45,
|
||||
[0x0de6] 0x0e46,
|
||||
[0x0de7] 0x0e47,
|
||||
[0x0de8] 0x0e48,
|
||||
[0x0de9] 0x0e49,
|
||||
[0x0dea] 0x0e4a,
|
||||
[0x0deb] 0x0e4b,
|
||||
[0x0dec] 0x0e4c,
|
||||
[0x0ded] 0x0e4d,
|
||||
[0x0df0] 0x0e50,
|
||||
[0x0df1] 0x0e51,
|
||||
[0x0df2] 0x0e52,
|
||||
[0x0df3] 0x0e53,
|
||||
[0x0df4] 0x0e54,
|
||||
[0x0df5] 0x0e55,
|
||||
[0x0df6] 0x0e56,
|
||||
[0x0df7] 0x0e57,
|
||||
[0x0df8] 0x0e58,
|
||||
[0x0df9] 0x0e59,
|
||||
[0x0ea1] 0x3131,
|
||||
[0x0ea2] 0x3132,
|
||||
[0x0ea3] 0x3133,
|
||||
[0x0ea4] 0x3134,
|
||||
[0x0ea5] 0x3135,
|
||||
[0x0ea6] 0x3136,
|
||||
[0x0ea7] 0x3137,
|
||||
[0x0ea8] 0x3138,
|
||||
[0x0ea9] 0x3139,
|
||||
[0x0eaa] 0x313a,
|
||||
[0x0eab] 0x313b,
|
||||
[0x0eac] 0x313c,
|
||||
[0x0ead] 0x313d,
|
||||
[0x0eae] 0x313e,
|
||||
[0x0eaf] 0x313f,
|
||||
[0x0eb0] 0x3140,
|
||||
[0x0eb1] 0x3141,
|
||||
[0x0eb2] 0x3142,
|
||||
[0x0eb3] 0x3143,
|
||||
[0x0eb4] 0x3144,
|
||||
[0x0eb5] 0x3145,
|
||||
[0x0eb6] 0x3146,
|
||||
[0x0eb7] 0x3147,
|
||||
[0x0eb8] 0x3148,
|
||||
[0x0eb9] 0x3149,
|
||||
[0x0eba] 0x314a,
|
||||
[0x0ebb] 0x314b,
|
||||
[0x0ebc] 0x314c,
|
||||
[0x0ebd] 0x314d,
|
||||
[0x0ebe] 0x314e,
|
||||
[0x0ebf] 0x314f,
|
||||
[0x0ec0] 0x3150,
|
||||
[0x0ec1] 0x3151,
|
||||
[0x0ec2] 0x3152,
|
||||
[0x0ec3] 0x3153,
|
||||
[0x0ec4] 0x3154,
|
||||
[0x0ec5] 0x3155,
|
||||
[0x0ec6] 0x3156,
|
||||
[0x0ec7] 0x3157,
|
||||
[0x0ec8] 0x3158,
|
||||
[0x0ec9] 0x3159,
|
||||
[0x0eca] 0x315a,
|
||||
[0x0ecb] 0x315b,
|
||||
[0x0ecc] 0x315c,
|
||||
[0x0ecd] 0x315d,
|
||||
[0x0ece] 0x315e,
|
||||
[0x0ecf] 0x315f,
|
||||
[0x0ed0] 0x3160,
|
||||
[0x0ed1] 0x3161,
|
||||
[0x0ed2] 0x3162,
|
||||
[0x0ed3] 0x3163,
|
||||
[0x0ed4] 0x11a8,
|
||||
[0x0ed5] 0x11a9,
|
||||
[0x0ed6] 0x11aa,
|
||||
[0x0ed7] 0x11ab,
|
||||
[0x0ed8] 0x11ac,
|
||||
[0x0ed9] 0x11ad,
|
||||
[0x0eda] 0x11ae,
|
||||
[0x0edb] 0x11af,
|
||||
[0x0edc] 0x11b0,
|
||||
[0x0edd] 0x11b1,
|
||||
[0x0ede] 0x11b2,
|
||||
[0x0edf] 0x11b3,
|
||||
[0x0ee0] 0x11b4,
|
||||
[0x0ee1] 0x11b5,
|
||||
[0x0ee2] 0x11b6,
|
||||
[0x0ee3] 0x11b7,
|
||||
[0x0ee4] 0x11b8,
|
||||
[0x0ee5] 0x11b9,
|
||||
[0x0ee6] 0x11ba,
|
||||
[0x0ee7] 0x11bb,
|
||||
[0x0ee8] 0x11bc,
|
||||
[0x0ee9] 0x11bd,
|
||||
[0x0eea] 0x11be,
|
||||
[0x0eeb] 0x11bf,
|
||||
[0x0eec] 0x11c0,
|
||||
[0x0eed] 0x11c1,
|
||||
[0x0eee] 0x11c2,
|
||||
[0x0eef] 0x316d,
|
||||
[0x0ef0] 0x3171,
|
||||
[0x0ef1] 0x3178,
|
||||
[0x0ef2] 0x317f,
|
||||
[0x0ef4] 0x3184,
|
||||
[0x0ef5] 0x3186,
|
||||
[0x0ef6] 0x318d,
|
||||
[0x0ef7] 0x318e,
|
||||
[0x0ef8] 0x11eb,
|
||||
[0x0efa] 0x11f9,
|
||||
[0x0eff] 0x20a9,
|
||||
[0x13bc] 0x0152,
|
||||
[0x13bd] 0x0153,
|
||||
[0x13be] 0x0178,
|
||||
[0x20a0] 0x20a0,
|
||||
[0x20a1] 0x20a1,
|
||||
[0x20a2] 0x20a2,
|
||||
[0x20a3] 0x20a3,
|
||||
[0x20a4] 0x20a4,
|
||||
[0x20a5] 0x20a5,
|
||||
[0x20a6] 0x20a6,
|
||||
[0x20a7] 0x20a7,
|
||||
[0x20a8] 0x20a8,
|
||||
[0x20a9] 0x20a9,
|
||||
[0x20aa] 0x20aa,
|
||||
[0x20ab] 0x20ab,
|
||||
[0x20ac] 0x20ac,
|
||||
};
|
|
@ -1,16 +0,0 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <draw.h>
|
||||
#include <memdraw.h>
|
||||
#include "xmem.h"
|
||||
|
||||
int
|
||||
loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = _loadmemimage(i, r, data, ndata);
|
||||
if(n > 0 && i->X)
|
||||
putXdata(i, r);
|
||||
return n;
|
||||
}
|
|
@ -1,110 +1,547 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <termios.h>
|
||||
#include <stdio.h>
|
||||
#include "u.h"
|
||||
#include "lib.h"
|
||||
#include "dat.h"
|
||||
#include "fns.h"
|
||||
#include "error.h"
|
||||
|
||||
#include <draw.h>
|
||||
#include <memdraw.h>
|
||||
#include <keyboard.h>
|
||||
#include <cursor.h>
|
||||
#include "screen.h"
|
||||
|
||||
#define argv0 "drawterm"
|
||||
|
||||
typedef struct Cursor Cursor;
|
||||
|
||||
#define Font XFont
|
||||
#define Screen XScreen
|
||||
#define Display XDisplay
|
||||
#define Cursor XCursor
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/IntrinsicP.h>
|
||||
#include <X11/StringDefs.h>
|
||||
#include <X11/keysym.h>
|
||||
|
||||
#include "keysym2ucs.h"
|
||||
#include "glenda.xbm"
|
||||
|
||||
/*
|
||||
* alias defs for image types to overcome name conflicts
|
||||
*/
|
||||
#define Point IPoint
|
||||
#define Rectangle IRectangle
|
||||
#define Display IDisplay
|
||||
#define Font IFont
|
||||
#define Screen IScreen
|
||||
#undef Font
|
||||
#undef Screen
|
||||
#undef Display
|
||||
#undef Cursor
|
||||
|
||||
#include "u.h"
|
||||
#include "lib.h"
|
||||
#include "dat.h"
|
||||
#include "fns.h"
|
||||
#include "user.h"
|
||||
#include "draw.h"
|
||||
#include "memdraw.h"
|
||||
#include "keyboard.h"
|
||||
#include "screen.h"
|
||||
|
||||
#undef time
|
||||
#undef Point
|
||||
#undef Rectangle
|
||||
#undef Display
|
||||
#undef Font
|
||||
#undef Screen
|
||||
|
||||
typedef struct ICursor ICursor;
|
||||
struct ICursor
|
||||
{
|
||||
int w;
|
||||
int h;
|
||||
int hotx;
|
||||
int hoty;
|
||||
char *src;
|
||||
char *mask;
|
||||
};
|
||||
|
||||
|
||||
#define ABS(x) ((x) < 0 ? -(x) : (x))
|
||||
/* perfect approximation to NTSC = .299r+.587g+.114b when 0 ≤ r,g,b < 256 */
|
||||
#define RGB2K(r,g,b) ((156763*(r)+307758*(g)+59769*(b))>>19)
|
||||
|
||||
enum
|
||||
{
|
||||
DblTime = 300 /* double click time in msec */
|
||||
PMundef = ~0 /* undefined pixmap id */
|
||||
};
|
||||
|
||||
XColor map[256]; /* Plan 9 colormap array */
|
||||
XColor map7[128]; /* Plan 9 colormap array */
|
||||
uchar map7to8[128][2];
|
||||
Colormap xcmap; /* Default shared colormap */
|
||||
int plan9tox11[256]; /* Values for mapping between */
|
||||
int x11toplan9[256]; /* X11 and Plan 9 */
|
||||
int x24bitswap = 0; /* swap endian for 24bit RGB */
|
||||
int xtblbit;
|
||||
/*
|
||||
* Structure pointed to by X field of Memimage
|
||||
*/
|
||||
typedef struct Xmem Xmem;
|
||||
struct Xmem
|
||||
{
|
||||
int pmid; /* pixmap id for screen ldepth instance */
|
||||
XImage *xi; /* local image if we currenty have the data */
|
||||
int dirty;
|
||||
Rectangle dirtyr;
|
||||
Rectangle r;
|
||||
uintptr pc; /* who wrote into xi */
|
||||
};
|
||||
|
||||
static int xgcfillcolor;
|
||||
static int xgcfillcolor0;
|
||||
static int xgcsimplecolor0;
|
||||
static int xgcsimplepm0;
|
||||
|
||||
static XDisplay* xdisplay; /* used holding draw lock */
|
||||
static int xtblbit;
|
||||
static int plan9tox11[256]; /* Values for mapping between */
|
||||
static int x11toplan9[256]; /* X11 and Plan 9 */
|
||||
static GC xgcfill, xgccopy, xgcsimplesrc, xgczero, xgcreplsrc;
|
||||
static GC xgcfill0, xgccopy0, xgcsimplesrc0, xgczero0, xgcreplsrc0;
|
||||
static ulong xscreenchan;
|
||||
static Drawable xscreenid;
|
||||
static Visual *xvis;
|
||||
|
||||
static int xdraw(Memdrawparam*);
|
||||
|
||||
#define glenda_width 48
|
||||
#define glenda_height 48
|
||||
static unsigned short glenda_bits[] = {
|
||||
0xffff, 0xffff, 0xffff, 0xffff, 0xffe9, 0xffff, 0x7fff, 0xffae, 0xffff,
|
||||
0xffff, 0xffbe, 0xffff, 0x1fff, 0xff3f, 0xffff, 0xbfff, 0xfe6e, 0xffff,
|
||||
0xbbff, 0xfcce, 0xffff, 0xffff, 0xf98c, 0xffff, 0xe5ff, 0xf31b, 0xffff,
|
||||
0x87ff, 0xe617, 0xffff, 0x05ff, 0xdf37, 0xffff, 0x0fff, 0x7ffe, 0xffff,
|
||||
0x1bff, 0xfffc, 0xfffa, 0x37ff, 0xfffc, 0xfffb, 0xd7ff, 0xfffc, 0xfff7,
|
||||
0xcfff, 0xffff, 0xfff7, 0xcfff, 0xffff, 0xffef, 0xdfff, 0xffff, 0xffef,
|
||||
0xafff, 0xffff, 0xffdf, 0xefff, 0xffff, 0xfff3, 0xdfff, 0xefff, 0xffd3,
|
||||
0xdfff, 0xc7ff, 0xffdf, 0xefff, 0xefff, 0xffef, 0xcfff, 0xffff, 0xffcf,
|
||||
0xdfff, 0xffff, 0xffd9, 0x9fff, 0x7fff, 0xffd0, 0xbfff, 0xffff, 0xffd7,
|
||||
0x7fff, 0xbfff, 0xffd0, 0x3fff, 0x3fff, 0xffd9, 0x7fff, 0x3fff, 0xffcb,
|
||||
0x3fff, 0xffff, 0xffdc, 0x3fff, 0xffff, 0xffdf, 0x3fff, 0xffff, 0xff9f,
|
||||
0x3fff, 0xffff, 0xffdf, 0x8fff, 0xffff, 0xff9f, 0xa7ff, 0xffff, 0xffdf,
|
||||
0xe3ff, 0xffff, 0xffcf, 0xe9ff, 0xffff, 0xffcf, 0xf1ff, 0xffff, 0xffef,
|
||||
0xf3ff, 0xffff, 0xffe7, 0xf9ff, 0xffff, 0xffe7, 0x53ff, 0xffff, 0xffe1,
|
||||
0x07ff, 0x7ffc, 0xffc6, 0x17ff, 0xeff0, 0xffee, 0xffff, 0xc781, 0xffe5,
|
||||
0xffff, 0x8807, 0xffe0, 0xffff, 0x003f, 0xfff0, 0xffff, 0x1fff, 0xfffe
|
||||
};
|
||||
|
||||
/*
|
||||
* Synchronize images between X bitmaps and in-memory bitmaps.
|
||||
*/
|
||||
static void
|
||||
addrect(Rectangle *rp, Rectangle r)
|
||||
{
|
||||
if(rp->min.x >= rp->max.x)
|
||||
*rp = r;
|
||||
else
|
||||
combinerect(rp, r);
|
||||
}
|
||||
|
||||
static XImage*
|
||||
getXdata(Memimage *m, Rectangle r)
|
||||
{
|
||||
uchar *p;
|
||||
int x, y;
|
||||
Xmem *xm;
|
||||
Point xdelta, delta;
|
||||
Point tp;
|
||||
|
||||
xm = m->X;
|
||||
if(xm == nil)
|
||||
return nil;
|
||||
|
||||
assert(xm != nil && xm->xi != nil);
|
||||
|
||||
if(xm->dirty == 0)
|
||||
return xm->xi;
|
||||
|
||||
r = xm->dirtyr;
|
||||
if(Dx(r)==0 || Dy(r)==0)
|
||||
return xm->xi;
|
||||
|
||||
delta = subpt(r.min, m->r.min);
|
||||
tp = xm->r.min; /* avoid unaligned access on digital unix */
|
||||
xdelta = subpt(r.min, tp);
|
||||
|
||||
XGetSubImage(xdisplay, xm->pmid, delta.x, delta.y, Dx(r), Dy(r),
|
||||
AllPlanes, ZPixmap, xm->xi, xdelta.x, xdelta.y);
|
||||
|
||||
if(xtblbit && m->chan == CMAP8)
|
||||
for(y=r.min.y; y<r.max.y; y++)
|
||||
for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
|
||||
*p = x11toplan9[*p];
|
||||
|
||||
xm->dirty = 0;
|
||||
xm->dirtyr = Rect(0,0,0,0);
|
||||
return xm->xi;
|
||||
}
|
||||
|
||||
static void
|
||||
putXdata(Memimage *m, Rectangle r)
|
||||
{
|
||||
Xmem *xm;
|
||||
XImage *xi;
|
||||
GC g;
|
||||
Point xdelta, delta;
|
||||
Point tp;
|
||||
int x, y;
|
||||
uchar *p;
|
||||
|
||||
xm = m->X;
|
||||
if(xm == nil)
|
||||
return;
|
||||
|
||||
assert(xm != nil);
|
||||
assert(xm->xi != nil);
|
||||
|
||||
xi = xm->xi;
|
||||
|
||||
g = (m->chan == GREY1) ? xgccopy0 : xgccopy;
|
||||
|
||||
delta = subpt(r.min, m->r.min);
|
||||
tp = xm->r.min; /* avoid unaligned access on digital unix */
|
||||
xdelta = subpt(r.min, tp);
|
||||
|
||||
if(xtblbit && m->chan == CMAP8)
|
||||
for(y=r.min.y; y<r.max.y; y++)
|
||||
for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
|
||||
*p = plan9tox11[*p];
|
||||
|
||||
XPutImage(xdisplay, xm->pmid, g, xi, xdelta.x, xdelta.y, delta.x, delta.y, Dx(r), Dy(r));
|
||||
|
||||
if(xtblbit && m->chan == CMAP8)
|
||||
for(y=r.min.y; y<r.max.y; y++)
|
||||
for(x=r.min.x, p=byteaddr(m, Pt(x,y)); x<r.max.x; x++, p++)
|
||||
*p = x11toplan9[*p];
|
||||
}
|
||||
|
||||
static void
|
||||
dirtyXdata(Memimage *m, Rectangle r)
|
||||
{
|
||||
Xmem *xm;
|
||||
|
||||
if((xm = m->X) != nil){
|
||||
xm->dirty = 1;
|
||||
addrect(&xm->dirtyr, r);
|
||||
}
|
||||
}
|
||||
|
||||
Memimage*
|
||||
xallocmemimage(Rectangle r, ulong chan, int pmid)
|
||||
{
|
||||
Memimage *m;
|
||||
Xmem *xm;
|
||||
XImage *xi;
|
||||
int offset;
|
||||
int d;
|
||||
|
||||
m = _allocmemimage(r, chan);
|
||||
if(m == nil)
|
||||
return nil;
|
||||
if(chan != GREY1 && chan != xscreenchan)
|
||||
return m;
|
||||
|
||||
d = m->depth;
|
||||
xm = mallocz(sizeof(Xmem), 1);
|
||||
if(pmid != PMundef)
|
||||
xm->pmid = pmid;
|
||||
else
|
||||
xm->pmid = XCreatePixmap(xdisplay, xscreenid, Dx(r), Dy(r), (d==32) ? 24 : d);
|
||||
|
||||
if(m->depth == 24)
|
||||
offset = r.min.x&(4-1);
|
||||
else
|
||||
offset = r.min.x&(31/m->depth);
|
||||
r.min.x -= offset;
|
||||
|
||||
assert(wordsperline(r, m->depth) <= m->width);
|
||||
|
||||
xi = XCreateImage(xdisplay, xvis, m->depth==32?24:m->depth, ZPixmap, 0,
|
||||
(char*)m->data->bdata, Dx(r), Dy(r), 32, m->width*sizeof(ulong));
|
||||
|
||||
if(xi == nil){
|
||||
_freememimage(m);
|
||||
return nil;
|
||||
}
|
||||
|
||||
xm->xi = xi;
|
||||
xm->pc = getcallerpc(&r);
|
||||
xm->r = r;
|
||||
|
||||
/*
|
||||
* Set the parameters of the XImage so its memory looks exactly like a
|
||||
* Memimage, so we can call _memimagedraw on the same data. All frame
|
||||
* buffers we've seen, and Plan 9's graphics code, require big-endian
|
||||
* bits within bytes, but little endian byte order within pixels.
|
||||
*/
|
||||
xi->bitmap_unit = m->depth < 8 || m->depth == 24 ? 8 : m->depth;
|
||||
xi->byte_order = LSBFirst;
|
||||
xi->bitmap_bit_order = MSBFirst;
|
||||
xi->bitmap_pad = 32;
|
||||
xm->r = Rect(0,0,0,0);
|
||||
XInitImage(xi);
|
||||
XFlush(xdisplay);
|
||||
|
||||
m->X = xm;
|
||||
return m;
|
||||
}
|
||||
|
||||
void
|
||||
xfillcolor(Memimage *m, Rectangle r, ulong v)
|
||||
{
|
||||
GC gc;
|
||||
Xmem *dxm;
|
||||
|
||||
dxm = m->X;
|
||||
assert(dxm != nil);
|
||||
r = rectsubpt(r, m->r.min);
|
||||
|
||||
if(m->chan == GREY1){
|
||||
gc = xgcfill0;
|
||||
if(xgcfillcolor0 != v){
|
||||
XSetForeground(xdisplay, gc, v);
|
||||
xgcfillcolor0 = v;
|
||||
}
|
||||
}else{
|
||||
if(m->chan == CMAP8 && xtblbit)
|
||||
v = plan9tox11[v];
|
||||
|
||||
gc = xgcfill;
|
||||
if(xgcfillcolor != v){
|
||||
XSetForeground(xdisplay, gc, v);
|
||||
xgcfillcolor = v;
|
||||
}
|
||||
}
|
||||
XFillRectangle(xdisplay, dxm->pmid, gc, r.min.x, r.min.y, Dx(r), Dy(r));
|
||||
}
|
||||
|
||||
/*
|
||||
* Replacements for libmemdraw routines.
|
||||
* (They've been underscored.)
|
||||
*/
|
||||
Memimage*
|
||||
allocmemimage(Rectangle r, ulong chan)
|
||||
{
|
||||
return xallocmemimage(r, chan, PMundef);
|
||||
}
|
||||
|
||||
void
|
||||
freememimage(Memimage *m)
|
||||
{
|
||||
Xmem *xm;
|
||||
|
||||
if(m == nil)
|
||||
return;
|
||||
|
||||
if(m->data->ref == 1){
|
||||
if((xm = m->X) != nil){
|
||||
if(xm->xi){
|
||||
xm->xi->data = nil;
|
||||
XFree(xm->xi);
|
||||
}
|
||||
XFreePixmap(xdisplay, xm->pmid);
|
||||
free(xm);
|
||||
m->X = nil;
|
||||
}
|
||||
}
|
||||
_freememimage(m);
|
||||
}
|
||||
|
||||
void
|
||||
memfillcolor(Memimage *m, ulong val)
|
||||
{
|
||||
_memfillcolor(m, val);
|
||||
if(m->X){
|
||||
if((val & 0xFF) == 0xFF)
|
||||
xfillcolor(m, m->r, _rgbatoimg(m, val));
|
||||
else
|
||||
putXdata(m, m->r);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = _loadmemimage(i, r, data, ndata);
|
||||
if(n > 0 && i->X)
|
||||
putXdata(i, r);
|
||||
return n;
|
||||
}
|
||||
|
||||
int
|
||||
cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = _cloadmemimage(i, r, data, ndata);
|
||||
if(n > 0 && i->X)
|
||||
putXdata(i, r);
|
||||
return n;
|
||||
}
|
||||
|
||||
ulong
|
||||
pixelbits(Memimage *m, Point p)
|
||||
{
|
||||
if(m->X)
|
||||
getXdata(m, Rect(p.x, p.y, p.x+1, p.y+1));
|
||||
return _pixelbits(m, p);
|
||||
}
|
||||
|
||||
void
|
||||
memimageinit(void)
|
||||
{
|
||||
static int didinit = 0;
|
||||
|
||||
if(didinit)
|
||||
return;
|
||||
|
||||
didinit = 1;
|
||||
_memimageinit();
|
||||
|
||||
xfillcolor(memblack, memblack->r, 0);
|
||||
xfillcolor(memwhite, memwhite->r, 1);
|
||||
}
|
||||
|
||||
void
|
||||
memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point sp, Memimage *mask, Point mp, int op)
|
||||
{
|
||||
Memdrawparam *par;
|
||||
|
||||
if((par = _memimagedrawsetup(dst, r, src, sp, mask, mp, op)) == nil)
|
||||
return;
|
||||
_memimagedraw(par);
|
||||
if(!xdraw(par))
|
||||
putXdata(dst, par->r);
|
||||
}
|
||||
|
||||
static int
|
||||
xdraw(Memdrawparam *par)
|
||||
{
|
||||
int dy, dx;
|
||||
unsigned m;
|
||||
Memimage *src, *dst, *mask;
|
||||
Xmem *dxm, *sxm, *mxm;
|
||||
GC gc;
|
||||
Rectangle r, sr, mr;
|
||||
ulong sdval;
|
||||
|
||||
dx = Dx(par->r);
|
||||
dy = Dy(par->r);
|
||||
src = par->src;
|
||||
dst = par->dst;
|
||||
mask = par->mask;
|
||||
r = par->r;
|
||||
sr = par->sr;
|
||||
mr = par->mr;
|
||||
sdval = par->sdval;
|
||||
|
||||
/*
|
||||
* drawterm was distributed for years with
|
||||
* "return 0;" right here.
|
||||
* maybe we should give up on all this?
|
||||
*/
|
||||
|
||||
if((dxm = dst->X) == nil)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If we have an opaque mask and source is one opaque pixel we can convert to the
|
||||
* destination format and just XFillRectangle.
|
||||
*/
|
||||
m = Simplesrc|Simplemask|Fullmask;
|
||||
if((par->state&m)==m){
|
||||
xfillcolor(dst, r, sdval);
|
||||
dirtyXdata(dst, par->r);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If no source alpha, an opaque mask, we can just copy the
|
||||
* source onto the destination. If the channels are the same and
|
||||
* the source is not replicated, XCopyArea suffices.
|
||||
*/
|
||||
m = Simplemask|Fullmask;
|
||||
if((par->state&(m|Replsrc))==m && src->chan == dst->chan && src->X){
|
||||
sxm = src->X;
|
||||
r = rectsubpt(r, dst->r.min);
|
||||
sr = rectsubpt(sr, src->r.min);
|
||||
if(dst->chan == GREY1)
|
||||
gc = xgccopy0;
|
||||
else
|
||||
gc = xgccopy;
|
||||
XCopyArea(xdisplay, sxm->pmid, dxm->pmid, gc,
|
||||
sr.min.x, sr.min.y, dx, dy, r.min.x, r.min.y);
|
||||
dirtyXdata(dst, par->r);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If no source alpha, a 1-bit mask, and a simple source
|
||||
* we can just copy through the mask onto the destination.
|
||||
*/
|
||||
if(dst->X && mask->X && !(mask->flags&Frepl)
|
||||
&& mask->chan == GREY1 && (par->state&Simplesrc)){
|
||||
Point p;
|
||||
|
||||
mxm = mask->X;
|
||||
r = rectsubpt(r, dst->r.min);
|
||||
mr = rectsubpt(mr, mask->r.min);
|
||||
p = subpt(r.min, mr.min);
|
||||
if(dst->chan == GREY1){
|
||||
gc = xgcsimplesrc0;
|
||||
if(xgcsimplecolor0 != sdval){
|
||||
XSetForeground(xdisplay, gc, sdval);
|
||||
xgcsimplecolor0 = sdval;
|
||||
}
|
||||
if(xgcsimplepm0 != mxm->pmid){
|
||||
XSetStipple(xdisplay, gc, mxm->pmid);
|
||||
xgcsimplepm0 = mxm->pmid;
|
||||
}
|
||||
}else{
|
||||
/* somehow this doesn't work on rob's mac
|
||||
gc = xgcsimplesrc;
|
||||
if(dst->chan == CMAP8 && xtblbit)
|
||||
sdval = plan9tox11[sdval];
|
||||
|
||||
if(xgcsimplecolor != sdval){
|
||||
XSetForeground(xdisplay, gc, sdval);
|
||||
xgcsimplecolor = sdval;
|
||||
}
|
||||
if(xgcsimplepm != mxm->pmid){
|
||||
XSetStipple(xdisplay, gc, mxm->pmid);
|
||||
xgcsimplepm = mxm->pmid;
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
XSetTSOrigin(xdisplay, gc, p.x, p.y);
|
||||
XFillRectangle(xdisplay, dxm->pmid, gc, r.min.x, r.min.y, dx, dy);
|
||||
dirtyXdata(dst, par->r);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* X11 window management and kernel hooks.
|
||||
* Oh, how I loathe this code!
|
||||
*/
|
||||
|
||||
static XColor map[256]; /* Plan 9 colormap array */
|
||||
static XColor map7[128]; /* Plan 9 colormap array */
|
||||
static uchar map7to8[128][2];
|
||||
static Colormap xcmap; /* Default shared colormap */
|
||||
|
||||
extern int mousequeue;
|
||||
|
||||
/* for copy/paste, lifted from plan9ports */
|
||||
Atom clipboard;
|
||||
Atom utf8string;
|
||||
Atom targets;
|
||||
Atom text;
|
||||
Atom compoundtext;
|
||||
static Atom clipboard;
|
||||
static Atom utf8string;
|
||||
static Atom targets;
|
||||
static Atom text;
|
||||
static Atom compoundtext;
|
||||
|
||||
static Drawable xdrawable;
|
||||
/* static Atom wm_take_focus; */
|
||||
static void xexpose(XEvent*);
|
||||
static void xmouse(XEvent*);
|
||||
static void xkeyboard(XEvent*);
|
||||
static void xmapping(XEvent*);
|
||||
static void xdestroy(XEvent*);
|
||||
static void xselect(XEvent*, Display*);
|
||||
static void xselect(XEvent*, XDisplay*);
|
||||
static void xproc(void*);
|
||||
static Memimage* xinitscreen(void);
|
||||
static void initmap(Window);
|
||||
static GC creategc(Drawable);
|
||||
static void graphicscmap(XColor*);
|
||||
int xscreendepth;
|
||||
Drawable xscreenid;
|
||||
Display* xdisplay; /* used holding draw lock */
|
||||
Display* xkmcon; /* used only in xproc */
|
||||
Display* xsnarfcon; /* used holding clip.lk */
|
||||
Visual *xvis;
|
||||
GC xgcfill, xgccopy, xgcsimplesrc, xgczero, xgcreplsrc;
|
||||
GC xgcfill0, xgccopy0, xgcsimplesrc0, xgczero0, xgcreplsrc0;
|
||||
ulong xblack;
|
||||
ulong xwhite;
|
||||
ulong xscreenchan;
|
||||
static int xscreendepth;
|
||||
static XDisplay* xkmcon; /* used only in xproc */
|
||||
static XDisplay* xsnarfcon; /* used holding clip.lk */
|
||||
static ulong xblack;
|
||||
static ulong xwhite;
|
||||
|
||||
static int putsnarf, assertsnarf;
|
||||
static int putsnarf, assertsnarf;
|
||||
|
||||
extern Memimage* xallocmemimage(IRectangle, ulong, int);
|
||||
Memimage *gscreen;
|
||||
Screeninfo screen;
|
||||
XImage *ximage;
|
||||
Memimage *gscreen;
|
||||
Screeninfo screen;
|
||||
|
||||
void
|
||||
flushmemscreen(Rectangle r)
|
||||
{
|
||||
assert(!drawcanqlock());
|
||||
if(r.min.x >= r.max.x || r.min.y >= r.max.y)
|
||||
return;
|
||||
XCopyArea(xdisplay, xscreenid, xdrawable, xgccopy, r.min.x, r.min.y, Dx(r), Dy(r), r.min.x, r.min.y);
|
||||
XFlush(xdisplay);
|
||||
}
|
||||
|
||||
void
|
||||
screeninit(void)
|
||||
|
@ -122,7 +559,7 @@ screeninit(void)
|
|||
}
|
||||
|
||||
uchar*
|
||||
attachscreen(IRectangle *r, ulong *chan, int *depth,
|
||||
attachscreen(Rectangle *r, ulong *chan, int *depth,
|
||||
int *width, int *softscreen, void **X)
|
||||
{
|
||||
*r = gscreen->r;
|
||||
|
@ -135,16 +572,6 @@ attachscreen(IRectangle *r, ulong *chan, int *depth,
|
|||
return gscreen->data->bdata;
|
||||
}
|
||||
|
||||
void
|
||||
flushmemscreen(IRectangle r)
|
||||
{
|
||||
assert(!drawcanqlock());
|
||||
if(r.min.x >= r.max.x || r.min.y >= r.max.y)
|
||||
return;
|
||||
XCopyArea(xdisplay, xscreenid, xdrawable, xgccopy, r.min.x, r.min.y, Dx(r), Dy(r), r.min.x, r.min.y);
|
||||
XFlush(xdisplay);
|
||||
}
|
||||
|
||||
static int
|
||||
revbyte(int b)
|
||||
{
|
||||
|
@ -163,7 +590,7 @@ revbyte(int b)
|
|||
}
|
||||
|
||||
void
|
||||
mouseset(IPoint xy)
|
||||
mouseset(Point xy)
|
||||
{
|
||||
drawqlock();
|
||||
XWarpPointer(xdisplay, None, xdrawable, 0, 0, 0, 0, xy.x, xy.y);
|
||||
|
@ -171,12 +598,12 @@ mouseset(IPoint xy)
|
|||
drawqunlock();
|
||||
}
|
||||
|
||||
static Cursor xcursor;
|
||||
static XCursor xcursor;
|
||||
|
||||
void
|
||||
setcursor(void)
|
||||
{
|
||||
Cursor xc;
|
||||
XCursor xc;
|
||||
XColor fg, bg;
|
||||
Pixmap xsrc, xmask;
|
||||
int i;
|
||||
|
@ -250,7 +677,7 @@ xproc(void *arg)
|
|||
}
|
||||
|
||||
static int
|
||||
shutup(Display *d, XErrorEvent *e)
|
||||
shutup(XDisplay *d, XErrorEvent *e)
|
||||
{
|
||||
char buf[200];
|
||||
iprint("X error: error code=%d, request_code=%d, minor=%d\n", e->error_code, e->request_code, e->minor_code);
|
||||
|
@ -262,7 +689,7 @@ shutup(Display *d, XErrorEvent *e)
|
|||
}
|
||||
|
||||
static int
|
||||
panicshutup(Display *d)
|
||||
panicshutup(XDisplay *d)
|
||||
{
|
||||
panic("x error");
|
||||
return -1;
|
||||
|
@ -276,9 +703,9 @@ xinitscreen(void)
|
|||
char *argv[2];
|
||||
char *disp_val;
|
||||
Window rootwin;
|
||||
IRectangle r;
|
||||
Rectangle r;
|
||||
XWMHints hints;
|
||||
Screen *screen;
|
||||
XScreen *screen;
|
||||
XVisualInfo xvi;
|
||||
int rootscreennum;
|
||||
XTextProperty name;
|
||||
|
@ -287,20 +714,15 @@ xinitscreen(void)
|
|||
XSetWindowAttributes attrs;
|
||||
XPixmapFormatValues *pfmt;
|
||||
int n;
|
||||
|
||||
/* pixmap used to store the icon's image. */
|
||||
Pixmap icon_pixmap;
|
||||
|
||||
|
||||
xscreenid = 0;
|
||||
xdrawable = 0;
|
||||
|
||||
xdisplay = XOpenDisplay(NULL);
|
||||
if(xdisplay == 0){
|
||||
disp_val = getenv("DISPLAY");
|
||||
if(disp_val == 0)
|
||||
disp_val = "not set";
|
||||
iprint("drawterm: open %r, DISPLAY is %s\n", disp_val);
|
||||
iprint("xinitscreen: XOpenDisplay: %r [DISPLAY=%s]\n",
|
||||
getenv("DISPLAY"));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -380,12 +802,10 @@ xinitscreen(void)
|
|||
initmap(rootwin);
|
||||
}
|
||||
|
||||
|
||||
r.min = ZP;
|
||||
r.max.x = WidthOfScreen(screen);
|
||||
r.max.y = HeightOfScreen(screen);
|
||||
|
||||
|
||||
xsize = Dx(r)*3/4;
|
||||
ysize = Dy(r)*3/4;
|
||||
|
||||
|
@ -398,8 +818,8 @@ xinitscreen(void)
|
|||
|
||||
/* load the given bitmap data and create an X pixmap containing it. */
|
||||
icon_pixmap = XCreateBitmapFromData(xdisplay,
|
||||
rootwin, (char *)icon_bitmap_bits,
|
||||
icon_bitmap_width, icon_bitmap_height);
|
||||
rootwin, (char *)glenda_bits,
|
||||
glenda_width, glenda_height);
|
||||
|
||||
/*
|
||||
* set up property as required by ICCCM
|
||||
|
@ -672,7 +1092,7 @@ creategc(Drawable d)
|
|||
static void
|
||||
xexpose(XEvent *e)
|
||||
{
|
||||
IRectangle r;
|
||||
Rectangle r;
|
||||
XExposeEvent *xe;
|
||||
|
||||
if(e->type != Expose)
|
||||
|
@ -999,11 +1419,12 @@ Clip clip;
|
|||
#undef ulong
|
||||
|
||||
static char*
|
||||
_xgetsnarf(Display *xd)
|
||||
_xgetsnarf(XDisplay *xd)
|
||||
{
|
||||
uchar *data, *xdata;
|
||||
Atom clipboard, type, prop;
|
||||
unsigned long len, lastlen, dummy;
|
||||
unsigned long lastlen;
|
||||
uint dummy, len;
|
||||
int fmt, i;
|
||||
Window w;
|
||||
|
||||
|
@ -1090,7 +1511,7 @@ out:
|
|||
}
|
||||
|
||||
static void
|
||||
_xputsnarf(Display *xd, char *data)
|
||||
_xputsnarf(XDisplay *xd, char *data)
|
||||
{
|
||||
XButtonEvent e;
|
||||
|
||||
|
@ -1114,7 +1535,7 @@ _xputsnarf(Display *xd, char *data)
|
|||
}
|
||||
|
||||
static void
|
||||
xselect(XEvent *e, Display *xd)
|
||||
xselect(XEvent *e, XDisplay *xd)
|
||||
{
|
||||
char *name;
|
||||
XEvent r;
|
|
@ -1,60 +0,0 @@
|
|||
#define Font XXFont
|
||||
#define Screen XXScreen
|
||||
#define Display XXDisplay
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
/* #include <X11/Xlibint.h> */
|
||||
#include <X11/Xatom.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/IntrinsicP.h>
|
||||
#include <X11/StringDefs.h>
|
||||
|
||||
#undef Font
|
||||
#undef Screen
|
||||
#undef Display
|
||||
|
||||
/*
|
||||
* Structure pointed to by X field of Memimage
|
||||
*/
|
||||
typedef struct Xmem Xmem;
|
||||
|
||||
enum
|
||||
{
|
||||
PMundef = ~0 /* undefined pixmap id */
|
||||
};
|
||||
|
||||
|
||||
struct Xmem
|
||||
{
|
||||
int pmid; /* pixmap id for screen ldepth instance */
|
||||
XImage *xi; /* local image if we currenty have the data */
|
||||
int dirty;
|
||||
Rectangle dirtyr;
|
||||
Rectangle r;
|
||||
uintptr pc; /* who wrote into xi */
|
||||
};
|
||||
|
||||
extern int xtblbit;
|
||||
extern int x24bitswap;
|
||||
extern int plan9tox11[];
|
||||
extern int x11toplan9[];
|
||||
extern int xscreendepth;
|
||||
extern XXDisplay *xdisplay;
|
||||
extern Drawable xscreenid;
|
||||
extern Visual *xvis;
|
||||
extern GC xgcfill, xgcfill0;
|
||||
extern int xgcfillcolor, xgcfillcolor0;
|
||||
extern GC xgccopy, xgccopy0;
|
||||
extern GC xgczero, xgczero0;
|
||||
extern int xgczeropm, xgczeropm0;
|
||||
extern GC xgcsimplesrc, xgcsimplesrc0;
|
||||
extern int xgcsimplecolor, xgcsimplecolor0, xgcsimplepm, xgcsimplepm0;
|
||||
extern GC xgcreplsrc, xgcreplsrc0;
|
||||
extern int xgcreplsrcpm, xgcreplsrcpm0, xgcreplsrctile, xgcreplsrctile0;
|
||||
extern XImage* allocXdata(Memimage*, Rectangle);
|
||||
extern void putXdata(Memimage*, Rectangle);
|
||||
extern XImage* getXdata(Memimage*, Rectangle);
|
||||
extern void freeXdata(Memimage*);
|
||||
extern void dirtyXdata(Memimage*, Rectangle);
|
||||
extern ulong xscreenchan;
|
||||
extern void xfillcolor(Memimage*, Rectangle, ulong);
|
Loading…
Reference in New Issue