    vertex_data out;
    if (!car_space_to_full_frame(s, x_in, y_in, 0.0, &out)) return;
  
    auto [x, y] = out;
    sz = std::clamp((sz * 30) / (x_in / 3 + 30), 15.0f, 30.0f);
  
    // glow
    float g_xo = sz/5;
    float g_yo = sz/10;
    nvgBeginPath(s->vg);
 
</s> remove   vertex_data out;
  if (!car_space_to_full_frame(s, x_in, y_in, 0.0, &out)) return;
 </s> add   vertex_data out = {};
  car_space_to_full_frame(s, x_in, y_in, 0.0, &out); </s> remove   out->x = KEp.v[0] / KEp.v[2];
  out->y = KEp.v[1] / KEp.v[2];
 </s> add   float x = KEp.v[0] / KEp.v[2];
  float y = KEp.v[1] / KEp.v[2]; </s> remove   nvgRestore(s->vg);
 </s> add   nvgResetScissor(s->vg); </s> remove 
  nvgSave(s->vg);

 </s> add 
  sz = std::clamp((sz * 30) / (x_in / 3 + 30), 15.0f, 30.0f) * zoom;
  y = std::fmin(s->scene.viz_rect.bottom() - sz * .6,  y);
  x = std::clamp(x, 0.f, s->scene.viz_rect.right() - sz / 2);
    vertex_data out;
    if (!car_space_to_full_frame(s, x_in, y_in, 0.0, &out)) return;
  
    auto [x, y] = out;
  sz = std::clamp((sz * 30) / (x_in / 3 + 30), 15.0f, 30.0f) * zoom;
  y = std::fmin(s->scene.viz_rect.bottom() - sz * .6,  y);
  x = std::clamp(x, 0.f, s->scene.viz_rect.right() - sz / 2);
  
    // glow
    float g_xo = sz/5;
    float g_yo = sz/10;
    nvgBeginPath(s->vg);
keep keep keep keep replace keep keep keep keep keep
 UI: refactor transform (#19658)

* refactor transform

* always draw chevron if there is a lead

* remove nvgSave&nvgRestore

* keep one point outside the screen

* zoom chevron

* more size

* still use margin

* still use margin 
selfdrive/ui/paint.cc