summaryrefslogtreecommitdiff
path: root/Master/texmf/asymptote/plain_Label.asy
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf/asymptote/plain_Label.asy')
-rw-r--r--Master/texmf/asymptote/plain_Label.asy669
1 files changed, 0 insertions, 669 deletions
diff --git a/Master/texmf/asymptote/plain_Label.asy b/Master/texmf/asymptote/plain_Label.asy
deleted file mode 100644
index a559ae88298..00000000000
--- a/Master/texmf/asymptote/plain_Label.asy
+++ /dev/null
@@ -1,669 +0,0 @@
-real angle(transform t)
-{
- pair z=(2t.xx*t.yy,t.yx*t.yy-t.xx*t.xy);
- if(t.xx < 0) z=-z;
- return degrees(z,warn=false);
-}
-
-transform rotation(transform t)
-{
- return rotate(angle(t));
-}
-
-transform scaleless(transform t)
-{
- real a=t.xx, b=t.xy, c=t.yx, d=t.yy;
- real arg=(a-d)^2+4b*c;
- pair delta=arg >= 0 ? sqrt(arg) : I*sqrt(-arg);
- real trace=a+d;
- pair l1=0.5(trace+delta);
- pair l2=0.5(trace-delta);
-
- if(abs(delta) < sqrtEpsilon*max(abs(l1),abs(l2))) {
- real s=abs(0.5trace);
- return (s != 0) ? scale(1/s)*t : t;
- }
-
- if(abs(l1-d) < abs(l2-d)) {pair temp=l1; l1=l2; l2=temp;}
-
- pair dot(pair[] u, pair[] v) {return conj(u[0])*v[0]+conj(u[1])*v[1];}
-
- pair[] unit(pair[] u) {
- real norm2=abs(u[0])^2+abs(u[1])^2;
- return norm2 != 0 ? u/sqrt(norm2) : u;
- }
-
- pair[] u={l1-d,b};
- pair[] v={c,l2-a};
- u=unit(u);
- pair d=dot(u,u);
- if(d != 0) v -= dot(u,v)/d*u;
- v=unit(v);
-
- pair[][] U={{u[0],v[0]},{u[1],v[1]}};
- pair[][] A={{a,b},{c,d}};
-
- pair[][] operator *(pair[][] a, pair[][] b) {
- pair[][] c=new pair[2][2];
- for(int i=0; i < 2; ++i) {
- for(int j=0; j < 2; ++j) {
- c[i][j]=a[i][0]*b[0][j]+a[i][1]*b[1][j];
- }
- }
- return c;
- }
-
- pair[][] conj(pair[][] a) {
- pair[][] c=new pair[2][2];
- for(int i=0; i < 2; ++i) {
- for(int j=0; j < 2; ++j) {
- c[i][j]=conj(a[j][i]);
- }
- }
- return c;
- }
-
- A=conj(U)*A*U;
-
- real D=abs(A[0][0]);
- if(D != 0) {
- A[0][0] /= D;
- A[0][1] /= D;
- }
-
- D=abs(A[1][1]);
- if(D != 0) {
- A[1][0] /= D;
- A[1][1] /= D;
- }
-
- A=U*A*conj(U);
-
- return (0,0,A[0][0].x,A[0][1].x,A[1][0].x,A[1][1].x);
-}
-
-struct align {
- pair dir;
- triple dir3;
- bool relative=false;
- bool default=true;
- bool is3D=false;
- void init(pair dir=0, bool relative=false, bool default=false) {
- this.dir=dir;
- this.relative=relative;
- this.default=default;
- is3D=false;
- }
- void init(triple dir=(0,0,0), bool relative=false, bool default=false) {
- this.dir3=dir;
- this.relative=relative;
- this.default=default;
- is3D=true;
- }
- align copy() {
- align align=new align;
- align.init(dir,relative,default);
- align.dir3=dir3;
- align.is3D=is3D;
- return align;
- }
- void align(align align) {
- if(!align.default) {
- bool is3D=align.is3D;
- init(align.dir,align.relative);
- dir3=align.dir3;
- this.is3D=is3D;
- }
- }
- void align(align align, align default) {
- align(align);
- if(this.default) {
- init(default.dir,default.relative,default.default);
- dir3=default.dir3;
- is3D=default.is3D;
- }
- }
- void write(file file=stdout, suffix suffix=endl) {
- if(!default) {
- if(relative) {
- write(file,"Relative(");
- if(is3D)
- write(file,dir3);
- else
- write(file,dir);
- write(file,")",suffix);
- } else {
- if(is3D)
- write(file,dir3,suffix);
- else
- write(file,dir,suffix);
- }
- }
- }
- bool Center() {
- return relative && (is3D ? dir3 == (0,0,0) : dir == 0);
- }
-}
-
-struct side {
- pair align;
-}
-
-side Relative(explicit pair align)
-{
- side s;
- s.align=align;
- return s;
-}
-
-restricted side NoSide;
-restricted side LeftSide=Relative(W);
-restricted side Center=Relative((0,0));
-restricted side RightSide=Relative(E);
-
-side operator * (real x, side s)
-{
- side S;
- S.align=x*s.align;
- return S;
-}
-
-align operator cast(pair dir) {align A; A.init(dir,false); return A;}
-align operator cast(triple dir) {align A; A.init(dir,false); return A;}
-align operator cast(side side) {align A; A.init(side.align,true); return A;}
-restricted align NoAlign;
-
-void write(file file=stdout, align align, suffix suffix=endl)
-{
- align.write(file,suffix);
-}
-
-struct position {
- pair position;
- bool relative;
-}
-
-position Relative(real position)
-{
- position p;
- p.position=position;
- p.relative=true;
- return p;
-}
-
-restricted position BeginPoint=Relative(0);
-restricted position MidPoint=Relative(0.5);
-restricted position EndPoint=Relative(1);
-
-position operator cast(pair x) {position P; P.position=x; return P;}
-position operator cast(real x) {return (pair) x;}
-position operator cast(int x) {return (pair) x;}
-
-pair operator cast(position P) {return P.position;}
-
-typedef transform embed(transform);
-transform Shift(transform t) {return identity();}
-transform Rotate(transform t) {return rotation(t);}
-transform Slant(transform t) {return scaleless(t);}
-transform Scale(transform t) {return t;}
-
-embed Rotate(pair z) {
- return new transform(transform t) {return rotate(degrees(shiftless(t)*z,
- warn=false));};
-}
-
-struct Label {
- string s,size;
- position position;
- bool defaultposition=true;
- align align;
- pen p=nullpen;
- transform T;
- transform3 T3=identity(4);
- bool defaulttransform=true;
- bool defaulttransform3=true;
- embed embed=Rotate; // Shift, Rotate, Slant, or Scale with embedded picture
- filltype filltype=NoFill;
-
- void init(string s="", string size="", position position=0,
- bool defaultposition=true, align align=NoAlign, pen p=nullpen,
- transform T=identity(), transform3 T3=identity4,
- bool defaulttransform=true, bool defaulttransform3=true,
- embed embed=Rotate, filltype filltype=NoFill) {
- this.s=s;
- this.size=size;
- this.position=position;
- this.defaultposition=defaultposition;
- this.align=align.copy();
- this.p=p;
- this.T=T;
- this.T3=copy(T3);
- this.defaulttransform=defaulttransform;
- this.defaulttransform3=defaulttransform3;
- this.embed=embed;
- this.filltype=filltype;
- }
-
- void initalign(string s="", string size="", align align, pen p=nullpen,
- embed embed=Rotate, filltype filltype=NoFill) {
- init(s,size,align,p,embed,filltype);
- }
-
- void transform(transform T) {
- this.T=T;
- defaulttransform=false;
- }
-
- void transform3(transform3 T) {
- this.T3=copy(T);
- defaulttransform3=false;
- }
-
- Label copy(transform3 T3=this.T3) {
- Label L=new Label;
- L.init(s,size,position,defaultposition,align,p,T,T3,defaulttransform,
- defaulttransform3,embed,filltype);
- return L;
- }
-
- void position(position pos) {
- this.position=pos;
- defaultposition=false;
- }
-
- void align(align a) {
- align.align(a);
- }
- void align(align a, align default) {
- align.align(a,default);
- }
-
- void p(pen p0) {
- if(this.p == nullpen) this.p=p0;
- }
-
- void filltype(filltype filltype0) {
- if(this.filltype == NoFill) this.filltype=filltype0;
- }
-
- void label(frame f, transform t=identity(), pair position, pair align) {
- pen p0=p == nullpen ? currentpen : p;
- align=length(align)*unit(rotation(t)*align);
- label(f,s,size,embed(t)*shiftless(T),
- t*position+align*labelmargin(p0)+shift(T)*0,align,p0);
- }
-
- void out(frame f, transform t=identity(), pair position=position.position,
- pair align=align.dir) {
- if(filltype == NoFill)
- label(f,t,position,align);
- else {
- frame d;
- label(d,t,position,align);
- add(f,d,filltype);
- }
- }
-
- void label(picture pic=currentpicture, pair position, pair align) {
- if(s == "") return;
- pic.add(new void (frame f, transform t) {
- out(f,t,position,align);
- },true);
- frame f;
- // Create a picture with label at the origin to extract its bbox truesize.
- label(f,(0,0),align);
- pic.addBox(position,position,min(f),max(f));
- }
-
- void out(picture pic=currentpicture) {
- label(pic,position.position,align.dir);
- }
-
- void out(picture pic=currentpicture, path g) {
- bool relative=position.relative;
- real position=position.position.x;
- pair Align=align.dir;
- bool alignrelative=align.relative;
- if(defaultposition) {relative=true; position=0.5;}
- if(relative) position=reltime(g,position);
- if(align.default) {
- alignrelative=true;
- Align=position <= sqrtEpsilon ? S :
- position >= length(g)-sqrtEpsilon ? N : E;
- }
-
- pic.add(new void (frame f, transform t) {
- out(f,t,point(g,position),
- alignrelative ? -Align*dir(t*g,position)*I : Align);
- },!alignrelative);
-
- frame f;
- pair align=alignrelative ? -Align*dir(g,position)*I : Align;
- label(f,(0,0),align);
- pair position=point(g,position);
- pic.addBox(position,position,min(f),max(f));
- }
-
- void write(file file=stdout, suffix suffix=endl) {
- write(file,"\""+s+"\"");
- if(!defaultposition) write(file,", position=",position.position);
- if(!align.default) write(file,", align=");
- write(file,align);
- if(p != nullpen) write(file,", pen=",p);
- if(!defaulttransform)
- write(file,", transform=",T);
- if(!defaulttransform3)
- write(file,T3);
- write(file,"",suffix);
- }
-
- real relative() {
- return defaultposition ? 0.5 : position.position.x;
- };
-
- real relative(path g) {
- return position.relative ? reltime(g,relative()) : relative();
- };
-}
-
-Label Label;
-
-void add(frame f, transform t=identity(), Label L)
-{
- L.out(f,t);
-}
-
-void add(picture pic=currentpicture, Label L)
-{
- L.out(pic);
-}
-
-Label operator * (transform t, Label L)
-{
- Label tL=L.copy();
- tL.align.dir=L.align.dir;
- tL.transform(t*L.T);
- return tL;
-}
-
-Label operator * (transform3 t, Label L)
-{
- Label tL=L.copy(t*L.T3);
- tL.align.dir=L.align.dir;
- tL.defaulttransform3=false;
- return tL;
-}
-
-Label Label(string s, string size="", explicit position position,
- align align=NoAlign, pen p=nullpen, embed embed=Rotate,
- filltype filltype=NoFill)
-{
- Label L;
- L.init(s,size,position,false,align,p,embed,filltype);
- return L;
-}
-
-Label Label(string s, string size="", pair position, align align=NoAlign,
- pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill)
-{
- return Label(s,size,(position) position,align,p,embed,filltype);
-}
-
-Label Label(explicit pair position, align align=NoAlign, pen p=nullpen,
- embed embed=Rotate, filltype filltype=NoFill)
-{
- return Label((string) position,position,align,p,embed,filltype);
-}
-
-Label Label(string s="", string size="", align align=NoAlign, pen p=nullpen,
- embed embed=Rotate, filltype filltype=NoFill)
-{
- Label L;
- L.initalign(s,size,align,p,embed,filltype);
- return L;
-}
-
-Label Label(Label L, align align=NoAlign, pen p=nullpen, embed embed=L.embed,
- filltype filltype=NoFill)
-{
- Label L=L.copy();
- L.align(align);
- L.p(p);
- L.embed=embed;
- L.filltype(filltype);
- return L;
-}
-
-Label Label(Label L, explicit position position, align align=NoAlign,
- pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill)
-{
- Label L=Label(L,align,p,embed,filltype);
- L.position(position);
- return L;
-}
-
-Label Label(Label L, pair position, align align=NoAlign,
- pen p=nullpen, embed embed=L.embed, filltype filltype=NoFill)
-{
- return Label(L,(position) position,align,p,embed,filltype);
-}
-
-void write(file file=stdout, Label L, suffix suffix=endl)
-{
- L.write(file,suffix);
-}
-
-void label(frame f, Label L, pair position, align align=NoAlign,
- pen p=currentpen, filltype filltype=NoFill)
-{
- add(f,Label(L,position,align,p,filltype));
-}
-
-void label(frame f, Label L, align align=NoAlign,
- pen p=currentpen, filltype filltype=NoFill)
-{
- add(f,Label(L,L.position,align,p,filltype));
-}
-
-void label(picture pic=currentpicture, Label L, pair position,
- align align=NoAlign, pen p=currentpen, filltype filltype=NoFill)
-{
- Label L=Label(L,position,align,p,filltype);
- add(pic,L);
-}
-
-void label(picture pic=currentpicture, Label L, align align=NoAlign,
- pen p=currentpen, filltype filltype=NoFill)
-{
- label(pic,L,L.position,align,p,filltype);
-}
-
-void label(picture pic=currentpicture, Label L, explicit path g,
- align align=NoAlign, pen p=currentpen, filltype filltype=NoFill)
-{
- Label L=Label(L,align,p,filltype);
- L.out(pic,g);
-}
-
-void label(picture pic=currentpicture, Label L, explicit guide g,
- align align=NoAlign, pen p=currentpen, filltype filltype=NoFill)
-{
- label(pic,L,(path) g,align,p,filltype);
-}
-
-Label operator cast(string s) {return Label(s);}
-
-// A structure that a string, Label, or frame can be cast to.
-struct object {
- frame f;
- Label L=Label;
- path g; // Bounding path
-
- void operator init(frame f) {
- this.f=f;
- g=box(min(f),max(f));
- }
-
- void operator init(Label L) {
- this.L=L.copy();
- if(L != Label) L.out(f);
- g=box(min(f),max(f));
- }
-}
-
-object operator cast(frame f) {
- return object(f);
-}
-
-object operator cast(Label L)
-{
- return object(L);
-}
-
-object operator cast(string s)
-{
- return object(s);
-}
-
-Label operator cast(object F)
-{
- return F.L;
-}
-
-frame operator cast(object F)
-{
- return F.f;
-}
-
-object operator * (transform t, explicit object F)
-{
- object f;
- f.f=t*F.f;
- f.L=t*F.L;
- f.g=t*F.g;
- return f;
-}
-
-// Returns a copy of object F aligned in the direction align
-object align(object F, pair align)
-{
- return shift(F.f,align)*F;
-}
-
-void add(picture dest=currentpicture, object F, pair position=0,
- bool group=true, filltype filltype=NoFill, bool above=true)
-{
- add(dest,F.f,position,group,filltype,above);
-}
-
-// Pack a list of objects into a frame.
-frame pack(pair align=2S ... object inset[])
-{
- frame F;
- int n=inset.length;
- pair z;
- for (int i=0; i < n; ++i) {
- add(F,inset[i].f,z);
- z += align+realmult(unit(align),size(inset[i].f));
- }
- return F;
-}
-
-path[] texpath(Label L, bool tex=settings.tex != "none", bool bbox=false)
-{
- struct stringfont
- {
- string s;
- real fontsize;
- string font;
-
- void operator init(Label L)
- {
- s=L.s;
- fontsize=fontsize(L.p);
- font=font(L.p);
- }
-
- pen pen() {return fontsize(fontsize)+fontcommand(font);}
- }
-
- bool lexorder(stringfont a, stringfont b) {
- return a.s < b.s || (a.s == b.s && (a.fontsize < b.fontsize ||
- (a.fontsize == b.fontsize &&
- a.font < b.font)));
- }
-
- static stringfont[] stringcache;
- static path[][] pathcache;
-
- static stringfont[] stringlist;
- static bool adjust[];
-
- path[] G;
-
- stringfont s=stringfont(L);
- pen p=s.pen();
-
- int i=search(stringcache,s,lexorder);
- if(i == -1 || lexorder(stringcache[i],s)) {
- int k=search(stringlist,s,lexorder);
- if(k == -1 || lexorder(stringlist[k],s)) {
- ++k;
- stringlist.insert(k,s);
- // PDF tex engines lose track of the baseline.
- adjust.insert(k,tex && basealign(L.p) == 1 && pdf());
- }
- }
-
- path[] transform(path[] g, Label L) {
- if(g.length == 0) return g;
- pair m=min(g);
- pair M=max(g);
- pair dir=rectify(inverse(L.T)*-L.align.dir);
- if(tex && basealign(L.p) == 1)
- dir -= (0,(1-dir.y)*m.y/(M.y-m.y));
- pair a=m+realmult(dir,M-m);
-
- return shift(L.position+L.align.dir*labelmargin(L.p))*L.T*shift(-a)*g;
- }
-
- if(tex && bbox) {
- frame f;
- label(f,L);
- return transform(box(min(f),max(f)),L);
- }
-
- if(stringlist.length > 0) {
- path[][] g;
- int n=stringlist.length;
- string[] s=new string[n];
- pen[] p=new pen[n];
- for(int i=0; i < n; ++i) {
- stringfont S=stringlist[i];
- s[i]=adjust[i] ? "."+S.s : S.s;
- p[i]=adjust[i] ? S.pen()+basealign : S.pen();
- }
-
- g=tex ? _texpath(s,p) : textpath(s,p);
-
- if(tex)
- for(int i=0; i < n; ++i)
- if(adjust[i]) {
- real y=min(g[i][0]).y;
- g[i].delete(0);
- g[i]=shift(0,-y)*g[i];
- }
-
-
- for(int i=0; i < stringlist.length; ++i) {
- stringfont s=stringlist[i];
- int j=search(stringcache,s,lexorder)+1;
- stringcache.insert(j,s);
- pathcache.insert(j,g[i]);
- }
- stringlist.delete();
- adjust.delete();
- }
-
- return transform(pathcache[search(stringcache,stringfont(L),lexorder)],L);
-}