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.mjsdragging behaviorline.mjsdrawingovaland 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.