Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: cc/math_util.cc

Issue 11369018: cc: Switch from WebCore::FloatPoint3D to gfx::Point3F and gfx::Vector3dF in the compositor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Missing base files Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "cc/math_util.h" 7 #include "cc/math_util.h"
8 8
9 #include "FloatQuad.h" 9 #include "FloatQuad.h"
10 #include "FloatSize.h" 10 #include "FloatSize.h"
(...skipping 22 matching lines...) Expand all
33 // implicit definition of w = 1; 33 // implicit definition of w = 1;
34 34
35 double outX = x * transform.m11() + y * transform.m21() + z * transform.m31( ) + transform.m41(); 35 double outX = x * transform.m11() + y * transform.m21() + z * transform.m31( ) + transform.m41();
36 double outY = x * transform.m12() + y * transform.m22() + z * transform.m32( ) + transform.m42(); 36 double outY = x * transform.m12() + y * transform.m22() + z * transform.m32( ) + transform.m42();
37 double outZ = x * transform.m13() + y * transform.m23() + z * transform.m33( ) + transform.m43(); 37 double outZ = x * transform.m13() + y * transform.m23() + z * transform.m33( ) + transform.m43();
38 double outW = x * transform.m14() + y * transform.m24() + z * transform.m34( ) + transform.m44(); 38 double outW = x * transform.m14() + y * transform.m24() + z * transform.m34( ) + transform.m44();
39 39
40 return HomogeneousCoordinate(outX, outY, outZ, outW); 40 return HomogeneousCoordinate(outX, outY, outZ, outW);
41 } 41 }
42 42
43 static HomogeneousCoordinate mapHomogeneousPoint(const WebTransformationMatrix& transform, const FloatPoint3D& p) 43 static HomogeneousCoordinate mapHomogeneousPoint(const WebTransformationMatrix& transform, const gfx::Point3F& p)
44 { 44 {
45 double x = p.x(); 45 double x = p.x();
46 double y = p.y(); 46 double y = p.y();
47 double z = p.z(); 47 double z = p.z();
48 // implicit definition of w = 1; 48 // implicit definition of w = 1;
49 49
50 double outX = x * transform.m11() + y * transform.m21() + z * transform.m31( ) + transform.m41(); 50 double outX = x * transform.m11() + y * transform.m21() + z * transform.m31( ) + transform.m41();
51 double outY = x * transform.m12() + y * transform.m22() + z * transform.m32( ) + transform.m42(); 51 double outY = x * transform.m12() + y * transform.m22() + z * transform.m32( ) + transform.m42();
52 double outZ = x * transform.m13() + y * transform.m23() + z * transform.m33( ) + transform.m43(); 52 double outZ = x * transform.m13() + y * transform.m23() + z * transform.m33( ) + transform.m43();
53 double outW = x * transform.m14() + y * transform.m24() + z * transform.m34( ) + transform.m44(); 53 double outW = x * transform.m14() + y * transform.m24() + z * transform.m34( ) + transform.m44();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 gfx::RectF MathUtil::mapClippedRect(const WebTransformationMatrix& transform, co nst gfx::RectF& srcRect) 106 gfx::RectF MathUtil::mapClippedRect(const WebTransformationMatrix& transform, co nst gfx::RectF& srcRect)
107 { 107 {
108 if (transform.isIdentityOrTranslation()) { 108 if (transform.isIdentityOrTranslation()) {
109 gfx::RectF mappedRect(srcRect); 109 gfx::RectF mappedRect(srcRect);
110 mappedRect.Offset(static_cast<float>(transform.m41()), static_cast<float >(transform.m42())); 110 mappedRect.Offset(static_cast<float>(transform.m41()), static_cast<float >(transform.m42()));
111 return mappedRect; 111 return mappedRect;
112 } 112 }
113 113
114 // Apply the transform, but retain the result in homogeneous coordinates. 114 // Apply the transform, but retain the result in homogeneous coordinates.
115 FloatQuad q = FloatQuad(gfx::RectF(srcRect)); 115 FloatQuad q = FloatQuad(gfx::RectF(srcRect));
116 HomogeneousCoordinate h1 = mapHomogeneousPoint(transform, q.p1()); 116 HomogeneousCoordinate h1 = mapHomogeneousPoint(transform, gfx::Point3F(q.p1( )));
117 HomogeneousCoordinate h2 = mapHomogeneousPoint(transform, q.p2()); 117 HomogeneousCoordinate h2 = mapHomogeneousPoint(transform, gfx::Point3F(q.p2( )));
118 HomogeneousCoordinate h3 = mapHomogeneousPoint(transform, q.p3()); 118 HomogeneousCoordinate h3 = mapHomogeneousPoint(transform, gfx::Point3F(q.p3( )));
119 HomogeneousCoordinate h4 = mapHomogeneousPoint(transform, q.p4()); 119 HomogeneousCoordinate h4 = mapHomogeneousPoint(transform, gfx::Point3F(q.p4( )));
120 120
121 return computeEnclosingClippedRect(h1, h2, h3, h4); 121 return computeEnclosingClippedRect(h1, h2, h3, h4);
122 } 122 }
123 123
124 gfx::RectF MathUtil::projectClippedRect(const WebTransformationMatrix& transform , const gfx::RectF& srcRect) 124 gfx::RectF MathUtil::projectClippedRect(const WebTransformationMatrix& transform , const gfx::RectF& srcRect)
125 { 125 {
126 // Perform the projection, but retain the result in homogeneous coordinates. 126 // Perform the projection, but retain the result in homogeneous coordinates.
127 FloatQuad q = FloatQuad(gfx::RectF(srcRect)); 127 FloatQuad q = FloatQuad(gfx::RectF(srcRect));
128 HomogeneousCoordinate h1 = projectHomogeneousPoint(transform, q.p1()); 128 HomogeneousCoordinate h1 = projectHomogeneousPoint(transform, q.p1());
129 HomogeneousCoordinate h2 = projectHomogeneousPoint(transform, q.p2()); 129 HomogeneousCoordinate h2 = projectHomogeneousPoint(transform, q.p2());
130 HomogeneousCoordinate h3 = projectHomogeneousPoint(transform, q.p3()); 130 HomogeneousCoordinate h3 = projectHomogeneousPoint(transform, q.p3());
131 HomogeneousCoordinate h4 = projectHomogeneousPoint(transform, q.p4()); 131 HomogeneousCoordinate h4 = projectHomogeneousPoint(transform, q.p4());
132 132
133 return computeEnclosingClippedRect(h1, h2, h3, h4); 133 return computeEnclosingClippedRect(h1, h2, h3, h4);
134 } 134 }
135 135
136 void MathUtil::mapClippedQuad(const WebTransformationMatrix& transform, const Fl oatQuad& srcQuad, gfx::PointF clippedQuad[8], int& numVerticesInClippedQuad) 136 void MathUtil::mapClippedQuad(const WebTransformationMatrix& transform, const Fl oatQuad& srcQuad, gfx::PointF clippedQuad[8], int& numVerticesInClippedQuad)
137 { 137 {
138 HomogeneousCoordinate h1 = mapHomogeneousPoint(transform, srcQuad.p1()); 138 HomogeneousCoordinate h1 = mapHomogeneousPoint(transform, gfx::Point3F(srcQu ad.p1()));
139 HomogeneousCoordinate h2 = mapHomogeneousPoint(transform, srcQuad.p2()); 139 HomogeneousCoordinate h2 = mapHomogeneousPoint(transform, gfx::Point3F(srcQu ad.p2()));
140 HomogeneousCoordinate h3 = mapHomogeneousPoint(transform, srcQuad.p3()); 140 HomogeneousCoordinate h3 = mapHomogeneousPoint(transform, gfx::Point3F(srcQu ad.p3()));
141 HomogeneousCoordinate h4 = mapHomogeneousPoint(transform, srcQuad.p4()); 141 HomogeneousCoordinate h4 = mapHomogeneousPoint(transform, gfx::Point3F(srcQu ad.p4()));
142 142
143 // The order of adding the vertices to the array is chosen so that clockwise / counter-clockwise orientation is retained. 143 // The order of adding the vertices to the array is chosen so that clockwise / counter-clockwise orientation is retained.
144 144
145 numVerticesInClippedQuad = 0; 145 numVerticesInClippedQuad = 0;
146 146
147 if (!h1.shouldBeClipped()) 147 if (!h1.shouldBeClipped())
148 addVertexToClippedQuad(h1.cartesianPoint2d(), clippedQuad, numVerticesIn ClippedQuad); 148 addVertexToClippedQuad(h1.cartesianPoint2d(), clippedQuad, numVerticesIn ClippedQuad);
149 149
150 if (h1.shouldBeClipped() ^ h2.shouldBeClipped()) 150 if (h1.shouldBeClipped() ^ h2.shouldBeClipped())
151 addVertexToClippedQuad(computeClippedPointForEdge(h1, h2).cartesianPoint 2d(), clippedQuad, numVerticesInClippedQuad); 151 addVertexToClippedQuad(computeClippedPointForEdge(h1, h2).cartesianPoint 2d(), clippedQuad, numVerticesInClippedQuad);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 239
240 FloatQuad MathUtil::mapQuad(const WebTransformationMatrix& transform, const Floa tQuad& q, bool& clipped) 240 FloatQuad MathUtil::mapQuad(const WebTransformationMatrix& transform, const Floa tQuad& q, bool& clipped)
241 { 241 {
242 if (transform.isIdentityOrTranslation()) { 242 if (transform.isIdentityOrTranslation()) {
243 FloatQuad mappedQuad(q); 243 FloatQuad mappedQuad(q);
244 mappedQuad.move(static_cast<float>(transform.m41()), static_cast<float>( transform.m42())); 244 mappedQuad.move(static_cast<float>(transform.m41()), static_cast<float>( transform.m42()));
245 clipped = false; 245 clipped = false;
246 return mappedQuad; 246 return mappedQuad;
247 } 247 }
248 248
249 HomogeneousCoordinate h1 = mapHomogeneousPoint(transform, q.p1()); 249 HomogeneousCoordinate h1 = mapHomogeneousPoint(transform, gfx::Point3F(q.p1( )));
250 HomogeneousCoordinate h2 = mapHomogeneousPoint(transform, q.p2()); 250 HomogeneousCoordinate h2 = mapHomogeneousPoint(transform, gfx::Point3F(q.p2( )));
251 HomogeneousCoordinate h3 = mapHomogeneousPoint(transform, q.p3()); 251 HomogeneousCoordinate h3 = mapHomogeneousPoint(transform, gfx::Point3F(q.p3( )));
252 HomogeneousCoordinate h4 = mapHomogeneousPoint(transform, q.p4()); 252 HomogeneousCoordinate h4 = mapHomogeneousPoint(transform, gfx::Point3F(q.p4( )));
253 253
254 clipped = h1.shouldBeClipped() || h2.shouldBeClipped() || h3.shouldBeClipped () || h4.shouldBeClipped(); 254 clipped = h1.shouldBeClipped() || h2.shouldBeClipped() || h3.shouldBeClipped () || h4.shouldBeClipped();
255 255
256 // Result will be invalid if clipped == true. But, compute it anyway just in case, to emulate existing behavior. 256 // Result will be invalid if clipped == true. But, compute it anyway just in case, to emulate existing behavior.
257 return FloatQuad(h1.cartesianPoint2d(), h2.cartesianPoint2d(), h3.cartesianP oint2d(), h4.cartesianPoint2d()); 257 return FloatQuad(h1.cartesianPoint2d(), h2.cartesianPoint2d(), h3.cartesianP oint2d(), h4.cartesianPoint2d());
258 } 258 }
259 259
260 gfx::PointF MathUtil::mapPoint(const WebTransformationMatrix& transform, const g fx::PointF& p, bool& clipped) 260 gfx::PointF MathUtil::mapPoint(const WebTransformationMatrix& transform, const g fx::PointF& p, bool& clipped)
261 { 261 {
262 HomogeneousCoordinate h = mapHomogeneousPoint(transform, cc::FloatPoint(p)); 262 HomogeneousCoordinate h = mapHomogeneousPoint(transform, gfx::Point3F(p));
263 263
264 if (h.w > 0) { 264 if (h.w > 0) {
265 clipped = false; 265 clipped = false;
266 return h.cartesianPoint2d(); 266 return h.cartesianPoint2d();
267 } 267 }
268 268
269 // The cartesian coordinates will be invalid after dividing by w. 269 // The cartesian coordinates will be invalid after dividing by w.
270 clipped = true; 270 clipped = true;
271 271
272 // Avoid dividing by w if w == 0. 272 // Avoid dividing by w if w == 0.
273 if (!h.w) 273 if (!h.w)
274 return gfx::PointF(); 274 return gfx::PointF();
275 275
276 // This return value will be invalid because clipped == true, but (1) users of this 276 // This return value will be invalid because clipped == true, but (1) users of this
277 // code should be ignoring the return value when clipped == true anyway, and (2) this 277 // code should be ignoring the return value when clipped == true anyway, and (2) this
278 // behavior is more consistent with existing behavior of WebKit transforms i f the user 278 // behavior is more consistent with existing behavior of WebKit transforms i f the user
279 // really does not ignore the return value. 279 // really does not ignore the return value.
280 return h.cartesianPoint2d(); 280 return h.cartesianPoint2d();
281 } 281 }
282 282
283 FloatPoint3D MathUtil::mapPoint(const WebTransformationMatrix& transform, const FloatPoint3D& p, bool& clipped) 283 gfx::Point3F MathUtil::mapPoint(const WebTransformationMatrix& transform, const gfx::Point3F& p, bool& clipped)
284 { 284 {
285 HomogeneousCoordinate h = mapHomogeneousPoint(transform, p); 285 HomogeneousCoordinate h = mapHomogeneousPoint(transform, p);
286 286
287 if (h.w > 0) { 287 if (h.w > 0) {
288 clipped = false; 288 clipped = false;
289 return h.cartesianPoint3d(); 289 return h.cartesianPoint3d();
290 } 290 }
291 291
292 // The cartesian coordinates will be invalid after dividing by w. 292 // The cartesian coordinates will be invalid after dividing by w.
293 clipped = true; 293 clipped = true;
294 294
295 // Avoid dividing by w if w == 0. 295 // Avoid dividing by w if w == 0.
296 if (!h.w) 296 if (!h.w)
297 return FloatPoint3D(); 297 return gfx::Point3F();
298 298
299 // This return value will be invalid because clipped == true, but (1) users of this 299 // This return value will be invalid because clipped == true, but (1) users of this
300 // code should be ignoring the return value when clipped == true anyway, and (2) this 300 // code should be ignoring the return value when clipped == true anyway, and (2) this
301 // behavior is more consistent with existing behavior of WebKit transforms i f the user 301 // behavior is more consistent with existing behavior of WebKit transforms i f the user
302 // really does not ignore the return value. 302 // really does not ignore the return value.
303 return h.cartesianPoint3d(); 303 return h.cartesianPoint3d();
304 } 304 }
305 305
306 FloatQuad MathUtil::projectQuad(const WebTransformationMatrix& transform, const FloatQuad& q, bool& clipped) 306 FloatQuad MathUtil::projectQuad(const WebTransformationMatrix& transform, const FloatQuad& q, bool& clipped)
307 { 307 {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 } 387 }
388 388
389 FloatSize MathUtil::projectVector(const FloatSize& source, const FloatSize& dest ination) 389 FloatSize MathUtil::projectVector(const FloatSize& source, const FloatSize& dest ination)
390 { 390 {
391 float sourceDotDestination = source.width() * destination.width() + source.h eight() * destination.height(); 391 float sourceDotDestination = source.width() * destination.width() + source.h eight() * destination.height();
392 float projectedLength = sourceDotDestination / destination.diagonalLengthSqu ared(); 392 float projectedLength = sourceDotDestination / destination.diagonalLengthSqu ared();
393 return FloatSize(projectedLength * destination.width(), projectedLength * de stination.height()); 393 return FloatSize(projectedLength * destination.width(), projectedLength * de stination.height());
394 } 394 }
395 395
396 } // namespace cc 396 } // namespace cc
OLDNEW
« cc/cc.gyp ('K') | « cc/math_util.h ('k') | cc/math_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698