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}