Antialiasing (AA) ist eine feine Sache und man erreicht es in Codea mit der Funktion smooth(), die standartmäßig automatisch ausgeführt wird. Die Bilder werden hübsch weich gezeichnet. Jedoch gibt es Fälle, in denen man sich scharf verpixelte Kanten wünscht! Zum Beispiel wenn man seiner App statt geglätteten Kanten den Pixel-Look verleihen will. Dazu muss man normalerweise lediglich noSmooth() ausführen. Aber diese Funktion birgt gewisse Tücken.

Ein Beispiel dafür sind Linien, die man in Codea mit line() darstellen kann. Linien können alternativ auch einen lineCapMode() besitzen.

Standartmäßig wird der Bildschirm in Codea mit der Option smooth dargestellt und daher bekommen Linien automatisch den lineCapMode(ROUND). - Warum erzähle ich das alles?

Ruft line mit der Option smooth und danach noSmooth auf, dann merkt ihr den Unterschied! Linien die ohne Antialiasing gezeichnet werden verlieren ihren ROUND lineCapMode und werden zu SQUARE.

Mit meiner App zum Zeichnen kam ich um Linien nicht herum, denn so funktionieren Malapps nun einmal! Folglich sah das Ergebnis wie auf dem oberen Bild aus. Nicht wirklich gewollt! Aber warum sehen die Linien nicht genauso aus wie im smooth Mode, nur eben verpixelt? Keine Ahnung! Fakt ist, sie werden nicht mehr abgerundet sondern gekantet und verkürzt, was eben dem lineCapMode(SQUARE) entspricht. Also brauchte ich eine Lösung!

Das einzig logische Möglichkeit wäre, Kreise zwischen den einzelnen Linienabschnitten zu plazieren und lineCapMode(ROUND) zu faken! Somit wären die Abrisse wieder verdeckt. Nur gibt es leider ein weiteres Problem! - Wenn in Codea noSmooth() aufgerufen wird, bleibt ellipse(), die Kreisfunktion, trotzdem weich gezeichnet! Damit bekommt man zwar verpixelte Linien, die jedoch an ihren End- und Wendepunkten (da, wo die Kreise zum Verdecken sind) verwaschen sind.

Ich griff also zu härteren Mitteln und überschrieb kurzer Hand Codea's line Funktion komplett! Nun hat sie statt vier, fünf Parameter: line(x1, y1, x2, y2, capMode).

Wenn das letzte Parameter capMode übergeben wurde, wird die Linie immer verpixelt gezeichnet! In dem Fall hat smooth also keine Auswirkungen auf diese Linie! Das Ergebnis: gestochen scharf und verpixelt. Eben so, wie ich es wollte! 😁

Alle lineCapMode(), mit der neuen line() Funktion, auf einen Blick.

Kleines Speedpainting zum testen.

Nachtrag

Mehr dazu in offizieller Forum Diskussionsrunde