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

Side by Side Diff: src/utils/SkMatrix44.cpp

Issue 508303005: SkMatrix44::preserves2dAxisAlignment() (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Use approximate math, perspective divide Created 6 years, 3 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
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 #include "SkMatrix44.h" 8 #include "SkMatrix44.h"
9 9
10 namespace {
11
12 // Taken from Chromium's gfx::Transform
danakj 2014/09/19 16:29:47 Haha, hilarious since it says "Taken from SkMatrix
Ian Vollick 2014/09/19 16:32:06 Yeah, it was taken from here, but has since been r
13 const SkMScalar kEpsilon = 1e-8f;
reed1 2014/09/19 16:45:14 Can we actually document here the meaning/reason f
tomhudson 2014/09/19 18:21:19 If you go back a few years I think the comment in
14
15 }
16
10 static inline bool eq4(const SkMScalar* SK_RESTRICT a, 17 static inline bool eq4(const SkMScalar* SK_RESTRICT a,
11 const SkMScalar* SK_RESTRICT b) { 18 const SkMScalar* SK_RESTRICT b) {
12 return (a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]) & (a[3] == b[3]); 19 return (a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]) & (a[3] == b[3]);
13 } 20 }
14 21
15 bool SkMatrix44::operator==(const SkMatrix44& other) const { 22 bool SkMatrix44::operator==(const SkMatrix44& other) const {
16 if (this == &other) { 23 if (this == &other) {
17 return true; 24 return true;
18 } 25 }
19 26
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 void SkMatrix44::map2(const double src2[], int count, double dst4[]) const { 857 void SkMatrix44::map2(const double src2[], int count, double dst4[]) const {
851 static const Map2Procd gProc[] = { 858 static const Map2Procd gProc[] = {
852 map2_id, map2_td, map2_sd, map2_sd, map2_ad, map2_ad, map2_ad, map2_ad 859 map2_id, map2_td, map2_sd, map2_sd, map2_ad, map2_ad, map2_ad, map2_ad
853 }; 860 };
854 861
855 TypeMask mask = this->getType(); 862 TypeMask mask = this->getType();
856 Map2Procd proc = (mask & kPerspective_Mask) ? map2_pd : gProc[mask]; 863 Map2Procd proc = (mask & kPerspective_Mask) ? map2_pd : gProc[mask];
857 proc(fMat, src2, count, dst4); 864 proc(fMat, src2, count, dst4);
858 } 865 }
859 866
867 bool SkMatrix44::preserves2dAxisAlignment () const {
reed1 2014/09/19 16:45:14 Did you consider taking an explicit epsilon (perha
tomhudson 2014/09/19 18:21:19 Done.
868
869 // Can't check (mask & kPerspective_Mask) because Z isn't relevant here.
870 if (0 != perspX() || 0 != perspY()) return false;
871
872 int col0 = 0;
873 int col1 = 0;
874 int row0 = 0;
875 int row1 = 0;
876
877 // Must test against kEpsilon, not 0, because we can get values
878 // around 6e-17 in the matrix that "should" be 0.
879
880 if (sk_float_abs(fMat[0][0]) > kEpsilon) {
reed1 2014/09/19 16:45:14 Since SkMScalar may not always be a float, we shou
tomhudson 2014/09/19 18:21:19 Done.
881 col0++;
882 row0++;
883 }
884 if (sk_float_abs(fMat[0][1]) > kEpsilon) {
885 col1++;
886 row0++;
887 }
888 if (sk_float_abs(fMat[1][0]) > kEpsilon) {
889 col0++;
890 row1++;
891 }
892 if (sk_float_abs(fMat[1][1]) > kEpsilon) {
893 col1++;
894 row1++;
895 }
896 if (col0 > 1 || col1 > 1 || row0 > 1 || row1 > 1) return false;
reed1 2014/09/19 16:45:14 add comment why 1 big value is OK, but two are not
tomhudson 2014/09/19 18:21:19 Done.
897
898 return true;
899 }
900
860 /////////////////////////////////////////////////////////////////////////////// 901 ///////////////////////////////////////////////////////////////////////////////
861 902
862 void SkMatrix44::dump() const { 903 void SkMatrix44::dump() const {
863 static const char* format = 904 static const char* format =
864 "[%g %g %g %g][%g %g %g %g][%g %g %g %g][%g %g %g %g]\n"; 905 "[%g %g %g %g][%g %g %g %g][%g %g %g %g][%g %g %g %g]\n";
865 #if 0 906 #if 0
866 SkDebugf(format, 907 SkDebugf(format,
867 fMat[0][0], fMat[1][0], fMat[2][0], fMat[3][0], 908 fMat[0][0], fMat[1][0], fMat[2][0], fMat[3][0],
868 fMat[0][1], fMat[1][1], fMat[2][1], fMat[3][1], 909 fMat[0][1], fMat[1][1], fMat[2][1], fMat[3][1],
869 fMat[0][2], fMat[1][2], fMat[2][2], fMat[3][2], 910 fMat[0][2], fMat[1][2], fMat[2][2], fMat[3][2],
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); 964 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]);
924 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); 965 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]);
925 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); 966 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]);
926 967
927 dst[SkMatrix::kMPersp0] = SkMScalarToScalar(fMat[0][3]); 968 dst[SkMatrix::kMPersp0] = SkMScalarToScalar(fMat[0][3]);
928 dst[SkMatrix::kMPersp1] = SkMScalarToScalar(fMat[1][3]); 969 dst[SkMatrix::kMPersp1] = SkMScalarToScalar(fMat[1][3]);
929 dst[SkMatrix::kMPersp2] = SkMScalarToScalar(fMat[3][3]); 970 dst[SkMatrix::kMPersp2] = SkMScalarToScalar(fMat[3][3]);
930 971
931 return dst; 972 return dst;
932 } 973 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698