001package polaris.sdk.ui; 002/** Draw-only affine transform. SDF evaluation stays in GLSL; input bounds do not shrink. */ 003public final class TransformPainter implements Painter { 004 private final Painter p;private final float scale,dx,dy,alpha;private final Rect boundary; 005 public TransformPainter(Painter p,float cx,float cy,float scale,float tx,float ty,float alpha,Rect clip){this.p=p;this.scale=scale;dx=cx*(1-scale)+tx;dy=cy*(1-scale)+ty;this.alpha=MotionValue.clamp(alpha);boundary=clip;} 006 private float x(float v){return v*scale+dx;}private float y(float v){return v*scale+dy;} 007 private int ink(int c){return Theme.alpha(c,alpha);} 008 @Override public void configure(Theme theme){p.configure(theme);} 009 @Override public void corners(CornerRadii profile){p.corners(profile==null?null:profile.scale(scale));} 010 // Inherited viewport/scissor is stationary: a child's press animation must not shrink it. 011 @Override public void clip(Rect r){ 012 boolean inherited=r==boundary || r.x==boundary.x&&r.y==boundary.y&&r.w==boundary.w&&r.h==boundary.h; 013 p.clip(inherited?boundary:new Rect(x(r.x),y(r.y),r.w*scale,r.h*scale).intersect(boundary)); 014 } 015 @Override public void pushShapeClip(Rect r,float radius,CornerRadii profile){p.pushShapeClip(new Rect(x(r.x),y(r.y),r.w*scale,r.h*scale),radius<0?radius:radius*scale,profile==null?null:profile.scale(scale));} 016 @Override public void popShapeClip(){p.popShapeClip();} 017 @Override public void glass(float x,float y,float w,float h,float radius,Theme t,float blur){Theme m=t.copy();m.surfaceOpacity*=alpha;m.refraction*=scale;p.glass(x(x),y(y),w*scale,h*scale,radius<0?radius:radius*scale,m,blur);} 018 @Override public void fill(float x,float y,float w,float h,float r,int c){p.fill(x(x),y(y),w*scale,h*scale,r*scale,ink(c));} 019 @Override public void stroke(float x,float y,float w,float h,float r,float thickness,int c){p.stroke(x(x),y(y),w*scale,h*scale,r*scale,thickness*scale,ink(c));} 020 @Override public void line(float x,float y,float x2,float y2,float thickness,int c){p.line(x(x),y(y),x(x2),y(y2),thickness*scale,ink(c));} 021 @Override public void ring(float x,float y,float size,float thickness,float progress,float start,int c){p.ring(x(x),y(y),size*scale,thickness*scale,progress,start,ink(c));} 022 @Override public void colorPlane(float x,float y,float w,float h,float hue){p.colorPlaneAlpha(x(x),y(y),w*scale,h*scale,hue,alpha);} 023 @Override public void colorPlaneAlpha(float x,float y,float w,float h,float hue,float nestedAlpha){p.colorPlaneAlpha(x(x),y(y),w*scale,h*scale,hue,alpha*nestedAlpha);} 024 @Override public void text(String s,float x,float y,float size,int c){p.textScaled(s,x(x),y(y),size,ink(c),scale);} 025 @Override public void textScaled(String s,float x,float y,float size,int c,float nestedScale){p.textScaled(s,x(x),y(y),size,ink(c),scale*nestedScale);} 026 @Override public void textWeight(String s,float x,float y,float size,int c,int weight){p.textWeightScaled(s,x(x),y(y),size,ink(c),weight,scale);} 027 @Override public void textWeightScaled(String s,float x,float y,float size,int c,int weight,float nestedScale){p.textWeightScaled(s,x(x),y(y),size,ink(c),weight,scale*nestedScale);} 028 @Override public float textWidth(String s,float size){return p.textWidth(s,size);} 029 @Override public float textWidth(String s,float size,int weight){return p.textWidth(s,size,weight);} 030 @Override public void backdrop(){p.backdrop();} 031}