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

Side by Side Diff: src/core/SkMatrix.cpp

Issue 1031443002: remove meaningless matrix benches, add mapPts() and add new benches (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 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 | « include/core/SkMatrix.h ('k') | tests/MatrixTest.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 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
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 "SkMatrix.h" 8 #include "SkMatrix.h"
9 #include "SkFloatBits.h" 9 #include "SkFloatBits.h"
10 #include "SkString.h" 10 #include "SkString.h"
(...skipping 1002 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 }; 1013 };
1014 1014
1015 void SkMatrix::mapPoints(SkPoint dst[], const SkPoint src[], int count) const { 1015 void SkMatrix::mapPoints(SkPoint dst[], const SkPoint src[], int count) const {
1016 SkASSERT((dst && src && count > 0) || 0 == count); 1016 SkASSERT((dst && src && count > 0) || 0 == count);
1017 // no partial overlap 1017 // no partial overlap
1018 SkASSERT(src == dst || &dst[count] <= &src[0] || &src[count] <= &dst[0]); 1018 SkASSERT(src == dst || &dst[count] <= &src[0] || &src[count] <= &dst[0]);
1019 1019
1020 this->getMapPtsProc()(*this, dst, src, count); 1020 this->getMapPtsProc()(*this, dst, src, count);
1021 } 1021 }
1022 1022
1023 #include "Sk4x.h"
1024
1025 void SkMatrix::mapPts(SkPoint dst[], const SkPoint src[], int count) const {
1026 if (count <= 0) {
1027 return;
1028 }
1029
1030 unsigned mask = this->getType() & 0xF;
1031
1032 if (SkMatrix::kIdentity_Mask == mask) {
1033 if (src != dst) {
1034 memcpy(dst, src, count * sizeof(SkPoint));
1035 }
1036 return;
1037 }
1038 if (SkMatrix::kTranslate_Mask == mask) {
1039 SkScalar tx = this->getTranslateX();
1040 SkScalar ty = this->getTranslateY();
1041 if (count & 1) {
1042 dst->fX = src->fX + tx;
1043 dst->fY = src->fY + ty;
1044 src += 1;
1045 dst += 1;
1046 }
1047 Sk4f trans4(tx, ty, tx, ty);
1048 if (count & 2) {
1049 (Sk4f::Load(&src->fX) + trans4).store(&dst->fX);
1050 src += 2;
1051 dst += 2;
1052 }
1053 count >>= 2;
1054 for (int i = 0; i < count; ++i) {
1055 Sk4f s0 = Sk4f::Load(&src[0].fX);
1056 Sk4f s1 = Sk4f::Load(&src[2].fX);
1057 (s0 + trans4).store(&dst[0].fX);
1058 (s1 + trans4).store(&dst[2].fX);
1059 src += 4;
1060 dst += 4;
1061 }
1062 return;
1063 }
1064 if (mask <= SkMatrix::kScale_Mask + SkMatrix::kTranslate_Mask) {
1065 SkScalar tx = this->getTranslateX();
1066 SkScalar ty = this->getTranslateY();
1067 SkScalar sx = this->getScaleX();
1068 SkScalar sy = this->getScaleY();
1069 if (count & 1) {
1070 dst->fX = src->fX * sx + tx;
1071 dst->fY = src->fY * sy + ty;
1072 src += 1;
1073 dst += 1;
1074 }
1075 Sk4f trans4(tx, ty, tx, ty);
1076 Sk4f scale4(sx, sy, sx, sy);
1077 if (count & 2) {
1078 (Sk4f::Load(&src->fX) * scale4 + trans4).store(&dst->fX);
1079 src += 2;
1080 dst += 2;
1081 }
1082 count >>= 2;
1083 for (int i = 0; i < count; ++i) {
1084 Sk4f s0 = Sk4f::Load(&src[0].fX);
1085 Sk4f s1 = Sk4f::Load(&src[2].fX);
1086 (s0 * scale4 + trans4).store(&dst[0].fX);
1087 (s1 * scale4 + trans4).store(&dst[2].fX);
1088 src += 4;
1089 dst += 4;
1090 }
1091 return;
1092 }
1093 if (mask < SkMatrix::kPerspective_Mask) { // affine
1094 SkScalar tx = this->getTranslateX();
1095 SkScalar ty = this->getTranslateY();
1096 SkScalar sx = this->getScaleX();
1097 SkScalar sy = this->getScaleY();
1098 SkScalar kx = this->getSkewX();
1099 SkScalar ky = this->getSkewY();
1100 if (count & 1) {
1101 dst->set(src->fX * sx + src->fY * kx + tx,
1102 src->fX * ky + src->fY * sy + ty);
1103 src += 1;
1104 dst += 1;
1105 }
1106 Sk4f trans4(tx, ty, tx, ty);
1107 Sk4f scale4(sx, sy, sx, sy);
1108 Sk4f skew4(kx, ky, kx, ky); // applied to swizzle of src4
1109 count >>= 1;
1110 for (int i = 0; i < count; ++i) {
1111 Sk4f src4 = Sk4f::Load(&src->fX);
1112 Sk4f swz4(src[0].fY, src[0].fX, src[1].fY, src[1].fX); // need ABCD -> BADC
1113 (src4 * scale4 + swz4 * skew4 + trans4).store(&dst->fX);
1114 src += 2;
1115 dst += 2;
1116 }
1117 return;
1118 }
1119 // fall through for perspective
1120 this->mapPoints(dst, src, count);
1121 }
1122
1023 /////////////////////////////////////////////////////////////////////////////// 1123 ///////////////////////////////////////////////////////////////////////////////
1024 1124
1025 void SkMatrix::mapHomogeneousPoints(SkScalar dst[], const SkScalar src[], int co unt) const { 1125 void SkMatrix::mapHomogeneousPoints(SkScalar dst[], const SkScalar src[], int co unt) const {
1026 SkASSERT((dst && src && count > 0) || 0 == count); 1126 SkASSERT((dst && src && count > 0) || 0 == count);
1027 // no partial overlap 1127 // no partial overlap
1028 SkASSERT(src == dst || &dst[3*count] <= &src[0] || &src[3*count] <= &dst[0]) ; 1128 SkASSERT(src == dst || &dst[3*count] <= &src[0] || &src[3*count] <= &dst[0]) ;
1029 1129
1030 if (count > 0) { 1130 if (count > 0) {
1031 if (this->isIdentity()) { 1131 if (this->isIdentity()) {
1032 memcpy(dst, src, 3*count*sizeof(SkScalar)); 1132 memcpy(dst, src, 3*count*sizeof(SkScalar));
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 rotation1->fX = cos1; 1906 rotation1->fX = cos1;
1807 rotation1->fY = sin1; 1907 rotation1->fY = sin1;
1808 } 1908 }
1809 if (rotation2) { 1909 if (rotation2) {
1810 rotation2->fX = cos2; 1910 rotation2->fX = cos2;
1811 rotation2->fY = sin2; 1911 rotation2->fY = sin2;
1812 } 1912 }
1813 1913
1814 return true; 1914 return true;
1815 } 1915 }
OLDNEW
« no previous file with comments | « include/core/SkMatrix.h ('k') | tests/MatrixTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698