I don't do what you want to do, but the way I do lighting could easily achieve the results you want, so let me describe the situation:
A single time, I run a script which takes a tile and separates it into a number of subpoints. For example, I might take only the center of a tile, or maybe I take 9 points forming a border that runs around the tile and the middle of the tile. At any rate, pick some source points in the tile. Then pick destination points. I think I just use the center as a destination, which makes lighting non-symmetric, but you can do whatever you want. Then draw a line from each source point to each destination point, and form an array of movements on the grid that form that line, i.e. x, y, x, x, y...
If the line from a source point to a destination point has a different path than one previously used, add that path to a list of all possible light paths from tile a to tile b. Then do this for every possible tile destination you want. Now you have a set of lists of routes for light to take to get from tile a to tile b. I store these in an input file so the calculation is actually never done within the game itself.
To see if a tile is lit, take all paths and stop if one of them reaches the source.
Now, for you, you could do the exact same thing, but check all paths and count the fraction of paths that make it. This will give you a fractional visibility value that will reflect how much the tile is blocked by walls or other possible obstructions.
This may not be the best way to do it, but it's trivial to write and takes no computation time (at least using my parameters).