void KGameSvgDocument::skew(double xDegrees, double yDegrees, const MatrixOptions& options) { double xRadians = xDegrees * (M_PI / 180); double yRadians = yDegrees * (M_PI / 180); shear(xRadians, yRadians, options); }
int XFormView::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = ArthurFrame::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 15) qt_static_metacall(this, _c, _id, _a); _id -= 15; } #ifndef QT_NO_PROPERTIES else if (_c == QMetaObject::ReadProperty) { void *_v = _a[0]; switch (_id) { case 0: *reinterpret_cast< XFormType*>(_v) = type(); break; case 1: *reinterpret_cast< bool*>(_v) = animation(); break; case 2: *reinterpret_cast< qreal*>(_v) = shear(); break; case 3: *reinterpret_cast< qreal*>(_v) = rotation(); break; case 4: *reinterpret_cast< qreal*>(_v) = scale(); break; case 5: *reinterpret_cast< QString*>(_v) = text(); break; case 6: *reinterpret_cast< QPixmap*>(_v) = pixmap(); break; } _id -= 7; } else if (_c == QMetaObject::WriteProperty) { void *_v = _a[0]; switch (_id) { case 0: setType(*reinterpret_cast< XFormType*>(_v)); break; case 1: setAnimation(*reinterpret_cast< bool*>(_v)); break; case 2: setShear(*reinterpret_cast< qreal*>(_v)); break; case 3: setRotation(*reinterpret_cast< qreal*>(_v)); break; case 4: setScale(*reinterpret_cast< qreal*>(_v)); break; case 5: setText(*reinterpret_cast< QString*>(_v)); break; case 6: setPixmap(*reinterpret_cast< QPixmap*>(_v)); break; } _id -= 7; } else if (_c == QMetaObject::ResetProperty) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyDesignable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyScriptable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyStored) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyEditable) { _id -= 7; } else if (_c == QMetaObject::QueryPropertyUser) { _id -= 7; } #endif // QT_NO_PROPERTIES return _id; }
AffineTransform& AffineTransform::skewY(double angle) { return shear(0, tan(deg2rad(angle))); }
AffineTransform& AffineTransform::skewX(double angle) { return shear(tan(deg2rad(angle)), 0); }
AffineTransform& AffineTransform::skew(double angleX, double angleY) { return shear(tan(deg2rad(angleX)), tan(deg2rad(angleY))); }
AffineTransform& AffineTransform::skewY(double angle) { return shear(0.0f, tan(angle * deg2rad)); }
AffineTransform& AffineTransform::skewX(double angle) { return shear(tan(angle * deg2rad), 0.0f); }
void Transform::shear(const Vector2d& factor) { shear(factor.x, factor.y); }
TBool CHuiFxVg10TransformFilter::Draw(CHuiFxEngine& /*aEngine*/, CHuiGc& /*aGc*/, CHuiFxRenderbuffer& aTarget, CHuiFxRenderbuffer& aSource, const TRect& /*aTargetRect*/, const TRect& aSourceRect, TBool /*aHasSurface*/) { aSource.BindAsTexture(ERenderbufferUsageReadOnly); aTarget.BindAsRenderTarget(); VGImage srcImage = (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(&aSource))->AcquireSubImage(aSourceRect); vgLoadIdentity(); vgScale(iScaleX, iScaleY); vgSeti(VG_BLEND_MODE, VG_BLEND_SRC); vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_NORMAL); identity(); // Matrix multiplication is generally not commutative. // Therefore the order of the transformations matters. // In order to prevent the scaling ang skewing from affecting the translation, // if seems wiser to do the translation first, otherwise the results seem to be unpredictable. // Translation if (iTranslationX != 0.0f || iTranslationY != 0.0f || iTranslationZ != 0.0f) { translate(iTranslationX, iTranslationY, iTranslationZ); } // Scaling if (iScaleX != 1.0f || iScaleY != 1.0f || iScaleZ != 1.0f) { translate(iScaleOriginX, iScaleOriginY, iScaleOriginZ); scale(iScaleX, iScaleY, iScaleZ); translate(-iScaleOriginX, -iScaleOriginY, -iScaleOriginZ); } // Skewing if (iSkewAngleX != 0.0f || iSkewAngleY != 0.0f || iSkewAngleZ != 0.0f) { const TReal32 radsPerDeg = 2.0f * (float)M_PI / 360.0f; TReal32 skewX = tan(iSkewAngleX * radsPerDeg); TReal32 skewY = tan(iSkewAngleY * radsPerDeg); TReal32 skewZ = tan(iSkewAngleZ * radsPerDeg); translate(iSkewOriginX, iSkewOriginY, iSkewOriginZ); shear(skewX, skewY, skewZ); translate(-iSkewOriginX, -iSkewOriginY, -iSkewOriginZ); } // Rotation if (iRotationAngle != 0.0f) { translate(iRotationOriginX, iRotationOriginY, iRotationOriginZ); rotate(iRotationAngle, iRotationAxisX, iRotationAxisY, iRotationAxisZ); translate(-iRotationOriginX, -iRotationOriginY, -iRotationOriginZ); } /* // Translation if (iTranslationX != 0.0f || iTranslationY != 0.0f || iTranslationZ != 0.0f) { translate(iTranslationX, iTranslationY, iTranslationZ); } */ ASSERT(!"TODO: implement the following:"); // TODO: project vertices // TODO: create warp quad matrix from projected vertices, // see http://torus.untergrund.net/misc/projective_image_warping.pdf // TODO load matrix vgDrawImage(srcImage); // TODO: pixel relative parameters HUIFX_VG_INVARIANT(); (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(&aSource))->ReleaseSubImage(srcImage); aTarget.UnbindAsRenderTarget(); aSource.UnbindAsTexture(); return ETrue; }