| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 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 | 9 |
| 10 #include "SkScan.h" | 10 #include "SkScan.h" |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 blitter->blitRect(r.fLeft, r.fTop + 1, 1, height - 2); // left | 186 blitter->blitRect(r.fLeft, r.fTop + 1, 1, height - 2); // left |
| 187 blitter->blitRect(r.fRight - 1, r.fTop + 1, 1, height - 2); // right | 187 blitter->blitRect(r.fRight - 1, r.fTop + 1, 1, height - 2); // right |
| 188 blitter->blitH(r.fLeft, r.fBottom - 1, width); // bottom | 188 blitter->blitH(r.fLeft, r.fBottom - 1, width); // bottom |
| 189 } | 189 } |
| 190 | 190 |
| 191 /////////////////////////////////////////////////////////////////////////////// | 191 /////////////////////////////////////////////////////////////////////////////// |
| 192 | 192 |
| 193 #include "SkPath.h" | 193 #include "SkPath.h" |
| 194 #include "SkGeometry.h" | 194 #include "SkGeometry.h" |
| 195 | 195 |
| 196 static bool quad_too_curvy(const SkPoint pts[3]) { | |
| 197 return true; | |
| 198 } | |
| 199 | |
| 200 static int compute_int_quad_dist(const SkPoint pts[3]) { | 196 static int compute_int_quad_dist(const SkPoint pts[3]) { |
| 201 // compute the vector between the control point ([1]) and the middle of the | 197 // compute the vector between the control point ([1]) and the middle of the |
| 202 // line connecting the start and end ([0] and [2]) | 198 // line connecting the start and end ([0] and [2]) |
| 203 SkScalar dx = SkScalarHalf(pts[0].fX + pts[2].fX) - pts[1].fX; | 199 SkScalar dx = SkScalarHalf(pts[0].fX + pts[2].fX) - pts[1].fX; |
| 204 SkScalar dy = SkScalarHalf(pts[0].fY + pts[2].fY) - pts[1].fY; | 200 SkScalar dy = SkScalarHalf(pts[0].fY + pts[2].fY) - pts[1].fY; |
| 205 // we want everyone to be positive | 201 // we want everyone to be positive |
| 206 dx = SkScalarAbs(dx); | 202 dx = SkScalarAbs(dx); |
| 207 dy = SkScalarAbs(dy); | 203 dy = SkScalarAbs(dy); |
| 208 // convert to whole pixel values (use ceiling to be conservative) | 204 // convert to whole pixel values (use ceiling to be conservative) |
| 209 int idx = SkScalarCeil(dx); | 205 int idx = SkScalarCeil(dx); |
| 210 int idy = SkScalarCeil(dy); | 206 int idy = SkScalarCeil(dy); |
| 211 // use the cheap approx for distance | 207 // use the cheap approx for distance |
| 212 if (idx > idy) { | 208 if (idx > idy) { |
| 213 return idx + (idy >> 1); | 209 return idx + (idy >> 1); |
| 214 } else { | 210 } else { |
| 215 return idy + (idx >> 1); | 211 return idy + (idx >> 1); |
| 216 } | 212 } |
| 217 } | 213 } |
| 218 | 214 |
| 219 static void hairquad(const SkPoint pts[3], const SkRegion* clip, SkBlitter* blit
ter, int level, | 215 static void hairquad(const SkPoint pts[3], const SkRegion* clip, SkBlitter* blit
ter, int level, |
| 220 void (*lineproc)(const SkPoint&, const SkPoint&, const SkRe
gion* clip, SkBlitter*)) | 216 void (*lineproc)(const SkPoint&, const SkPoint&, const SkRe
gion* clip, SkBlitter*)) |
| 221 { | 217 { |
| 222 #if 1 | 218 #if 1 |
| 223 if (level > 0 && quad_too_curvy(pts)) | 219 if (level > 0) |
| 224 { | 220 { |
| 225 SkPoint tmp[5]; | 221 SkPoint tmp[5]; |
| 226 | 222 |
| 227 SkChopQuadAtHalf(pts, tmp); | 223 SkChopQuadAtHalf(pts, tmp); |
| 228 hairquad(tmp, clip, blitter, level - 1, lineproc); | 224 hairquad(tmp, clip, blitter, level - 1, lineproc); |
| 229 hairquad(&tmp[2], clip, blitter, level - 1, lineproc); | 225 hairquad(&tmp[2], clip, blitter, level - 1, lineproc); |
| 230 } | 226 } |
| 231 else | 227 else |
| 232 lineproc(pts[0], pts[2], clip, blitter); | 228 lineproc(pts[0], pts[2], clip, blitter); |
| 233 #else | 229 #else |
| 234 int count = 1 << level; | 230 int count = 1 << level; |
| 235 const SkScalar dt = SkFixedToScalar(SK_Fixed1 >> level); | 231 const SkScalar dt = SkFixedToScalar(SK_Fixed1 >> level); |
| 236 SkScalar t = dt; | 232 SkScalar t = dt; |
| 237 SkPoint prevPt = pts[0]; | 233 SkPoint prevPt = pts[0]; |
| 238 for (int i = 1; i < count; i++) { | 234 for (int i = 1; i < count; i++) { |
| 239 SkPoint nextPt; | 235 SkPoint nextPt; |
| 240 SkEvalQuadAt(pts, t, &nextPt); | 236 SkEvalQuadAt(pts, t, &nextPt); |
| 241 lineproc(prevPt, nextPt, clip, blitter); | 237 lineproc(prevPt, nextPt, clip, blitter); |
| 242 t += dt; | 238 t += dt; |
| 243 prevPt = nextPt; | 239 prevPt = nextPt; |
| 244 } | 240 } |
| 245 // draw the last line explicitly to 1.0, in case t didn't match that exactly | 241 // draw the last line explicitly to 1.0, in case t didn't match that exactly |
| 246 lineproc(prevPt, pts[2], clip, blitter); | 242 lineproc(prevPt, pts[2], clip, blitter); |
| 247 #endif | 243 #endif |
| 248 } | 244 } |
| 249 | 245 |
| 250 static bool cubic_too_curvy(const SkPoint pts[4]) | |
| 251 { | |
| 252 return true; | |
| 253 } | |
| 254 | |
| 255 static void haircubic(const SkPoint pts[4], const SkRegion* clip, SkBlitter* bli
tter, int level, | 246 static void haircubic(const SkPoint pts[4], const SkRegion* clip, SkBlitter* bli
tter, int level, |
| 256 void (*lineproc)(const SkPoint&, const SkPoint&, const SkR
egion*, SkBlitter*)) | 247 void (*lineproc)(const SkPoint&, const SkPoint&, const SkR
egion*, SkBlitter*)) |
| 257 { | 248 { |
| 258 if (level > 0 && cubic_too_curvy(pts)) | 249 if (level > 0) |
| 259 { | 250 { |
| 260 SkPoint tmp[7]; | 251 SkPoint tmp[7]; |
| 261 | 252 |
| 262 SkChopCubicAt(pts, tmp, SK_Scalar1/2); | 253 SkChopCubicAt(pts, tmp, SK_Scalar1/2); |
| 263 haircubic(tmp, clip, blitter, level - 1, lineproc); | 254 haircubic(tmp, clip, blitter, level - 1, lineproc); |
| 264 haircubic(&tmp[3], clip, blitter, level - 1, lineproc); | 255 haircubic(&tmp[3], clip, blitter, level - 1, lineproc); |
| 265 } | 256 } |
| 266 else | 257 else |
| 267 lineproc(pts[0], pts[3], clip, blitter); | 258 lineproc(pts[0], pts[3], clip, blitter); |
| 268 } | 259 } |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 | 409 |
| 419 SkAAClipBlitterWrapper wrap; | 410 SkAAClipBlitterWrapper wrap; |
| 420 if (!clip.quickContains(ir)) { | 411 if (!clip.quickContains(ir)) { |
| 421 wrap.init(clip, blitter); | 412 wrap.init(clip, blitter); |
| 422 blitter = wrap.getBlitter(); | 413 blitter = wrap.getBlitter(); |
| 423 clipRgn = &wrap.getRgn(); | 414 clipRgn = &wrap.getRgn(); |
| 424 } | 415 } |
| 425 AntiHairLineRgn(p0, p1, clipRgn, blitter); | 416 AntiHairLineRgn(p0, p1, clipRgn, blitter); |
| 426 } | 417 } |
| 427 } | 418 } |
| OLD | NEW |