static void affineTransformCompose(AffineTransform& m, const double sr[9]) { m.setA(sr[3]); m.setB(sr[4]); m.setC(sr[5]); m.setD(sr[6]); m.setE(sr[7]); m.setF(sr[8]); m.rotate(rad2deg(sr[2])); m.scale(sr[0], sr[1]); }
static void dAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) { INC_STATS("DOM.SVGMatrix.d._set"); V8SVGPODTypeWrapper<AffineTransform>* wrapper = V8SVGPODTypeWrapper<AffineTransform>::toNative(info.Holder()); AffineTransform impInstance = *wrapper; AffineTransform* imp = &impInstance; double v = static_cast<double>(value->NumberValue()); imp->setD(v); wrapper->commitChange(*imp, V8Proxy::svgContext(wrapper)); return; }
static inline void normalizeTransform(AffineTransform& transform) { // Obtain consistent numerical results for the AffineTransform on both 32/64bit platforms. // Tested with SnowLeopard on Core Duo vs. Core 2 Duo. static const float s_floatEpsilon = std::numeric_limits<float>::epsilon(); if (fabs(transform.a() - 1) <= s_floatEpsilon) transform.setA(1); else if (fabs(transform.a() + 1) <= s_floatEpsilon) transform.setA(-1); if (fabs(transform.d() - 1) <= s_floatEpsilon) transform.setD(1); else if (fabs(transform.d() + 1) <= s_floatEpsilon) transform.setD(-1); if (fabs(transform.e()) <= s_floatEpsilon) transform.setE(0); if (fabs(transform.f()) <= s_floatEpsilon) transform.setF(0); }