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

Side by Side Diff: include/core/SkMatrix44.h

Issue 2098583002: SkMatrix44 clarifications and clean-ups (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 6 months 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
« no previous file with comments | « no previous file | src/codec/SkPngCodec.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkMatrix44_DEFINED 8 #ifndef SkMatrix44_DEFINED
9 #define SkMatrix44_DEFINED 9 #define SkMatrix44_DEFINED
10 10
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 class SK_API SkMatrix44 { 129 class SK_API SkMatrix44 {
130 public: 130 public:
131 131
132 enum Uninitialized_Constructor { 132 enum Uninitialized_Constructor {
133 kUninitialized_Constructor 133 kUninitialized_Constructor
134 }; 134 };
135 enum Identity_Constructor { 135 enum Identity_Constructor {
136 kIdentity_Constructor 136 kIdentity_Constructor
137 }; 137 };
138 138
139 SkMatrix44(Uninitialized_Constructor) { } 139 SkMatrix44(Uninitialized_Constructor) {}
140 SkMatrix44(Identity_Constructor) { this->setIdentity(); } 140
141 constexpr SkMatrix44(Identity_Constructor)
142 : fMat{{ 1, 0, 0, 0, },
143 { 0, 1, 0, 0, },
144 { 0, 0, 1, 0, },
145 { 0, 0, 0, 1, }}
146 , fTypeMask(kIdentity_Mask)
147 {}
141 148
142 SK_ATTR_DEPRECATED("use the constructors that take an enum") 149 SK_ATTR_DEPRECATED("use the constructors that take an enum")
143 SkMatrix44() { this->setIdentity(); } 150 SkMatrix44() { this->setIdentity(); }
144 151
145 SkMatrix44(const SkMatrix44& src) { 152 SkMatrix44(const SkMatrix44& src) {
146 memcpy(fMat, src.fMat, sizeof(fMat)); 153 memcpy(fMat, src.fMat, sizeof(fMat));
147 fTypeMask = src.fTypeMask; 154 fTypeMask = src.fTypeMask;
148 } 155 }
149 156
150 SkMatrix44(const SkMatrix44& a, const SkMatrix44& b) { 157 SkMatrix44(const SkMatrix44& a, const SkMatrix44& b) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 return SkMScalarToFloat(this->get(row, col)); 281 return SkMScalarToFloat(this->get(row, col));
275 } 282 }
276 inline void setFloat(int row, int col, float value) { 283 inline void setFloat(int row, int col, float value) {
277 this->set(row, col, SkFloatToMScalar(value)); 284 this->set(row, col, SkFloatToMScalar(value));
278 } 285 }
279 286
280 /** These methods allow one to efficiently read matrix entries into an 287 /** These methods allow one to efficiently read matrix entries into an
281 * array. The given array must have room for exactly 16 entries. Whenever 288 * array. The given array must have room for exactly 16 entries. Whenever
282 * possible, they will try to use memcpy rather than an entry-by-entry 289 * possible, they will try to use memcpy rather than an entry-by-entry
283 * copy. 290 * copy.
291 *
292 * Col major indicates that consecutive elements of columns will be stored
293 * contiguously in memory. Row major indicates that consecutive elements
294 * of rows will be stored contiguously in memory.
284 */ 295 */
285 void asColMajorf(float[]) const; 296 void asColMajorf(float[]) const;
286 void asColMajord(double[]) const; 297 void asColMajord(double[]) const;
287 void asRowMajorf(float[]) const; 298 void asRowMajorf(float[]) const;
288 void asRowMajord(double[]) const; 299 void asRowMajord(double[]) const;
289 300
290 /** These methods allow one to efficiently set all matrix entries from an 301 /** These methods allow one to efficiently set all matrix entries from an
291 * array. The given array must have room for exactly 16 entries. Whenever 302 * array. The given array must have room for exactly 16 entries. Whenever
292 * possible, they will try to use memcpy rather than an entry-by-entry 303 * possible, they will try to use memcpy rather than an entry-by-entry
293 * copy. 304 * copy.
305 *
306 * Col major indicates that input memory will be treated as if consecutive
307 * elements of columns are stored contiguously in memory. Row major
308 * indicates that input memory will be treated as if consecutive elements
309 * of rows are stored contiguously in memory.
294 */ 310 */
295 void setColMajorf(const float[]); 311 void setColMajorf(const float[]);
296 void setColMajord(const double[]); 312 void setColMajord(const double[]);
297 void setRowMajorf(const float[]); 313 void setRowMajorf(const float[]);
298 void setRowMajord(const double[]); 314 void setRowMajord(const double[]);
299 315
300 #ifdef SK_MSCALAR_IS_FLOAT 316 #ifdef SK_MSCALAR_IS_FLOAT
301 void setColMajor(const SkMScalar data[]) { this->setColMajorf(data); } 317 void setColMajor(const SkMScalar data[]) { this->setColMajorf(data); }
302 void setRowMajor(const SkMScalar data[]) { this->setRowMajorf(data); } 318 void setRowMajor(const SkMScalar data[]) { this->setRowMajorf(data); }
303 #else 319 #else
304 void setColMajor(const SkMScalar data[]) { this->setColMajord(data); } 320 void setColMajor(const SkMScalar data[]) { this->setColMajord(data); }
305 void setRowMajor(const SkMScalar data[]) { this->setRowMajord(data); } 321 void setRowMajor(const SkMScalar data[]) { this->setRowMajord(data); }
306 #endif 322 #endif
307 323
308 /* This sets the top-left of the matrix and clears the translation and 324 /* This sets the top-left of the matrix and clears the translation and
309 * perspective components (with [3][3] set to 1). */ 325 * perspective components (with [3][3] set to 1). mXY is interpreted
326 * as the matrix entry at col = X, row = Y. */
310 void set3x3(SkMScalar m00, SkMScalar m01, SkMScalar m02, 327 void set3x3(SkMScalar m00, SkMScalar m01, SkMScalar m02,
311 SkMScalar m10, SkMScalar m11, SkMScalar m12, 328 SkMScalar m10, SkMScalar m11, SkMScalar m12,
312 SkMScalar m20, SkMScalar m21, SkMScalar m22); 329 SkMScalar m20, SkMScalar m21, SkMScalar m22);
313 void set3x3ColMajorf(const float[]); 330 void set3x3RowMajorf(const float[]);
314 331
315 void setTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz); 332 void setTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz);
316 void preTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz); 333 void preTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz);
317 void postTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz); 334 void postTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz);
318 335
319 void setScale(SkMScalar sx, SkMScalar sy, SkMScalar sz); 336 void setScale(SkMScalar sx, SkMScalar sy, SkMScalar sz);
320 void preScale(SkMScalar sx, SkMScalar sy, SkMScalar sz); 337 void preScale(SkMScalar sx, SkMScalar sy, SkMScalar sz);
321 void postScale(SkMScalar sx, SkMScalar sy, SkMScalar sz); 338 void postScale(SkMScalar sx, SkMScalar sy, SkMScalar sz);
322 339
323 inline void setScale(SkMScalar scale) { 340 inline void setScale(SkMScalar scale) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 a 90-degree rotation can still end up with 10^-17 of 440 a 90-degree rotation can still end up with 10^-17 of
424 "non-axis-aligned" result. 441 "non-axis-aligned" result.
425 */ 442 */
426 bool preserves2dAxisAlignment(SkMScalar epsilon = SK_ScalarNearlyZero) const ; 443 bool preserves2dAxisAlignment(SkMScalar epsilon = SK_ScalarNearlyZero) const ;
427 444
428 void dump() const; 445 void dump() const;
429 446
430 double determinant() const; 447 double determinant() const;
431 448
432 private: 449 private:
450 /* This is indexed by [col][row]. */
433 SkMScalar fMat[4][4]; 451 SkMScalar fMat[4][4];
434 mutable unsigned fTypeMask; 452 mutable unsigned fTypeMask;
435 453
436 enum { 454 enum {
437 kUnknown_Mask = 0x80, 455 kUnknown_Mask = 0x80,
438 456
439 kAllPublic_Masks = 0xF 457 kAllPublic_Masks = 0xF
440 }; 458 };
441 459
442 /** Efficiently reads 12 matrix entries, ignoring the last col.
443 * This is typically useful when we know the last col is (0, 0, 0, 1).
444 */
445 void as4x3ColMajorf(float[]) const; 460 void as4x3ColMajorf(float[]) const;
446
447 /* This sets the top-left of the matrix and clears the
448 * perspective components (with [3][3] set to 1). */
449 void set4x3ColMajorf(const float[]); 461 void set4x3ColMajorf(const float[]);
450 462
451 SkMScalar transX() const { return fMat[3][0]; } 463 SkMScalar transX() const { return fMat[3][0]; }
452 SkMScalar transY() const { return fMat[3][1]; } 464 SkMScalar transY() const { return fMat[3][1]; }
453 SkMScalar transZ() const { return fMat[3][2]; } 465 SkMScalar transZ() const { return fMat[3][2]; }
454 466
455 SkMScalar scaleX() const { return fMat[0][0]; } 467 SkMScalar scaleX() const { return fMat[0][0]; }
456 SkMScalar scaleY() const { return fMat[1][1]; } 468 SkMScalar scaleY() const { return fMat[1][1]; }
457 SkMScalar scaleZ() const { return fMat[2][2]; } 469 SkMScalar scaleZ() const { return fMat[2][2]; }
458 470
(...skipping 17 matching lines...) Expand all
476 * we already know that this matrix is identity. 488 * we already know that this matrix is identity.
477 */ 489 */
478 inline bool isTriviallyIdentity() const { 490 inline bool isTriviallyIdentity() const {
479 return 0 == fTypeMask; 491 return 0 == fTypeMask;
480 } 492 }
481 493
482 friend class SkColorSpace; 494 friend class SkColorSpace;
483 }; 495 };
484 496
485 #endif 497 #endif
OLDNEW
« no previous file with comments | « no previous file | src/codec/SkPngCodec.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698