private void onTransform() {
    if (transform == null) return;
    if (transform.isCompleted()) return;

    // waiting for delay
    if (!transform.hasStarted()) return;

    // fire onStartTransform event
    if (!transform.isStartEventFired()) {
      transform.setStartEventFired(true);
      view.onStartTransform(transform);
    }

    if (transform.hasExpired()) {
      // if transform has been completed, finish the transformation
      if (transform.getRepeatCount() >= transform.getRepeat()) {
        if (transform.isAutoreverse() && !transform.isReversing()) {
          // no nothing
        } else {
          applyTransform();
          completeTransform();
          return;
        }
      }

      if (transform.isAutoreverse()) {
        transform.reverse();
      } else {
        transform.restart();
      }
    }

    applyTransform();
  }
  public void onLoad(GL10 gl, QuickTiGame2dGameView view) {
    if (loaded) return;

    this.view = view;

    // load particle setting from Particle Designer XML
    loadParticleXML();

    if (gzipBase64Data != null && gzipBase64Data.length() > 0) {
      view.loadTexture(gl, image, gzipBase64Data);
      gzipBase64Data = "";
    }

    QuickTiGame2dTexture aTexture = view.getTextureFromCache(image);

    // if texture is not yet cached, try to load texture here
    if (aTexture == null && image != null) {
      view.loadTexture(gl, image);
      aTexture = view.getTextureFromCache(image);
    }

    if (aTexture != null) {
      hasTexture = true;

      if (width == 0) width = aTexture.getWidth();
      if (height == 0) height = aTexture.getHeight();
    }

    createTextureBuffer(gl);
    createQuadBuffer(gl);

    if (hasTexture && !aTexture.isSnapshot()) view.onLoadSprite(this);
    if (debug) GLHelper.checkError(gl);

    loaded = true;
  }
  private void completeTransform() {

    transform.setCompleted(true);

    view.onCompleteTransform(transform);
  }