We present a method of decomposing a simple polygon that allows the preprocessing of the polygon to efficiently answer visibility queries of various forms in an output sensitive manner. Using O(/i3 log /() preprocessing time and O(n3) space, we can, given a query point q inside or outside an n vertex polygon, recover the visibility polygon of q in O(log/i + k) time, where k is the size of the visibility polygon, and recover the number of vertices visible from q in O(log n) time. The key notion behind the decomposition is the succinct representation of visibility regions, and tight bounds on the number of such regions. These techniques are extended to handle other types of queries, such as visibility of fixed points other than the polygon vertices, and for visibility from a line segment rather than a point. Some of these results have been obtained independently by Guibas, Motwani and Raghavan [18].