aseprite/src
David Capello f178941f2c Fix crash copying, pasting, and transforming selection (fix #4249)
Regression introduced with 8722c8ec16
and d3562b140c.

Our re-entrant RWLock implementation is tricky because it doesn't
support to unlock in different order than it was locked.

E.g. If we create a DocWriter (e.g. paste command), and try to create
a DocReader (e.g. PixelsMovement) inside the DocWriter scope, the
reader will return a LockResult::Reentrant, but if we unlock the
write, then the reader cannot be used to upgradeToWrite() because the
lock will have just 0 locks (the re-entrant one didn't modify the
count of the RWLock). This is because it was thought that the
DocReader was going to be unlocked before the writer lock (in the
exact inverse order).

Basically these re-entrant RWLocks will not work fine if we mix up the
order of locks/unlocks in the same thread.
2023-12-29 17:22:10 -03:00
..
app Fix crash copying, pasting, and transforming selection (fix #4249) 2023-12-29 17:22:10 -03:00
cfg
clip@94693e2414
desktop
dio Fix crash reading corrupted files with invalid compressed data (fix #4171) 2023-11-26 22:27:14 -03:00
doc Lock document in Tx() ctor (part of #2430) 2023-12-27 11:05:15 -03:00
filters
fixmath
flic@876ef60df5
gen Check strings only from en.ini file 2023-12-06 14:57:17 -03:00
main
net
observable@8e03c3cb06
psd@5a357fb964
render
steam
tests
tga@cd3420c3a5
ui Fix Alt+T -> Alt+V instantly crashes Aseprite without warning (fix #4221) 2023-12-27 16:58:37 -03:00
undo@c868a02389
updater
ver Remove cmake policies that aren't used anymore 2023-11-26 21:46:20 -03:00
CMakeLists.txt
config.h
README.md

Aseprite Source Code

If you are here is because you want to learn about Aseprite source code. We'll try to write in these README.md files a summary of each module/library.

Modules & Libraries

Aseprite is separated in the following layers/modules:

Level 0: Completely independent modules

These libraries are easy to be used and embedded in other software because they don't depend on any other component.

  • clip: Clipboard library.
  • fixmath: Fixed point operations (original code from Allegro code by Shawn Hargreaves).
  • flic: Library to load/save FLI/FLC files.
  • laf/base: Core/basic stuff, multithreading, utf8, sha1, file system, memory, etc.
  • laf/gfx: Abstract graphics structures like point, size, rectangle, region, color, etc.
  • observable: Signal/slot functions.
  • scripting: JavaScript engine.
  • steam: Steam API wrapper to avoid static linking to the .lib file.
  • undo: Generic library to manage a history of undoable commands.

Level 1

  • cfg (base): Library to load/save .ini files.
  • gen (base): Helper utility to generate C++ files from different XMLs.
  • net (base): Networking library to send HTTP requests.
  • laf/os (base, gfx, wacom): OS input/output.

Level 2

  • doc (base, fixmath, gfx): Document model library.
  • ui (base, gfx, os): Portable UI library (buttons, windows, text fields, etc.)
  • updater (base, cfg, net): Component to check for updates.

Level 3

  • dio (base, doc, fixmath, flic): Load/save sprites/documents.
  • filters (base, doc, gfx): Effects for images.
  • render (base, doc, gfx): Library to render documents.

Level 4

  • app (base, doc, dio, filters, fixmath, flic, gfx, pen, render, scripting, os, ui, undo, updater)
  • desktop (base, doc, dio, render): Integration with the desktop (Windows Explorer, Finder, GNOME, KDE, etc.)

Level 5

  • main (app, base, os, ui)

Debugging Tricks

When Aseprite is compiled with ENABLE_DEVMODE, you have the following extra commands/features available:

  • F5: On Windows shows the amount of used memory.
  • F1: Switch between new/old/shader renderers.
  • Ctrl+F1: Switch/test Screen/UI Scaling values.
  • Ctrl+Alt+Shift+Q: crashes the application in case that you want to test the anticrash feature or your need a memory dump file.
  • Ctrl+Alt+Shift+R: recover the active document from the data recovery store.
  • aseprite.ini: [perf] show_render_time=true shows a performance clock in the Editor.

In Debug mode (_DEBUG):

  • TRACEARGS: in debug mode, it prints in the terminal/console each given argument

Detect Platform

You can check the platform using some laf macros:

#if LAF_WINDOWS
  // ...
#elif LAF_MACOS
  // ...
#elif LAF_LINUX
  // ...
#endif

Or using platform-specific macros:

#ifdef _WIN32
  #ifdef _WIN64
    // Windows x64
  #else
    // Windows x86
  #endif
#elif defined(__APPLE__)
    // macOS
#else
    // Linux
#endif