       @dash_atlas = new DashAtlas(gl)
 
     draw: (indices, mainGlyph, trans) ->
-
-      if @data_changed
-        @_baked_offset = [trans.dx, trans.dy]  # float32 precision workaround; used in _bake() and below
-        @_set_data()
-        @data_changed = false
+      mainGlGlyph = mainGlyph.glglyph
+      
+      if mainGlGlyph.data_changed
+        mainGlGlyph._baked_offset = [trans.dx, trans.dy]  # float32 precision workaround; used in _bake() and below
+        mainGlGlyph._set_data()
+        mainGlGlyph.data_changed = false
       if @visuals_changed
         @_set_visuals()
         @visuals_changed = false

  draw: (indices, mainGlyph, trans) ->

    # The main glyph has the data, *this* glyph has the visuals.
    nvertices = mainGlyph.glglyph.nvertices
   
    # Upload data if we must. Only happens for main glyph.
    if @data_changed
      @_baked_offset = [trans.dx, trans.dy]  # float32 precision workaround; used in _set_data() and below
      @_set_data(nvertices)
      @data_changed = false
    else if @glyph.radius? and (trans.sx != @last_trans.sx or trans.sy != @last_trans.sy)
      # Keep screen radius up-to-date for circle glyph. Only happens when a radius is given
      @last_trans = trans

        offset = chunk * chunksize * 4
        if these_indices.length == 0
          continue
        @prog.set_attribute('a_x', 'float', [mainGlGlyph.vbo_x, 0, offset])
        @prog.set_attribute('a_y', 'float', [mainGlGlyph.vbo_y, 0, offset])
        @prog.set_attribute('a_size', 'float', [mainGlGlyph.vbo_s, 0, offset])
        @prog.set_attribute('a_angle', 'float', [mainGlGlyph.vbo_a, 0, offset])
        if @vbo_linewidth.used
          @prog.set_attribute('a_linewidth', 'float', [@vbo_linewidth, 0, offset])
        if @vbo_fg_color.used
