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

Side by Side Diff: src/core/SkBitmapProcState_matrix.h

Issue 18721006: fix trivial matrix computation (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « src/core/SkBitmapProcState.cpp ('k') | src/core/SkBitmapProcState_matrixProcs.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 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkMath.h" 9 #include "SkMath.h"
10 #include "SkMathPriv.h" 10 #include "SkMathPriv.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 48 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
49 SkMatrix::kScale_Mask)) == 0); 49 SkMatrix::kScale_Mask)) == 0);
50 50
51 PREAMBLE(s); 51 PREAMBLE(s);
52 // we store y, x, x, x, x, x 52 // we store y, x, x, x, x, x
53 53
54 const unsigned maxX = s.fBitmap->width() - 1; 54 const unsigned maxX = s.fBitmap->width() - 1;
55 SkFractionalInt fx; 55 SkFractionalInt fx;
56 { 56 {
57 SkPoint pt; 57 SkPoint pt;
58 s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, 58 s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
59 SkIntToScalar(y) + SK_ScalarHalf, &pt); 59 SkIntToScalar(y) + SK_ScalarHalf, &pt);
60 fx = SkScalarToFractionalInt(pt.fY); 60 fx = SkScalarToFractionalInt(pt.fY);
61 const unsigned maxY = s.fBitmap->height() - 1; 61 const unsigned maxY = s.fBitmap->height() - 1;
62 *xy++ = TILEY_PROCF(SkFractionalIntToFixed(fx), maxY); 62 *xy++ = TILEY_PROCF(SkFractionalIntToFixed(fx), maxY);
63 fx = SkScalarToFractionalInt(pt.fX); 63 fx = SkScalarToFractionalInt(pt.fX);
64 } 64 }
65 65
66 if (0 == maxX) { 66 if (0 == maxX) {
67 // all of the following X values must be 0 67 // all of the following X values must be 0
68 memset(xy, 0, count * sizeof(uint16_t)); 68 memset(xy, 0, count * sizeof(uint16_t));
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 109
110 void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s, 110 void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s,
111 uint32_t xy[], int count, int x, int y) { 111 uint32_t xy[], int count, int x, int y) {
112 SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); 112 SkASSERT(s.fInvType & SkMatrix::kAffine_Mask);
113 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 113 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
114 SkMatrix::kScale_Mask | 114 SkMatrix::kScale_Mask |
115 SkMatrix::kAffine_Mask)) == 0); 115 SkMatrix::kAffine_Mask)) == 0);
116 116
117 PREAMBLE(s); 117 PREAMBLE(s);
118 SkPoint srcPt; 118 SkPoint srcPt;
119 s.fInvProc(*s.fInvMatrix, 119 s.fInvProc(s.fInvMatrix,
120 SkIntToScalar(x) + SK_ScalarHalf, 120 SkIntToScalar(x) + SK_ScalarHalf,
121 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 121 SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
122 122
123 SkFractionalInt fx = SkScalarToFractionalInt(srcPt.fX); 123 SkFractionalInt fx = SkScalarToFractionalInt(srcPt.fX);
124 SkFractionalInt fy = SkScalarToFractionalInt(srcPt.fY); 124 SkFractionalInt fy = SkScalarToFractionalInt(srcPt.fY);
125 SkFractionalInt dx = s.fInvSxFractionalInt; 125 SkFractionalInt dx = s.fInvSxFractionalInt;
126 SkFractionalInt dy = s.fInvKyFractionalInt; 126 SkFractionalInt dy = s.fInvKyFractionalInt;
127 int maxX = s.fBitmap->width() - 1; 127 int maxX = s.fBitmap->width() - 1;
128 int maxY = s.fBitmap->height() - 1; 128 int maxY = s.fBitmap->height() - 1;
129 129
130 for (int i = count; i > 0; --i) { 130 for (int i = count; i > 0; --i) {
131 *xy++ = (TILEY_PROCF(SkFractionalIntToFixed(fy), maxY) << 16) | 131 *xy++ = (TILEY_PROCF(SkFractionalIntToFixed(fy), maxY) << 16) |
132 TILEX_PROCF(SkFractionalIntToFixed(fx), maxX); 132 TILEX_PROCF(SkFractionalIntToFixed(fx), maxX);
133 fx += dx; fy += dy; 133 fx += dx; fy += dy;
134 } 134 }
135 } 135 }
136 136
137 void PERSP_NOFILTER_NAME(const SkBitmapProcState& s, 137 void PERSP_NOFILTER_NAME(const SkBitmapProcState& s,
138 uint32_t* SK_RESTRICT xy, 138 uint32_t* SK_RESTRICT xy,
139 int count, int x, int y) { 139 int count, int x, int y) {
140 SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); 140 SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask);
141 141
142 PREAMBLE(s); 142 PREAMBLE(s);
143 int maxX = s.fBitmap->width() - 1; 143 int maxX = s.fBitmap->width() - 1;
144 int maxY = s.fBitmap->height() - 1; 144 int maxY = s.fBitmap->height() - 1;
145 145
146 SkPerspIter iter(*s.fInvMatrix, 146 SkPerspIter iter(s.fInvMatrix,
147 SkIntToScalar(x) + SK_ScalarHalf, 147 SkIntToScalar(x) + SK_ScalarHalf,
148 SkIntToScalar(y) + SK_ScalarHalf, count); 148 SkIntToScalar(y) + SK_ScalarHalf, count);
149 149
150 while ((count = iter.next()) != 0) { 150 while ((count = iter.next()) != 0) {
151 const SkFixed* SK_RESTRICT srcXY = iter.getXY(); 151 const SkFixed* SK_RESTRICT srcXY = iter.getXY();
152 while (--count >= 0) { 152 while (--count >= 0) {
153 *xy++ = (TILEY_PROCF(srcXY[1], maxY) << 16) | 153 *xy++ = (TILEY_PROCF(srcXY[1], maxY) << 16) |
154 TILEX_PROCF(srcXY[0], maxX); 154 TILEX_PROCF(srcXY[0], maxX);
155 srcXY += 2; 155 srcXY += 2;
156 } 156 }
(...skipping 24 matching lines...) Expand all
181 181
182 PREAMBLE(s); 182 PREAMBLE(s);
183 183
184 const unsigned maxX = s.fBitmap->width() - 1; 184 const unsigned maxX = s.fBitmap->width() - 1;
185 const SkFixed one = s.fFilterOneX; 185 const SkFixed one = s.fFilterOneX;
186 const SkFractionalInt dx = s.fInvSxFractionalInt; 186 const SkFractionalInt dx = s.fInvSxFractionalInt;
187 SkFractionalInt fx; 187 SkFractionalInt fx;
188 188
189 { 189 {
190 SkPoint pt; 190 SkPoint pt;
191 s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, 191 s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
192 SkIntToScalar(y) + SK_ScalarHalf, &pt); 192 SkIntToScalar(y) + SK_ScalarHalf, &pt);
193 const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); 193 const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1);
194 const unsigned maxY = s.fBitmap->height() - 1; 194 const unsigned maxY = s.fBitmap->height() - 1;
195 // compute our two Y values up front 195 // compute our two Y values up front
196 *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y); 196 *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y);
197 // now initialize fx 197 // now initialize fx
198 fx = SkScalarToFractionalInt(pt.fX) - (SkFixedToFractionalInt(one) >> 1) ; 198 fx = SkScalarToFractionalInt(pt.fX) - (SkFixedToFractionalInt(one) >> 1) ;
199 } 199 }
200 200
201 #ifdef CHECK_FOR_DECAL 201 #ifdef CHECK_FOR_DECAL
(...skipping 13 matching lines...) Expand all
215 215
216 void AFFINE_FILTER_NAME(const SkBitmapProcState& s, 216 void AFFINE_FILTER_NAME(const SkBitmapProcState& s,
217 uint32_t xy[], int count, int x, int y) { 217 uint32_t xy[], int count, int x, int y) {
218 SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); 218 SkASSERT(s.fInvType & SkMatrix::kAffine_Mask);
219 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 219 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
220 SkMatrix::kScale_Mask | 220 SkMatrix::kScale_Mask |
221 SkMatrix::kAffine_Mask)) == 0); 221 SkMatrix::kAffine_Mask)) == 0);
222 222
223 PREAMBLE(s); 223 PREAMBLE(s);
224 SkPoint srcPt; 224 SkPoint srcPt;
225 s.fInvProc(*s.fInvMatrix, 225 s.fInvProc(s.fInvMatrix,
226 SkIntToScalar(x) + SK_ScalarHalf, 226 SkIntToScalar(x) + SK_ScalarHalf,
227 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 227 SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
228 228
229 SkFixed oneX = s.fFilterOneX; 229 SkFixed oneX = s.fFilterOneX;
230 SkFixed oneY = s.fFilterOneY; 230 SkFixed oneY = s.fFilterOneY;
231 SkFixed fx = SkScalarToFixed(srcPt.fX) - (oneX >> 1); 231 SkFixed fx = SkScalarToFixed(srcPt.fX) - (oneX >> 1);
232 SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1); 232 SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1);
233 SkFixed dx = s.fInvSx; 233 SkFixed dx = s.fInvSx;
234 SkFixed dy = s.fInvKy; 234 SkFixed dy = s.fInvKy;
235 unsigned maxX = s.fBitmap->width() - 1; 235 unsigned maxX = s.fBitmap->width() - 1;
(...skipping 11 matching lines...) Expand all
247 uint32_t* SK_RESTRICT xy, int count, 247 uint32_t* SK_RESTRICT xy, int count,
248 int x, int y) { 248 int x, int y) {
249 SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); 249 SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask);
250 250
251 PREAMBLE(s); 251 PREAMBLE(s);
252 unsigned maxX = s.fBitmap->width() - 1; 252 unsigned maxX = s.fBitmap->width() - 1;
253 unsigned maxY = s.fBitmap->height() - 1; 253 unsigned maxY = s.fBitmap->height() - 1;
254 SkFixed oneX = s.fFilterOneX; 254 SkFixed oneX = s.fFilterOneX;
255 SkFixed oneY = s.fFilterOneY; 255 SkFixed oneY = s.fFilterOneY;
256 256
257 SkPerspIter iter(*s.fInvMatrix, 257 SkPerspIter iter(s.fInvMatrix,
258 SkIntToScalar(x) + SK_ScalarHalf, 258 SkIntToScalar(x) + SK_ScalarHalf,
259 SkIntToScalar(y) + SK_ScalarHalf, count); 259 SkIntToScalar(y) + SK_ScalarHalf, count);
260 260
261 while ((count = iter.next()) != 0) { 261 while ((count = iter.next()) != 0) {
262 const SkFixed* SK_RESTRICT srcXY = iter.getXY(); 262 const SkFixed* SK_RESTRICT srcXY = iter.getXY();
263 do { 263 do {
264 *xy++ = PACK_FILTER_Y_NAME(srcXY[1] - (oneY >> 1), maxY, 264 *xy++ = PACK_FILTER_Y_NAME(srcXY[1] - (oneY >> 1), maxY,
265 oneY PREAMBLE_ARG_Y); 265 oneY PREAMBLE_ARG_Y);
266 *xy++ = PACK_FILTER_X_NAME(srcXY[0] - (oneX >> 1), maxX, 266 *xy++ = PACK_FILTER_X_NAME(srcXY[0] - (oneX >> 1), maxX,
267 oneX PREAMBLE_ARG_X); 267 oneX PREAMBLE_ARG_X);
(...skipping 26 matching lines...) Expand all
294 #undef PERSP_FILTER_NAME 294 #undef PERSP_FILTER_NAME
295 295
296 #undef PREAMBLE 296 #undef PREAMBLE
297 #undef PREAMBLE_PARAM_X 297 #undef PREAMBLE_PARAM_X
298 #undef PREAMBLE_PARAM_Y 298 #undef PREAMBLE_PARAM_Y
299 #undef PREAMBLE_ARG_X 299 #undef PREAMBLE_ARG_X
300 #undef PREAMBLE_ARG_Y 300 #undef PREAMBLE_ARG_Y
301 301
302 #undef TILEX_LOW_BITS 302 #undef TILEX_LOW_BITS
303 #undef TILEY_LOW_BITS 303 #undef TILEY_LOW_BITS
OLDNEW
« no previous file with comments | « src/core/SkBitmapProcState.cpp ('k') | src/core/SkBitmapProcState_matrixProcs.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698