The function draw-mask in your example takes two arguments. The first is app-state, which is not used in your code, and the second can be one of several different types of data: values from a map, a string, a list, or most commonly, a vector. You can see the different types here that can be used in nthFrom in the clojure code.
This is called sequential destructuring, and as other comments above mention, it's a big topic. However, for your case, this is how it works:
(draw-mask xyz [3 9]) ---> In draw-mask, r is 3, and c is 9.
(draw-mask xyz [3]) ---> In draw-mask, r is 3, and c is nil.
(draw-mask xyz [3 9 12]) ---> In draw-mask, r is 3, and c is 9 -- 12 is not bound
One clarification here: whether or not a structure is seqable? is not the main criteria for being able to be destructured. For example, a set is seqable? but cannot be destructured. The main criteria for sequential destructuring (different from associative destructuring, using maps, which is not discussed here) is that nth must be supported on it. In RT.java, you will see the list of possible types. They are: CharSequence, a native Java array, RandomAccess, Matcher, Map.Entry, and Sequential (Sequential will cover the most common structures: list and vector).
deconstruct(or something like that) macro. It just turns it into calls tofirst,rest, andnthfor lists, and delegates to accessors for maps. Just typical macro "magic".