Monorepo for Aesthetic.Computer aesthetic.computer
core reports coordinate-regression-fix.md
3.1 kB

Pen Coordinate Regression Analysis - SOLVED #

Date: August 2, 2025
Status: ✅ RESOLVED
Root Cause: Both line brush coordinate handling AND new pline function implementation in commit b529a250

The Problem #

You were experiencing broken touch/pen handling affecting multiple brushes:

  • rect.mjs dragging behavior
  • line.mjs drawing
  • oval and other shapes
  • Touch vs mouse input inconsistency across all drawing brushes

Root Cause Discovered #

The issue was NOT the complex button system from June 27 as initially suspected. It was two related issues from today's commit b529a250 ("better cursor rendering on tapes / fix 'line' brush"):

Issue 1: Line Brush Coordinate Handling #

The line brush was changed from using raw event coordinates to transformed pen coordinates:

// Broken: Using transformed coordinates
addPoint(num, pen.x, pen.y);  

// Fixed: Using raw event coordinates  
addPoint(num, e.x, e.y);

Issue 2: New pline Function Implementation (MAJOR) #

The core pline function (thick polyline rendering) was completely rewritten to use direct pixel buffer manipulation instead of the standard drawing functions. This bypassed critical infrastructure:

  • Pan transformations: Not applied to direct pixel writes
  • Context switching: Between screen/nopaint buffers not handled
  • Coordinate clipping: Direct pixel access doesn't respect canvas bounds
  • Color management: Bypassed standard color handling

Affected Systems #

Since rect, oval, and other brushes use the nopaint system which can call pline for thick outlines, this affected almost all drawing operations on touch devices.

The Fixes Applied #

✅ Fix 1 - Line brush coordinates:

// Reverted to raw event coordinates
if (e.is("touch:1")) {
  addPoint(num, e.x, e.y);  // ← Raw coordinates (correct)
}

✅ Fix 2 - pline function (CRITICAL):

// Replaced direct pixel manipulation with standard drawing functions
// Now uses circle() and other standard functions that properly handle:
// - Pan transformations
// - Context switching  
// - Coordinate clipping
// - Color management

Why This Broke Touch Drawing #

The new pline implementation bypassed the coordinate transformation pipeline that ensures touch and mouse events are processed consistently across different painting contexts (screen vs nopaint buffers).

Key Insight #

Never bypass the standard drawing function infrastructure - functions like circle(), line(), point() handle critical coordinate transformations, context switching, and bounds checking that direct pixel manipulation cannot replicate.

Testing Recommendations #

✅ Test immediately:

Status: RESOLVED ✅ #

Both coordinate system issues have been fixed. The drawing system should now work consistently across all devices and brushes.