function ImageInfos(width, height) {
            this.width = width;
            this.height = height;
            this.infos = []; // the list of images

            /**
             *
             * @method findImage
             * @param {Integer} space
             * @return {Object} contains the ImageData, and pixel index into that
             *                  ImageData where the free space was allocated.
             *
             * finds free space of a given size in the ImageData list
             */
            this.findImage = function(space) {
              var imageSize = this.width * this.height;
              if (space > imageSize) throw new Error('font is too complex to render in 3D');

              // search through the list of images, looking for one with
              // anough unused space.
              var imageInfo, imageData;
              for (var ii = this.infos.length - 1; ii >= 0; --ii) {
                var imageInfoTest = this.infos[ii];
                if (imageInfoTest.index + space < imageSize) {
                  // found one
                  imageInfo = imageInfoTest;
                  imageData = imageInfoTest.imageData;
                  break;
                }
              }

              if (!imageInfo) {
                try {
                  // create a new image
                  imageData = new ImageData(this.width, this.height);
                } catch (err) {
                  // for browsers that don't support ImageData constructors (ie IE11)
                  // create an ImageData using the old method
                  var canvas = document.getElementsByTagName('canvas')[0];
                  var created = !canvas;
                  if (!canvas) {
                    // create a temporary canvas
                    canvas = document.createElement('canvas');
                    canvas.style.display = 'none';
                    document.body.appendChild(canvas);
                  }
                  var ctx = canvas.getContext('2d');
                  if (ctx) {
                    imageData = ctx.createImageData(this.width, this.height);
                  }
                  if (created) {
                    // distroy the temporary canvas, if necessary
                    document.body.removeChild(canvas);
                  }
                }
                // construct & dd the new image info
                imageInfo = { index: 0, imageData: imageData };
                this.infos.push(imageInfo);
              }

              var index = imageInfo.index;
              imageInfo.index += space; // move to the start of the next image
              imageData._dirty = true;
              return { imageData: imageData, index: index };
            };
          }
@method findImage
@param {Integer} space
@return {Object} contains the ImageData, and pixel index into that
                 ImageData where the free space was allocated.

finds free space of a given size in the ImageData list