Although the number of photons flying around us is staggering, the surface areas in type at reading sizes are quite small. Our eyes also just sample a small number of them. This is an attempt at calculating the number of photons reflecting off a small shape in a letterform. In order to get an idea of what’s going on, I sketched out some of the factors and parameters in a python script. This is by no means a finished project, but I thought it might be fun to share.

If you have RoboFont (or RoboFab) you can calculate with an actual shape. If you don’t, no worries, the script then assumes you have a shape of 100 by 100 em units.

### Step 1: Script

The python script calculates the surface area of the whole shape in the current glyph (in itself a cute bit of code—it’s a fast implementation). I didn’t want to add too much code that’s really RoboFont specific, so if you want to see how the calculation works for a specific counter, copy it to a separate glyph first so that it is a black shape. This has no bearing on the outcome, it’s just for convenience. Whenever the script uses assumed values, references for those values are included.

### Step 2: Area

Let’s assume we have a shape of 100 by 100 em units. The surface area is 10000 square em units. Printed at 8 PostScript points, that’s 0.0796493828164 square mm or 7.96493828164e-08 square meter.

### Step 3: Light

Wikipedia lists the average light in an office as 320-500 lx. I’m using the average of that, 410 lx. Our small shape then receives 3.26562469547e-05 lux.

### Step 4: Photons per second

The unit Lux is 1 lumen per square meter. I have listed different values for photons per lumen. White light consists of different frequencies, each with their own energy. I’m ignoring the spectral analysis of office light. Instead I’m assuming 1.3*10e16 as the number of photons per second per lumen of white light. I already know the lux for the shape, so that gives me 4.24531210411e+12 photons per second shining on the surface.

### Step 5: Paper

The paper itself is not a perfect mirror, some of the light that reaches its surface will be absorbed. Paper will appear to have color because some frequencies are absorbed more than others. Different papers (coated, uncoated etc.) will reflect the light in different ways. For this calculation I assume the paper reflects the light diffusely. Currently the script assumes that 60% of the light that shines on the paper is reflected.

### Step 6: Distance

The paper uniformly scatters the light in all directions. That means that the previous number of photons will be distributed over a hemisphere, with the shape at the center. I assume the shape is 400 mm from the eye, roughly arm’s length. This means the light is distributed over a hemispere with a surface of 134041286.553 square mm.

### Eye

The eye captures a small fraction of that hemisphere. Let’s assume the pupil has a diameter of 4mm, the area that’s open for business is 12.5663706144 square mm. That means the pupil captures just a factor of 9.375e-08 of the light that reflects off our shape. Multiplied with the photons per second calculated earlier we get 238799 photons per second captured by the pupil. That’s the total number for the whole shape.

The photons reflected per em unit, at 8pt, at 400mm, under average office light conditions is 23.

### More math

Sources show that less than 10% of the light captured by the eye actually contributes to vision by triggering a photoreceptor. The rest is absorbed by the tissues and humour of the eye. I didn’t include this in the calculation as it seems a very rough estimate already.

Assuming the eye has a focal length of 23 mm, and also that the shape is more or less square, the projection of our shape on the retina is 0.0157338888988 mm wide. Based on an average value for the density of photoreceptors in the fovea that means an equivalent of 49 photoreceptors receive light reflected by our shape. The earlier result of 23 photons per second per font unit gives me 0.48 photons per second per font unit for photoreceptor.

If we change the distance to the eye to 200mm (we hold the book closer) the number increases to 0.96. Playing around with the parameters in the script is fun.

### Discussion

This calculation is based on a number of assumptions. The number for photons per lumen is the main one and it seems a rough estimate. Also these calculations do not factor in the diffraction that happens in the eye. This is a considerable issue (and the topic of another math project). The projected image on the retina will be larger and more blurred than what I calculated, so more photoreceptors will be involved but they will respond to fewer photons. These calculations are not precise and the values used in this calculation are not results of my own measurements. It really is a sketch to get an idea of the orders of magnitude. But the scale and geometry of the calculation should be reasonably correct. Perhaps rather than trying to count photons it might be better to calculate the amounts of energy.

### Conclusion

The shapes in type at reading sizes are very small. The amount of light reflected by these small shapes is tiny. At this scale the physical limitations of the eye are considerable. The boundaries for type design, typography and printing are set by physiological limitations. As a type designer it might be useful to try and understand them. Math should not control esthetic decisions but could perhaps curb some enthusiasm. Before spending hours on that perfect little cut in the serif ask yourself if any of it will be seen. Only the rough parameters of type: weight, rhythm and proportion matter at this scale. Isn’t it great how economic the process of reading and typography has become?

### Revisions

March 25 2013. I lowered the reflectivity of the paper from 0.98 to 0.6. All subsequent values have been changed. Also note that the python script (version 1.2) has the distance set to 200 mm. This article describes the results for 400 mm.

December 11, 2014. A careful reader pointed out a mistake in one part of the calculation.

June 15, 2018, script updated for python3.

Script updated. Available here.