Portraits is a collection of mirrors that reinterprets what a portrait depicts. Each mirror is based on a name, a word, or a phrase that is algorithmically translated into nestling rectangles of color. Inviting dialogue with its viewers through imbued text, form, color, and fragmented reflections, each mirror is just as exact and slippery as the language used to create it.
A collaboration between the ATP Tour, Art Blocks Engine, and Martin Grasser, LOVE is a collection of unique digital artworks that uses in-match sports data to celebrate impactful moments from the 2022 Nitto ATP Finals in Turin, Italy.
o=[];for(let A of f)for(let t=0;t<A.weight;t++)o.push(A);A.palette=e(o);for(let o of A.palette.layers)0==o.type&&(o.rng_angle=e(o.angles),o.rng_scale=t(10*o.scale[0],10*o.scale[1])/10);let n=new Set(A.palette.grids);A.grid_index=e(Array.from(n));let a=r[A.grid_index];A.grid={d:a[0],r:a[2],s:a[3],l:a[4],p:a[5],q:e(a[1]),size:p/a[0],c:1,e:0},requestAnimationFrame((()=>{for(const t of A.palette.layers)x.globalCompositeOperation="destination-out",x.fillStyle="#ffffff",x.fillRect(0,0,w.width,w.height),x.globalCompositeOperation="source-over",Z[t.type](A,t),R.save(),"blend"in t&&"normal"!=t.blend&&(R.globalCompositeOperation=t.blend),"alpha"in t&&t.alpha>=0&&t.alpha<=1&&(R.globalAlpha=t.alpha),R.drawImage(w,0,0,w.width,w.height,0,0,p,p),R.restore()}))}()})),M.src=b.toDataURL()}),!1),j.src="data:image/png;base64,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";const Z=[function(A,e){const o=e.rng_angle,n=e.rng_scale,a=p*n-p,l=a*t(100*e.ox[0],100*e.ox[1])/100,r=a*t(100*e.oy[0],100*e.oy[1])/100;x.save(),x.translate(1500,1500),x.rotate(o*Math.PI/180),x.translate(-1500,-1500),x.translate(-l,-r),x.scale(n,n),x.drawImage(M,0,0,M.width,M.height,0,0,p,p),x.restore()},function(A,t){x.fillStyle=t.color,x.fillRect(0,0,w.width,w.height)},function(A,e){let[o,n]=function(A){const t=(A.d-A.q)/2,e=A.d-(A.d-A.q)/2,o=A.size,n=[[E(A),[e,e],270,1],[E(A),[t,e],0,1],[E(A),[t,t],90,1],[E(A),[e,t],180,1]],a=[[Q(0,n,A),[e,e],0,0],[Q(1,n,A),[t,e],90,0],[Q(2,n,A),[t,t],180,0],[Q(3,n,A),[e,t],270,0]],l=[n[1],a[0],n[0],a[3],n[3],a[2],n[2],a[1]];let r,i,s,g,h,V,c=[],d={x:-1,y:-1},f={x:-1,y:-1};for(let[A,t,e,n]of l)if(r=t[0]*o,i=t[1]*o,1==n){let t=0;for(let n of A){s=t*o+r,g=i,h=n.span*o,V=n.rise*o,t+=n.span;let[A,a,l,C]=y(r,i,s,g,h,V,e);0==e||180==e?(-1==f.x&&(f={x:A,y:C}),A!=d.x&&C!=d.y&&-1!=d.x&&c.push([d.x,d.y,d.x,C]),c.push([A,C,l,C])):90!=e&&270!=e||(l!=d.x&&a!=d.y&&c.push([d.x,d.y,l,d.y]),c.push([l,a,l,C])),d={x:l,y:C}}}else{let t=A;if(0==t.w||0==t.h)continue;s=t.x*o+r,g=t.y*o+i,h=t.w*o,V=t.h*o;let[n,a,l,f]=y(r,i,s,g,h,V,e);0!=e&&180!=e||(n!=d.x&&f!=d.y&&c.push([d.x,d.y,n,d.y]),c.push([n,f,l,f]),c.push([l,f,l,a]),d={x:l,y:a}),90!=e&&270!=e||(l!=d.x&&a!=d.y&&c.push([d.x,d.y,d.x,a]),c.push([l,a,l,f]),c.push([l,f,n,f]),d={x:n,y:f})}return[c,f]}(A.grid);x.fillStyle=e.color,"out"==e.fill&&(x.fillRect(0,0,w.width,w.height),x.globalCompositeOperation="destination-out");const a=A.grid.l,l=t(-a,a)*A.grid.size,r=t(-a,a)*A.grid.size;x.save(),x.translate(l,r),x.translate(-0,-0),x.scale(1,1),x.beginPath();let i={x:0,y:0};for(let[A,t,e,n]of o)x.lineTo(A,t),x.lineTo(e,n),i={x:e,y:n};n.x!=i.x&&n.y!=i.y&&x.lineTo(i.x,n.y),x.lineTo(n.x,n.y),x.fill(),x.restore()},function(A,t){const e=new Uint8ClampedArray(M.width*M.height*4),o=R.getImageData(0,0,M.width,M.height).data,n=c[t.name];let a,l,r;for(a=0;a<M.width;a++)for(l=0;l<M.height;l++)r=4*(l*M.width+a),e[r+0]=n.r[o[r+0]],e[r+1]=n.g[o[r+1]],e[r+2]=n.b[o[r+2]],e[r+3]=255;const i=x.createImageData(M.width,M.height);i.data.set(e),x.putImageData(i,0,0)}]})();
t o of A.palette.layers)0==o.type&&(o.rng_angle=e(o.angles),o.rng_scale=t(10*o.scale[0],10*o.scale[1])/10);let n=new Set(A.palette.grids);A.grid_index=e(Array.from(n));let a=r[A.grid_index];A.grid={d:a[0],r:a[2],s:a[3],l:a[4],p:a[5],q:e(a[1]),size:p/a[0],c:1,e:0},requestAnimationFrame((()=>{for(const t of A.palette.layers)x.globalCompositeOperation="destination-out",x.fillStyle="#ffffff",x.fillRect(0,0,w.width,w.height),x.globalCompositeOperation="source-over",F[t.type](A,t),R.save(),"blend"in t&&"normal"!=t.blend&&(R.globalCompositeOperation=t.blend),"alpha"in t&&t.alpha>=0&&t.alpha<=1&&(R.globalAlpha=t.alpha),R.drawImage(w,0,0,w.width,w.height,0,0,p,p),R.restore()}))}()})),j.src=b.toDataURL()}),!1),Z.src="data:image/png;base64,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";const F=[function(A,e){const o=e.rng_angle,n=e.rng_scale,a=p*n-p,l=a*t(100*e.ox[0],100*e.ox[1])/100,r=a*t(100*e.oy[0],100*e.oy[1])/100;x.save(),x.translate(1500,1500),x.rotate(o*Math.PI/180),x.translate(-1500,-1500),x.translate(-l,-r),x.scale(n,n),x.drawImage(j,0,0,j.width,j.height,0,0,p,p),x.restore()},function(A,t){x.fillStyle=t.color,x.fillRect(0,0,w.width,w.height)},function(A,e){let[o,n]=function(A){const t=(A.d-A.q)/2,e=A.d-(A.d-A.q)/2,o=A.size,n=[[E(A),[e,e],270,1],[E(A),[t,e],0,1],[E(A),[t,t],90,1],[E(A),[e,t],180,1]],a=[[Q(0,n,A),[e,e],0,0],[Q(1,n,A),[t,e],90,0],[Q(2,n,A),[t,t],180,0],[Q(3,n,A),[e,t],270,0]],l=[n[1],a[0],n[0],a[3],n[3],a[2],n[2],a[1]];let r,i,s,g,h,V,c=[],d={x:-1,y:-1},C={x:-1,y:-1};for(let[A,t,e,n]of l)if(r=t[0]*o,i=t[1]*o,1==n){let t=0;for(let n of A){s=t*o+r,g=i,h=n.span*o,V=n.rise*o,t+=n.span;let[A,a,l,f]=y(r,i,s,g,h,V,e);0==e||180==e?(-1==C.x&&(C={x:A,y:f}),A!=d.x&&f!=d.y&&-1!=d.x&&c.push([d.x,d.y,d.x,f]),c.push([A,f,l,f])):90!=e&&270!=e||(l!=d.x&&a!=d.y&&c.push([d.x,d.y,l,d.y]),c.push([l,a,l,f])),d={x:l,y:f}}}else{let t=A;if(0==t.w||0==t.h)continue;s=t.x*o+r,g=t.y*o+i,h=t.w*o,V=t.h*o;let[n,a,l,C]=y(r,i,s,g,h,V,e);0!=e&&180!=e||(n!=d.x&&C!=d.y&&c.push([d.x,d.y,n,d.y]),c.push([n,C,l,C]),c.push([l,C,l,a]),d={x:l,y:a}),90!=e&&270!=e||(l!=d.x&&a!=d.y&&c.push([d.x,d.y,d.x,a]),c.push([l,a,l,C]),c.push([l,C,n,C]),d={x:n,y:C})}return[c,C]}(A.grid);x.fillStyle=e.color,"out"==e.fill&&(x.fillRect(0,0,w.width,w.height),x.globalCompositeOperation="destination-out");const a=A.grid.l,l=t(-a,a)*A.grid.size,r=t(-a,a)*A.grid.size;x.save(),x.translate(l,r),x.translate(-0,-0),x.scale(1,1),x.beginPath();let i={x:0,y:0};for(let[A,t,e,n]of o)x.lineTo(A,t),x.lineTo(e,n),i={x:e,y:n};n.x!=i.x&&n.y!=i.y&&x.lineTo(i.x,n.y),x.lineTo(n.x,n.y),x.fill(),x.restore()},function(A,t){const e=new Uint8ClampedArray(j.width*j.height*4),o=R.getImageData(0,0,j.width,j.height).data,n=c[t.name];let a,l,r;for(a=0;a<j.width;a++)for(l=0;l<j.height;l++)r=4*(l*j.width+a),e[r+0]=n.r[o[r+0]],e[r+1]=n.g[o[r+1]],e[r+2]=n.b[o[r+2]],e[r+3]=255;const i=x.createImageData(j.width,j.height);i.data.set(e),x.putImageData(i,0,0)}]})();
“Squares” utilizes the shape of a square as a unit of construction, combining and overlapping them at various scales to create interplays of color, structure, and atmosphere. The overall effect is something along the lines of Bauhaus meets Blade Runner, as complex rectilinear forms float untethered through fields of light and texture.