CAAtom: Difference between revisions

From iPhone Development Wiki
(Removed the list of atoms, which is version specific. Instead, instruction was given to how to get the atoms.)
m (Oops turns out the CAAtom structure is a bit more complex. Replaced the instruction with a tool.)
Line 25: Line 25:
</source>
</source>


You may find the list of predefined atoms as an array of strings at the (private) symbol <tt>_stringpool_contents</tt>. Values larger than the pool's size are custom atoms.
The CAAtom of 0 always return <tt>&lt;nil&gt;</tt>, and that of an undefined atom is <tt>&lt;unknown&gt;</tt>. Custom atom's value are always larger than the built-in ones.
 
== Tools ==
* [https://github.com/kennytm/Miscellaneous/blob/master/dump_caatom.py dump_caatom.py] — this script can dump internal CAAtom's from the QuartzCore binary.


{{occlass|library=QuartzCore.framework|navbox=1}}
{{occlass|library=QuartzCore.framework|navbox=1}}

Revision as of 22:15, 21 January 2011

CAAtom refers to a string for identification in QuartzCore. As of 3.1, there are over 300 internal atoms.

Converting atoms to and from strings

Signature NSString* CAAtomGetString(uint32_t atomicValue);
Available in 2.0 –
Signature uint32_t CAInternAtom(NSString* atommicString);
Available in 2.0 –

There is only 2 exported C function for CAAtom, CAAtomGetString() and CAInternAtom(), which converts between an integer and its corresponding string value. Most internal code in QuartzCore are identified using atoms. For example, a portion of disassembled code may read:

-[CAGradientLayer setLocations:]:
;
+00000 0008d9cc             stmdb             sp!,{r7,lr}
+00004 0008d9d0             add               r7,sp,#0x0
+00008 0008d9d4             mov               r1,#0xad
+0000c 0008d9d8             bl                CALayer_setter_kCAValueCopiedPointer
+00010 0008d9dc             ldmia             sp!,{r7,pc}                       ; return

here, the magic number 0xAD is in fact an atom, which is unsurprisingly the value "locations":

cy# CAAtomGetString(0xad)
"locations"

The CAAtom of 0 always return <nil>, and that of an undefined atom is <unknown>. Custom atom's value are always larger than the built-in ones.

Tools

  • dump_caatom.py — this script can dump internal CAAtom's from the QuartzCore binary.