applyClipRect(clipRect) {
    let count = this.getAttribute(glyphIndexAttrName).count
    let chunks = this._chunkedBounds
    if (chunks) {
      for (let i = chunks.length; i--;) {
        count = chunks[i].end
        let rect = chunks[i].rect
        // note: both rects are l-b-r-t
        if (rect[1] < clipRect.w && rect[3] > clipRect.y && rect[0] < clipRect.z && rect[2] > clipRect.x) {
          break
        }
      }
    }
    this.instanceCount = count
  }
Given a clipping rect, and the chunkedBounds from the last updateGlyphs call, choose the lowest
`instanceCount` that will show all glyphs within the clipped view. This is an optimization
for long blocks of text that are clipped, to skip vertex shader evaluation for glyphs that would
be clipped anyway.

Note that since `drawElementsInstanced[ANGLE]` only accepts an instance count and not a starting
offset, this optimization becomes less effective as the clipRect moves closer to the end of the
text block. We could fix that by switching from instancing to a full geometry with a drawRange,
but at the expense of much larger attribute buffers (see classdoc above.)

@param {Vector4} clipRect