OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |