@Override
 public void recycle() {
   super.recycle();
   GLCanvas canvas = mCanvasRef;
   if (canvas == null) return;
   int n = mInstanceCache.size();
   for (int i = 0; i < n; i++) {
     NinePatchInstance instance = mInstanceCache.valueAt(i);
     instance.recycle(canvas);
   }
   mInstanceCache.clear();
 }
  private NinePatchInstance findInstance(GLCanvas canvas, int w, int h) {
    int key = w;
    key = (key << 16) | h;
    NinePatchInstance instance = mInstanceCache.get(key);

    if (instance == null) {
      instance = new NinePatchInstance(this, w, h);
      NinePatchInstance removed = mInstanceCache.put(key, instance);
      if (removed != null) {
        removed.recycle(canvas);
      }
    }

    return instance;
  }
  @Override
  public void draw(GLCanvas canvas, int x, int y, int w, int h) {
    if (!isLoaded()) {
      mInstanceCache.clear();
    }

    if (w != 0 && h != 0) {
      findInstance(canvas, w, h).draw(canvas, this, x, y);
    }
  }