private void drawFlippingHalf(Canvas canvas) {
    final View v = viewForPage(getCurrentPageRound());

    setDrawWithLayer(v, true);
    final float degreesFlipped = getDegreesFlipped();
    canvas.save();
    mCamera.save();

    if (degreesFlipped > 90) {
      canvas.clipRect(isFlippingVertically() ? mTopRect : mLeftRect);
      if (mIsFlippingVertically) {
        mCamera.rotateX(degreesFlipped - 180);
      } else {
        mCamera.rotateY(180 - degreesFlipped);
      }
    } else {
      canvas.clipRect(isFlippingVertically() ? mBottomRect : mRightRect);
      if (mIsFlippingVertically) {
        mCamera.rotateX(degreesFlipped);
      } else {
        mCamera.rotateY(-degreesFlipped);
      }
    }

    mCamera.getMatrix(mMatrix);

    positionMatrix();
    canvas.concat(mMatrix);

    v.draw(canvas);

    drawFlippingShadeShine(canvas);

    mCamera.restore();
    canvas.restore();
  }