| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 { | 131 { |
| 132 // FIXME: Do some tests to determine how many states are typically used, and
allocate | 132 // FIXME: Do some tests to determine how many states are typically used, and
allocate |
| 133 // several here. | 133 // several here. |
| 134 m_paintStateStack.append(GraphicsContextState::create()); | 134 m_paintStateStack.append(GraphicsContextState::create()); |
| 135 m_paintState = m_paintStateStack.last().get(); | 135 m_paintState = m_paintStateStack.last().get(); |
| 136 } | 136 } |
| 137 | 137 |
| 138 GraphicsContext::~GraphicsContext() | 138 GraphicsContext::~GraphicsContext() |
| 139 { | 139 { |
| 140 ASSERT(!m_paintStateIndex); | 140 ASSERT(!m_paintStateIndex); |
| 141 ASSERT(!m_paintState->m_saveCount); | 141 ASSERT(!m_paintState->saveCount()); |
| 142 ASSERT(!m_annotationCount); | 142 ASSERT(!m_annotationCount); |
| 143 ASSERT(!m_layerCount); | 143 ASSERT(!m_layerCount); |
| 144 ASSERT(m_recordingStateStack.isEmpty()); | 144 ASSERT(m_recordingStateStack.isEmpty()); |
| 145 } | 145 } |
| 146 | 146 |
| 147 void GraphicsContext::save() | 147 void GraphicsContext::save() |
| 148 { | 148 { |
| 149 if (paintingDisabled()) | 149 if (paintingDisabled()) |
| 150 return; | 150 return; |
| 151 | 151 |
| 152 m_paintState->m_saveCount++; | 152 m_paintState->incrementSaveCount(); |
| 153 | 153 |
| 154 m_canvasStateStack.append(CanvasSaveState(m_canvasSaveFlags, m_canvas->getSa
veCount())); | 154 m_canvasStateStack.append(CanvasSaveState(m_canvasSaveFlags, m_canvas->getSa
veCount())); |
| 155 m_canvasSaveFlags |= SkCanvas::kMatrixClip_SaveFlag; | 155 m_canvasSaveFlags |= SkCanvas::kMatrixClip_SaveFlag; |
| 156 } | 156 } |
| 157 | 157 |
| 158 void GraphicsContext::restore() | 158 void GraphicsContext::restore() |
| 159 { | 159 { |
| 160 if (paintingDisabled()) | 160 if (paintingDisabled()) |
| 161 return; | 161 return; |
| 162 | 162 |
| 163 if (!m_paintStateIndex && !m_paintState->m_saveCount) { | 163 if (!m_paintStateIndex && !m_paintState->saveCount()) { |
| 164 WTF_LOG_ERROR("ERROR void GraphicsContext::restore() stack is empty"); | 164 WTF_LOG_ERROR("ERROR void GraphicsContext::restore() stack is empty"); |
| 165 return; | 165 return; |
| 166 } | 166 } |
| 167 | 167 |
| 168 if (m_paintState->m_saveCount) { | 168 if (m_paintState->saveCount()) { |
| 169 m_paintState->m_saveCount--; | 169 m_paintState->decrementSaveCount(); |
| 170 } else { | 170 } else { |
| 171 m_paintStateIndex--; | 171 m_paintStateIndex--; |
| 172 m_paintState = m_paintStateStack[m_paintStateIndex].get(); | 172 m_paintState = m_paintStateStack[m_paintStateIndex].get(); |
| 173 } | 173 } |
| 174 | 174 |
| 175 CanvasSaveState savedState = m_canvasStateStack.last(); | 175 CanvasSaveState savedState = m_canvasStateStack.last(); |
| 176 m_canvasStateStack.removeLast(); | 176 m_canvasStateStack.removeLast(); |
| 177 m_canvasSaveFlags = savedState.m_flags; | 177 m_canvasSaveFlags = savedState.m_flags; |
| 178 m_canvas->restoreToCount(savedState.m_restoreCount); | 178 m_canvas->restoreToCount(savedState.m_restoreCount); |
| 179 } | 179 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 return; | 229 return; |
| 230 | 230 |
| 231 canvas()->endCommentGroup(); | 231 canvas()->endCommentGroup(); |
| 232 | 232 |
| 233 ASSERT(m_annotationCount > 0); | 233 ASSERT(m_annotationCount > 0); |
| 234 #if !ASSERT_DISABLED | 234 #if !ASSERT_DISABLED |
| 235 --m_annotationCount; | 235 --m_annotationCount; |
| 236 #endif | 236 #endif |
| 237 } | 237 } |
| 238 | 238 |
| 239 void GraphicsContext::setStrokeColor(const Color& color) | |
| 240 { | |
| 241 GraphicsContextState* stateToSet = mutableState(); | |
| 242 stateToSet->m_strokeData.setColor(color); | |
| 243 stateToSet->m_strokeData.clearGradient(); | |
| 244 stateToSet->m_strokeData.clearPattern(); | |
| 245 } | |
| 246 | |
| 247 void GraphicsContext::setStrokePattern(PassRefPtr<Pattern> pattern) | 239 void GraphicsContext::setStrokePattern(PassRefPtr<Pattern> pattern) |
| 248 { | 240 { |
| 249 if (paintingDisabled()) | 241 if (paintingDisabled()) |
| 250 return; | 242 return; |
| 251 | 243 |
| 252 ASSERT(pattern); | 244 ASSERT(pattern); |
| 253 if (!pattern) { | 245 if (!pattern) { |
| 254 setStrokeColor(Color::black); | 246 setStrokeColor(Color::black); |
| 255 return; | 247 return; |
| 256 } | 248 } |
| 257 GraphicsContextState* stateToSet = mutableState(); | 249 mutableState()->setStrokePattern(pattern); |
| 258 stateToSet->m_strokeData.clearGradient(); | |
| 259 stateToSet->m_strokeData.setPattern(pattern); | |
| 260 } | 250 } |
| 261 | 251 |
| 262 void GraphicsContext::setStrokeGradient(PassRefPtr<Gradient> gradient) | 252 void GraphicsContext::setStrokeGradient(PassRefPtr<Gradient> gradient) |
| 263 { | 253 { |
| 264 if (paintingDisabled()) | 254 if (paintingDisabled()) |
| 265 return; | 255 return; |
| 266 | 256 |
| 267 ASSERT(gradient); | 257 ASSERT(gradient); |
| 268 if (!gradient) { | 258 if (!gradient) { |
| 269 setStrokeColor(Color::black); | 259 setStrokeColor(Color::black); |
| 270 return; | 260 return; |
| 271 } | 261 } |
| 272 GraphicsContextState* stateToSet = mutableState(); | 262 mutableState()->setStrokeGradient(gradient); |
| 273 stateToSet->m_strokeData.setGradient(gradient); | |
| 274 stateToSet->m_strokeData.clearPattern(); | |
| 275 } | |
| 276 | |
| 277 void GraphicsContext::setFillColor(const Color& color) | |
| 278 { | |
| 279 GraphicsContextState* stateToSet = mutableState(); | |
| 280 stateToSet->m_fillColor = color; | |
| 281 stateToSet->m_fillGradient.clear(); | |
| 282 stateToSet->m_fillPattern.clear(); | |
| 283 } | 263 } |
| 284 | 264 |
| 285 void GraphicsContext::setFillPattern(PassRefPtr<Pattern> pattern) | 265 void GraphicsContext::setFillPattern(PassRefPtr<Pattern> pattern) |
| 286 { | 266 { |
| 287 if (paintingDisabled()) | 267 if (paintingDisabled()) |
| 288 return; | 268 return; |
| 289 | 269 |
| 290 ASSERT(pattern); | 270 ASSERT(pattern); |
| 291 if (!pattern) { | 271 if (!pattern) { |
| 292 setFillColor(Color::black); | 272 setFillColor(Color::black); |
| 293 return; | 273 return; |
| 294 } | 274 } |
| 295 | 275 |
| 296 GraphicsContextState* stateToSet = mutableState(); | 276 mutableState()->setFillPattern(pattern); |
| 297 stateToSet->m_fillGradient.clear(); | |
| 298 stateToSet->m_fillPattern = pattern; | |
| 299 } | 277 } |
| 300 | 278 |
| 301 void GraphicsContext::setFillGradient(PassRefPtr<Gradient> gradient) | 279 void GraphicsContext::setFillGradient(PassRefPtr<Gradient> gradient) |
| 302 { | 280 { |
| 303 if (paintingDisabled()) | 281 if (paintingDisabled()) |
| 304 return; | 282 return; |
| 305 | 283 |
| 306 ASSERT(gradient); | 284 ASSERT(gradient); |
| 307 if (!gradient) { | 285 if (!gradient) { |
| 308 setFillColor(Color::black); | 286 setFillColor(Color::black); |
| 309 return; | 287 return; |
| 310 } | 288 } |
| 311 | 289 |
| 312 GraphicsContextState* stateToSet = mutableState(); | 290 mutableState()->setFillGradient(gradient); |
| 313 stateToSet->m_fillGradient = gradient; | |
| 314 stateToSet->m_fillPattern.clear(); | |
| 315 } | 291 } |
| 316 | 292 |
| 317 void GraphicsContext::setShadow(const FloatSize& offset, float blur, const Color
& color, | 293 void GraphicsContext::setShadow(const FloatSize& offset, float blur, const Color
& color, |
| 318 DrawLooper::ShadowTransformMode shadowTransformMode, | 294 DrawLooper::ShadowTransformMode shadowTransformMode, |
| 319 DrawLooper::ShadowAlphaMode shadowAlphaMode) | 295 DrawLooper::ShadowAlphaMode shadowAlphaMode) |
| 320 { | 296 { |
| 321 if (paintingDisabled()) | 297 if (paintingDisabled()) |
| 322 return; | 298 return; |
| 323 | 299 |
| 324 if (!color.alpha() || (!offset.width() && !offset.height() && !blur)) { | 300 if (!color.alpha() || (!offset.width() && !offset.height() && !blur)) { |
| 325 clearShadow(); | 301 clearShadow(); |
| 326 return; | 302 return; |
| 327 } | 303 } |
| 328 | 304 |
| 329 DrawLooper drawLooper; | 305 DrawLooper drawLooper; |
| 330 drawLooper.addShadow(offset, blur, color, shadowTransformMode, shadowAlphaMo
de); | 306 drawLooper.addShadow(offset, blur, color, shadowTransformMode, shadowAlphaMo
de); |
| 331 drawLooper.addUnmodifiedContent(); | 307 drawLooper.addUnmodifiedContent(); |
| 332 setDrawLooper(drawLooper); | 308 setDrawLooper(drawLooper); |
| 333 } | 309 } |
| 334 | 310 |
| 335 void GraphicsContext::setDrawLooper(const DrawLooper& drawLooper) | 311 void GraphicsContext::setDrawLooper(const DrawLooper& drawLooper) |
| 336 { | 312 { |
| 337 if (paintingDisabled()) | 313 if (paintingDisabled()) |
| 338 return; | 314 return; |
| 339 | 315 |
| 340 mutableState()->m_looper = drawLooper.skDrawLooper(); | 316 mutableState()->setDrawLooper(drawLooper); |
| 341 } | 317 } |
| 342 | 318 |
| 343 void GraphicsContext::clearDrawLooper() | 319 void GraphicsContext::clearDrawLooper() |
| 344 { | 320 { |
| 345 if (paintingDisabled()) | 321 if (paintingDisabled()) |
| 346 return; | 322 return; |
| 347 | 323 |
| 348 mutableState()->m_looper.clear(); | 324 mutableState()->clearDrawLooper(); |
| 349 } | 325 } |
| 350 | 326 |
| 351 int GraphicsContext::getNormalizedAlpha() const | 327 bool GraphicsContext::hasShadow() const |
| 352 { | 328 { |
| 353 int alpha = roundf(immutableState()->m_alpha * 256); | 329 return !!immutableState()->drawLooper(); |
| 354 if (alpha > 255) | |
| 355 alpha = 255; | |
| 356 else if (alpha < 0) | |
| 357 alpha = 0; | |
| 358 return alpha; | |
| 359 } | 330 } |
| 360 | 331 |
| 361 FloatRect GraphicsContext::getClipBounds() const | 332 FloatRect GraphicsContext::getClipBounds() const |
| 362 { | 333 { |
| 363 if (paintingDisabled()) | 334 if (paintingDisabled()) |
| 364 return FloatRect(); | 335 return FloatRect(); |
| 365 SkRect rect; | 336 SkRect rect; |
| 366 if (!m_canvas->getClipBounds(&rect)) | 337 if (!m_canvas->getClipBounds(&rect)) |
| 367 return FloatRect(); | 338 return FloatRect(); |
| 368 return FloatRect(rect); | 339 return FloatRect(rect); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 // collapsed. Therefore, subpixel text is disabled when we are drawing | 391 // collapsed. Therefore, subpixel text is disabled when we are drawing |
| 421 // onto a layer. | 392 // onto a layer. |
| 422 if (paintingDisabled() || isDrawingToLayer() || !isCertainlyOpaque()) | 393 if (paintingDisabled() || isDrawingToLayer() || !isCertainlyOpaque()) |
| 423 return false; | 394 return false; |
| 424 | 395 |
| 425 return shouldSmoothFonts(); | 396 return shouldSmoothFonts(); |
| 426 } | 397 } |
| 427 | 398 |
| 428 void GraphicsContext::setCompositeOperation(CompositeOperator compositeOperation
, WebBlendMode blendMode) | 399 void GraphicsContext::setCompositeOperation(CompositeOperator compositeOperation
, WebBlendMode blendMode) |
| 429 { | 400 { |
| 430 GraphicsContextState* stateToSet = mutableState(); | 401 mutableState()->setCompositeOperation(compositeOperation, blendMode); |
| 431 stateToSet->m_compositeOperator = compositeOperation; | |
| 432 stateToSet->m_blendMode = blendMode; | |
| 433 stateToSet->m_xferMode = WebCoreCompositeToSkiaComposite(compositeOperation,
blendMode); | |
| 434 } | 402 } |
| 435 | 403 |
| 436 SkColorFilter* GraphicsContext::colorFilter() | 404 SkColorFilter* GraphicsContext::colorFilter() |
| 437 { | 405 { |
| 438 return immutableState()->m_colorFilter.get(); | 406 return immutableState()->colorFilter(); |
| 439 } | 407 } |
| 440 | 408 |
| 441 void GraphicsContext::setColorFilter(ColorFilter colorFilter) | 409 void GraphicsContext::setColorFilter(ColorFilter colorFilter) |
| 442 { | 410 { |
| 443 GraphicsContextState* stateToSet = mutableState(); | 411 GraphicsContextState* stateToSet = mutableState(); |
| 444 | 412 |
| 445 // We only support one active color filter at the moment. If (when) this bec
omes a problem, | 413 // We only support one active color filter at the moment. If (when) this bec
omes a problem, |
| 446 // we should switch to using color filter chains (Skia work in progress). | 414 // we should switch to using color filter chains (Skia work in progress). |
| 447 ASSERT(!stateToSet->m_colorFilter); | 415 ASSERT(!stateToSet->colorFilter()); |
| 448 stateToSet->m_colorFilter = WebCoreColorFilterToSkiaColorFilter(colorFilter)
; | 416 stateToSet->setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter))
; |
| 449 } | 417 } |
| 450 | 418 |
| 451 bool GraphicsContext::readPixels(SkBitmap* bitmap, int x, int y, SkCanvas::Confi
g8888 config8888) | 419 bool GraphicsContext::readPixels(SkBitmap* bitmap, int x, int y, SkCanvas::Confi
g8888 config8888) |
| 452 { | 420 { |
| 453 if (paintingDisabled()) | 421 if (paintingDisabled()) |
| 454 return false; | 422 return false; |
| 455 | 423 |
| 456 return m_canvas->readPixels(bitmap, x, y, config8888); | 424 return m_canvas->readPixels(bitmap, x, y, config8888); |
| 457 } | 425 } |
| 458 | 426 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 475 if (matrix.isIdentity()) | 443 if (matrix.isIdentity()) |
| 476 return true; | 444 return true; |
| 477 | 445 |
| 478 realizeCanvasSave(SkCanvas::kMatrix_SaveFlag); | 446 realizeCanvasSave(SkCanvas::kMatrix_SaveFlag); |
| 479 | 447 |
| 480 return m_canvas->concat(matrix); | 448 return m_canvas->concat(matrix); |
| 481 } | 449 } |
| 482 | 450 |
| 483 void GraphicsContext::beginTransparencyLayer(float opacity, const FloatRect* bou
nds) | 451 void GraphicsContext::beginTransparencyLayer(float opacity, const FloatRect* bou
nds) |
| 484 { | 452 { |
| 485 beginLayer(opacity, immutableState()->m_compositeOperator, bounds); | 453 beginLayer(opacity, immutableState()->compositeOperator(), bounds); |
| 486 } | 454 } |
| 487 | 455 |
| 488 void GraphicsContext::beginLayer(float opacity, CompositeOperator op, const Floa
tRect* bounds, ColorFilter colorFilter, ImageFilter* imageFilter) | 456 void GraphicsContext::beginLayer(float opacity, CompositeOperator op, const Floa
tRect* bounds, ColorFilter colorFilter, ImageFilter* imageFilter) |
| 489 { | 457 { |
| 490 if (paintingDisabled()) | 458 if (paintingDisabled()) |
| 491 return; | 459 return; |
| 492 | 460 |
| 493 // We need the "alpha" layer flag here because the base layer is opaque | 461 // We need the "alpha" layer flag here because the base layer is opaque |
| 494 // (the surface of the page) but layers on top may have transparent parts. | 462 // (the surface of the page) but layers on top may have transparent parts. |
| 495 // Without explicitly setting the alpha flag, the layer will inherit the | 463 // Without explicitly setting the alpha flag, the layer will inherit the |
| 496 // opaque setting of the base and some things won't work properly. | 464 // opaque setting of the base and some things won't work properly. |
| 497 SkCanvas::SaveFlags saveFlags = static_cast<SkCanvas::SaveFlags>(SkCanvas::k
HasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag); | 465 SkCanvas::SaveFlags saveFlags = static_cast<SkCanvas::SaveFlags>(SkCanvas::k
HasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag); |
| 498 | 466 |
| 499 SkPaint layerPaint; | 467 SkPaint layerPaint; |
| 500 layerPaint.setAlpha(static_cast<unsigned char>(opacity * 255)); | 468 layerPaint.setAlpha(static_cast<unsigned char>(opacity * 255)); |
| 501 layerPaint.setXfermode(WebCoreCompositeToSkiaComposite(op, m_paintState->m_b
lendMode).get()); | 469 layerPaint.setXfermode(WebCoreCompositeToSkiaComposite(op, m_paintState->ble
ndMode()).get()); |
| 502 layerPaint.setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter).g
et()); | 470 layerPaint.setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter).g
et()); |
| 503 layerPaint.setImageFilter(imageFilter); | 471 layerPaint.setImageFilter(imageFilter); |
| 504 | 472 |
| 505 // Filters will adjust the clip to accomodate for filter bounds, but | 473 // Filters will adjust the clip to accomodate for filter bounds, but |
| 506 // need the kClipToLayer_SaveFlag to do so. We also save the clip here, so | 474 // need the kClipToLayer_SaveFlag to do so. We also save the clip here, so |
| 507 // it is restored back before the filtered layer is drawn in restore(). | 475 // it is restored back before the filtered layer is drawn in restore(). |
| 508 // The matrix also needs to be saved, in order to be correctly passed to | 476 // The matrix also needs to be saved, in order to be correctly passed to |
| 509 // the filter CTM during restore(). | 477 // the filter CTM during restore(). |
| 510 if (imageFilter) | 478 if (imageFilter) |
| 511 saveFlags = SkCanvas::kARGB_ClipLayer_SaveFlag; | 479 saveFlags = SkCanvas::kARGB_ClipLayer_SaveFlag; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 | 562 |
| 595 if (bounds.x() || bounds.y()) | 563 if (bounds.x() || bounds.y()) |
| 596 m_canvas->translate(-bounds.x(), -bounds.y()); | 564 m_canvas->translate(-bounds.x(), -bounds.y()); |
| 597 } | 565 } |
| 598 | 566 |
| 599 void GraphicsContext::setupPaintForFilling(SkPaint* paint) const | 567 void GraphicsContext::setupPaintForFilling(SkPaint* paint) const |
| 600 { | 568 { |
| 601 if (paintingDisabled()) | 569 if (paintingDisabled()) |
| 602 return; | 570 return; |
| 603 | 571 |
| 604 setupPaintCommon(paint); | 572 *paint = immutableState()->fillPaint(); |
| 605 | |
| 606 setupShader(paint, immutableState()->m_fillGradient.get(), immutableState()-
>m_fillPattern.get(), immutableState()->m_fillColor.rgb()); | |
| 607 } | 573 } |
| 608 | 574 |
| 609 float GraphicsContext::setupPaintForStroking(SkPaint* paint, int length) const | 575 void GraphicsContext::setupPaintForStroking(SkPaint* paint) const |
| 610 { | 576 { |
| 611 if (paintingDisabled()) | 577 if (paintingDisabled()) |
| 612 return 0.0f; | 578 return; |
| 613 | 579 |
| 614 setupPaintCommon(paint); | 580 *paint = immutableState()->strokePaint(); |
| 615 | |
| 616 setupShader(paint, immutableState()->m_strokeData.gradient(), immutableState
()->m_strokeData.pattern(), | |
| 617 immutableState()->m_strokeData.color().rgb()); | |
| 618 | |
| 619 return immutableState()->m_strokeData.setupPaint(paint, length); | |
| 620 } | 581 } |
| 621 | 582 |
| 622 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin
ts, bool shouldAntialias) | 583 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin
ts, bool shouldAntialias) |
| 623 { | 584 { |
| 624 if (paintingDisabled()) | 585 if (paintingDisabled()) |
| 625 return; | 586 return; |
| 626 | 587 |
| 627 if (numPoints <= 1) | 588 if (numPoints <= 1) |
| 628 return; | 589 return; |
| 629 | 590 |
| 630 SkPath path; | 591 SkPath path; |
| 631 setPathFromConvexPoints(&path, numPoints, points); | 592 setPathFromConvexPoints(&path, numPoints, points); |
| 632 | 593 |
| 633 SkPaint paint; | 594 SkPaint paint(immutableState()->fillPaint()); |
| 634 setupPaintForFilling(&paint); | |
| 635 paint.setAntiAlias(shouldAntialias); | 595 paint.setAntiAlias(shouldAntialias); |
| 636 drawPath(path, paint); | 596 drawPath(path, paint); |
| 637 | 597 |
| 638 if (strokeStyle() != NoStroke) { | 598 if (strokeStyle() != NoStroke) |
| 639 paint.reset(); | 599 drawPath(path, immutableState()->strokePaint()); |
| 640 setupPaintForStroking(&paint); | |
| 641 drawPath(path, paint); | |
| 642 } | |
| 643 } | 600 } |
| 644 | 601 |
| 645 // This method is only used to draw the little circles used in lists. | 602 // This method is only used to draw the little circles used in lists. |
| 646 void GraphicsContext::drawEllipse(const IntRect& elipseRect) | 603 void GraphicsContext::drawEllipse(const IntRect& elipseRect) |
| 647 { | 604 { |
| 648 if (paintingDisabled()) | 605 if (paintingDisabled()) |
| 649 return; | 606 return; |
| 650 | 607 |
| 651 SkRect rect = elipseRect; | 608 SkRect rect = elipseRect; |
| 652 SkPaint paint; | 609 drawOval(rect, immutableState()->fillPaint()); |
| 653 setupPaintForFilling(&paint); | |
| 654 drawOval(rect, paint); | |
| 655 | 610 |
| 656 if (strokeStyle() != NoStroke) { | 611 if (strokeStyle() != NoStroke) |
| 657 paint.reset(); | 612 drawOval(rect, immutableState()->strokePaint()); |
| 658 setupPaintForStroking(&paint); | |
| 659 drawOval(rect, paint); | |
| 660 } | |
| 661 } | 613 } |
| 662 | 614 |
| 663 void GraphicsContext::drawFocusRing(const Path& focusRingPath, int width, int of
fset, const Color& color) | 615 void GraphicsContext::drawFocusRing(const Path& focusRingPath, int width, int of
fset, const Color& color) |
| 664 { | 616 { |
| 665 // FIXME: Implement support for offset. | 617 // FIXME: Implement support for offset. |
| 666 if (paintingDisabled()) | 618 if (paintingDisabled()) |
| 667 return; | 619 return; |
| 668 | 620 |
| 669 SkPaint paint; | 621 SkPaint paint; |
| 670 paint.setAntiAlias(true); | 622 paint.setAntiAlias(true); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 770 // This is only used to draw borders. | 722 // This is only used to draw borders. |
| 771 void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) | 723 void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) |
| 772 { | 724 { |
| 773 if (paintingDisabled()) | 725 if (paintingDisabled()) |
| 774 return; | 726 return; |
| 775 | 727 |
| 776 StrokeStyle penStyle = strokeStyle(); | 728 StrokeStyle penStyle = strokeStyle(); |
| 777 if (penStyle == NoStroke) | 729 if (penStyle == NoStroke) |
| 778 return; | 730 return; |
| 779 | 731 |
| 780 SkPaint paint; | |
| 781 FloatPoint p1 = point1; | 732 FloatPoint p1 = point1; |
| 782 FloatPoint p2 = point2; | 733 FloatPoint p2 = point2; |
| 783 bool isVerticalLine = (p1.x() == p2.x()); | 734 bool isVerticalLine = (p1.x() == p2.x()); |
| 784 int width = roundf(strokeThickness()); | 735 int width = roundf(strokeThickness()); |
| 785 | 736 |
| 786 // We know these are vertical or horizontal lines, so the length will just | 737 // We know these are vertical or horizontal lines, so the length will just |
| 787 // be the sum of the displacement component vectors give or take 1 - | 738 // be the sum of the displacement component vectors give or take 1 - |
| 788 // probably worth the speed up of no square root, which also won't be exact. | 739 // probably worth the speed up of no square root, which also won't be exact. |
| 789 FloatSize disp = p2 - p1; | 740 FloatSize disp = p2 - p1; |
| 790 int length = SkScalarRoundToInt(disp.width() + disp.height()); | 741 int length = SkScalarRoundToInt(disp.width() + disp.height()); |
| 791 setupPaintForStroking(&paint, length); | 742 SkPaint paint(immutableState()->strokePaint()); |
| 792 | 743 |
| 793 if (strokeStyle() == DottedStroke || strokeStyle() == DashedStroke) { | 744 if (strokeStyle() == DottedStroke || strokeStyle() == DashedStroke) { |
| 745 immutableState()->strokeData().setupPaintDashPathEffect(&paint, length); |
| 746 |
| 794 // Do a rect fill of our endpoints. This ensures we always have the | 747 // Do a rect fill of our endpoints. This ensures we always have the |
| 795 // appearance of being a border. We then draw the actual dotted/dashed
line. | 748 // appearance of being a border. We then draw the actual dotted/dashed
line. |
| 796 | |
| 797 SkRect r1, r2; | 749 SkRect r1, r2; |
| 798 r1.set(p1.x(), p1.y(), p1.x() + width, p1.y() + width); | 750 r1.set(p1.x(), p1.y(), p1.x() + width, p1.y() + width); |
| 799 r2.set(p2.x(), p2.y(), p2.x() + width, p2.y() + width); | 751 r2.set(p2.x(), p2.y(), p2.x() + width, p2.y() + width); |
| 800 | 752 |
| 801 if (isVerticalLine) { | 753 if (isVerticalLine) { |
| 802 r1.offset(-width / 2, 0); | 754 r1.offset(-width / 2, 0); |
| 803 r2.offset(-width / 2, -width); | 755 r2.offset(-width / 2, -width); |
| 804 } else { | 756 } else { |
| 805 r1.offset(0, -width / 2); | 757 r1.offset(0, -width / 2); |
| 806 r2.offset(-width, -width / 2); | 758 r2.offset(-width, -width / 2); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 r.fTop = WebCoreFloatToSkScalar(floorf(pt.y() + 0.5f)); | 915 r.fTop = WebCoreFloatToSkScalar(floorf(pt.y() + 0.5f)); |
| 964 r.fRight = r.fLeft + WebCoreFloatToSkScalar(width); | 916 r.fRight = r.fLeft + WebCoreFloatToSkScalar(width); |
| 965 r.fBottom = r.fTop + SkIntToScalar(thickness); | 917 r.fBottom = r.fTop + SkIntToScalar(thickness); |
| 966 | 918 |
| 967 SkPaint paint; | 919 SkPaint paint; |
| 968 switch (strokeStyle()) { | 920 switch (strokeStyle()) { |
| 969 case NoStroke: | 921 case NoStroke: |
| 970 case SolidStroke: | 922 case SolidStroke: |
| 971 case DoubleStroke: | 923 case DoubleStroke: |
| 972 case WavyStroke: | 924 case WavyStroke: |
| 973 setupPaintForFilling(&paint); | 925 paint = immutableState()->fillPaint(); |
| 974 break; | 926 break; |
| 975 case DottedStroke: | 927 case DottedStroke: |
| 976 case DashedStroke: | 928 case DashedStroke: |
| 977 setupPaintForStroking(&paint); | 929 paint = immutableState()->strokePaint(); |
| 978 break; | 930 break; |
| 979 } | 931 } |
| 980 | 932 |
| 981 // Text lines are drawn using the stroke color. | 933 // Text lines are drawn using the stroke color. |
| 982 paint.setColor(effectiveStrokeColor()); | 934 paint.setColor(effectiveStrokeColor()); |
| 983 drawRect(r, paint); | 935 drawRect(r, paint); |
| 984 } | 936 } |
| 985 | 937 |
| 986 // Draws a filled rectangle with a stroked border. | 938 // Draws a filled rectangle with a stroked border. |
| 987 void GraphicsContext::drawRect(const IntRect& rect) | 939 void GraphicsContext::drawRect(const IntRect& rect) |
| 988 { | 940 { |
| 989 if (paintingDisabled()) | 941 if (paintingDisabled()) |
| 990 return; | 942 return; |
| 991 | 943 |
| 992 ASSERT(!rect.isEmpty()); | 944 ASSERT(!rect.isEmpty()); |
| 993 if (rect.isEmpty()) | 945 if (rect.isEmpty()) |
| 994 return; | 946 return; |
| 995 | 947 |
| 996 SkRect skRect = rect; | 948 SkRect skRect = rect; |
| 997 SkPaint paint; | 949 int fillcolorNotTransparent = immutableState()->fillColor().rgb() & 0xFF0000
00; |
| 998 int fillcolorNotTransparent = m_paintState->m_fillColor.rgb() & 0xFF000000; | 950 if (fillcolorNotTransparent) |
| 999 if (fillcolorNotTransparent) { | 951 drawRect(skRect, immutableState()->fillPaint()); |
| 1000 setupPaintForFilling(&paint); | |
| 1001 drawRect(skRect, paint); | |
| 1002 } | |
| 1003 | 952 |
| 1004 if (m_paintState->m_strokeData.style() != NoStroke && (m_paintState->m_strok
eData.color().rgb() & 0xFF000000)) { | 953 if (immutableState()->strokeData().style() != NoStroke && (immutableState()-
>strokeData().color().rgb() & 0xFF000000)) { |
| 1005 // We do a fill of four rects to simulate the stroke of a border. | 954 // We do a fill of four rects to simulate the stroke of a border. |
| 1006 paint.reset(); | 955 SkPaint paint(immutableState()->fillPaint()); |
| 1007 setupPaintForFilling(&paint); | |
| 1008 // need to jam in the strokeColor | 956 // need to jam in the strokeColor |
| 1009 paint.setColor(this->effectiveStrokeColor()); | 957 paint.setColor(immutableState()->effectiveStrokeColor()); |
| 1010 | 958 |
| 1011 SkRect topBorder = { skRect.fLeft, skRect.fTop, skRect.fRight, skRect.fT
op + 1 }; | 959 SkRect topBorder = { skRect.fLeft, skRect.fTop, skRect.fRight, skRect.fT
op + 1 }; |
| 1012 drawRect(topBorder, paint); | 960 drawRect(topBorder, paint); |
| 1013 SkRect bottomBorder = { skRect.fLeft, skRect.fBottom - 1, skRect.fRight,
skRect.fBottom }; | 961 SkRect bottomBorder = { skRect.fLeft, skRect.fBottom - 1, skRect.fRight,
skRect.fBottom }; |
| 1014 drawRect(bottomBorder, paint); | 962 drawRect(bottomBorder, paint); |
| 1015 SkRect leftBorder = { skRect.fLeft, skRect.fTop + 1, skRect.fLeft + 1, s
kRect.fBottom - 1 }; | 963 SkRect leftBorder = { skRect.fLeft, skRect.fTop + 1, skRect.fLeft + 1, s
kRect.fBottom - 1 }; |
| 1016 drawRect(leftBorder, paint); | 964 drawRect(leftBorder, paint); |
| 1017 SkRect rightBorder = { skRect.fRight - 1, skRect.fTop + 1, skRect.fRight
, skRect.fBottom - 1 }; | 965 SkRect rightBorder = { skRect.fRight - 1, skRect.fTop + 1, skRect.fRight
, skRect.fBottom - 1 }; |
| 1018 drawRect(rightBorder, paint); | 966 drawRect(rightBorder, paint); |
| 1019 } | 967 } |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1237 m_opaqueRegion.didDrawRect(this, rect, *paint, &bitmap); | 1185 m_opaqueRegion.didDrawRect(this, rect, *paint, &bitmap); |
| 1238 } | 1186 } |
| 1239 } | 1187 } |
| 1240 | 1188 |
| 1241 void GraphicsContext::drawBitmapRect(const SkBitmap& bitmap, const SkRect* src, | 1189 void GraphicsContext::drawBitmapRect(const SkBitmap& bitmap, const SkRect* src, |
| 1242 const SkRect& dst, const SkPaint* paint) | 1190 const SkRect& dst, const SkPaint* paint) |
| 1243 { | 1191 { |
| 1244 if (paintingDisabled()) | 1192 if (paintingDisabled()) |
| 1245 return; | 1193 return; |
| 1246 | 1194 |
| 1247 SkCanvas::DrawBitmapRectFlags flags = m_paintState->m_shouldClampToSourceRec
t ? SkCanvas::kNone_DrawBitmapRectFlag : SkCanvas::kBleed_DrawBitmapRectFlag; | 1195 SkCanvas::DrawBitmapRectFlags flags = |
| 1196 immutableState()->shouldClampToSourceRect() ? SkCanvas::kNone_DrawBitmap
RectFlag : SkCanvas::kBleed_DrawBitmapRectFlag; |
| 1248 | 1197 |
| 1249 m_canvas->drawBitmapRectToRect(bitmap, src, dst, paint, flags); | 1198 m_canvas->drawBitmapRectToRect(bitmap, src, dst, paint, flags); |
| 1250 | 1199 |
| 1251 if (m_trackOpaqueRegion) | 1200 if (m_trackOpaqueRegion) |
| 1252 m_opaqueRegion.didDrawRect(this, dst, *paint, &bitmap); | 1201 m_opaqueRegion.didDrawRect(this, dst, *paint, &bitmap); |
| 1253 } | 1202 } |
| 1254 | 1203 |
| 1255 void GraphicsContext::drawOval(const SkRect& oval, const SkPaint& paint) | 1204 void GraphicsContext::drawOval(const SkRect& oval, const SkPaint& paint) |
| 1256 { | 1205 { |
| 1257 if (paintingDisabled()) | 1206 if (paintingDisabled()) |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1335 | 1284 |
| 1336 void GraphicsContext::fillPath(const Path& pathToFill) | 1285 void GraphicsContext::fillPath(const Path& pathToFill) |
| 1337 { | 1286 { |
| 1338 if (paintingDisabled() || pathToFill.isEmpty()) | 1287 if (paintingDisabled() || pathToFill.isEmpty()) |
| 1339 return; | 1288 return; |
| 1340 | 1289 |
| 1341 // Use const_cast and temporarily modify the fill type instead of copying th
e path. | 1290 // Use const_cast and temporarily modify the fill type instead of copying th
e path. |
| 1342 SkPath& path = const_cast<SkPath&>(pathToFill.skPath()); | 1291 SkPath& path = const_cast<SkPath&>(pathToFill.skPath()); |
| 1343 SkPath::FillType previousFillType = path.getFillType(); | 1292 SkPath::FillType previousFillType = path.getFillType(); |
| 1344 | 1293 |
| 1345 SkPath::FillType temporaryFillType = m_paintState->m_fillRule == RULE_EVENOD
D ? SkPath::kEvenOdd_FillType : SkPath::kWinding_FillType; | 1294 SkPath::FillType temporaryFillType = |
| 1295 immutableState()->fillRule() == RULE_EVENODD ? SkPath::kEvenOdd_FillType
: SkPath::kWinding_FillType; |
| 1346 path.setFillType(temporaryFillType); | 1296 path.setFillType(temporaryFillType); |
| 1347 | 1297 |
| 1348 SkPaint paint; | 1298 drawPath(path, immutableState()->fillPaint()); |
| 1349 setupPaintForFilling(&paint); | |
| 1350 drawPath(path, paint); | |
| 1351 | 1299 |
| 1352 path.setFillType(previousFillType); | 1300 path.setFillType(previousFillType); |
| 1353 } | 1301 } |
| 1354 | 1302 |
| 1355 void GraphicsContext::fillRect(const FloatRect& rect) | 1303 void GraphicsContext::fillRect(const FloatRect& rect) |
| 1356 { | 1304 { |
| 1357 if (paintingDisabled()) | 1305 if (paintingDisabled()) |
| 1358 return; | 1306 return; |
| 1359 | 1307 |
| 1360 SkRect r = rect; | 1308 SkRect r = rect; |
| 1361 | 1309 |
| 1362 SkPaint paint; | 1310 drawRect(r, immutableState()->fillPaint()); |
| 1363 setupPaintForFilling(&paint); | |
| 1364 drawRect(r, paint); | |
| 1365 } | 1311 } |
| 1366 | 1312 |
| 1367 void GraphicsContext::fillRect(const FloatRect& rect, const Color& color) | 1313 void GraphicsContext::fillRect(const FloatRect& rect, const Color& color) |
| 1368 { | 1314 { |
| 1369 if (paintingDisabled()) | 1315 if (paintingDisabled()) |
| 1370 return; | 1316 return; |
| 1371 | 1317 |
| 1372 SkRect r = rect; | 1318 SkRect r = rect; |
| 1373 SkPaint paint; | 1319 SkPaint paint = immutableState()->fillPaint(); |
| 1374 setupPaintCommon(&paint); | |
| 1375 paint.setColor(color.rgb()); | 1320 paint.setColor(color.rgb()); |
| 1376 drawRect(r, paint); | 1321 drawRect(r, paint); |
| 1377 } | 1322 } |
| 1378 | 1323 |
| 1379 void GraphicsContext::fillBetweenRoundedRects(const IntRect& outer, const IntSiz
e& outerTopLeft, const IntSize& outerTopRight, const IntSize& outerBottomLeft, c
onst IntSize& outerBottomRight, | 1324 void GraphicsContext::fillBetweenRoundedRects(const IntRect& outer, const IntSiz
e& outerTopLeft, const IntSize& outerTopRight, const IntSize& outerBottomLeft, c
onst IntSize& outerBottomRight, |
| 1380 const IntRect& inner, const IntSize& innerTopLeft, const IntSize& innerTopRi
ght, const IntSize& innerBottomLeft, const IntSize& innerBottomRight, const Colo
r& color) { | 1325 const IntRect& inner, const IntSize& innerTopLeft, const IntSize& innerTopRi
ght, const IntSize& innerBottomLeft, const IntSize& innerBottomRight, const Colo
r& color) { |
| 1381 if (paintingDisabled()) | 1326 if (paintingDisabled()) |
| 1382 return; | 1327 return; |
| 1383 | 1328 |
| 1384 SkVector outerRadii[4]; | 1329 SkVector outerRadii[4]; |
| 1385 SkVector innerRadii[4]; | 1330 SkVector innerRadii[4]; |
| 1386 setRadii(outerRadii, outerTopLeft, outerTopRight, outerBottomRight, outerBot
tomLeft); | 1331 setRadii(outerRadii, outerTopLeft, outerTopRight, outerBottomRight, outerBot
tomLeft); |
| 1387 setRadii(innerRadii, innerTopLeft, innerTopRight, innerBottomRight, innerBot
tomLeft); | 1332 setRadii(innerRadii, innerTopLeft, innerTopRight, innerBottomRight, innerBot
tomLeft); |
| 1388 | 1333 |
| 1389 SkRRect rrOuter; | 1334 SkRRect rrOuter; |
| 1390 SkRRect rrInner; | 1335 SkRRect rrInner; |
| 1391 rrOuter.setRectRadii(outer, outerRadii); | 1336 rrOuter.setRectRadii(outer, outerRadii); |
| 1392 rrInner.setRectRadii(inner, innerRadii); | 1337 rrInner.setRectRadii(inner, innerRadii); |
| 1393 | 1338 |
| 1394 SkPaint paint; | 1339 SkPaint paint(immutableState()->fillPaint()); |
| 1395 setupPaintForFilling(&paint); | |
| 1396 paint.setColor(color.rgb()); | 1340 paint.setColor(color.rgb()); |
| 1397 | 1341 |
| 1398 m_canvas->drawDRRect(rrOuter, rrInner, paint); | 1342 m_canvas->drawDRRect(rrOuter, rrInner, paint); |
| 1399 | 1343 |
| 1400 if (m_trackOpaqueRegion) | 1344 if (m_trackOpaqueRegion) |
| 1401 m_opaqueRegion.didDrawBounded(this, rrOuter.getBounds(), paint); | 1345 m_opaqueRegion.didDrawBounded(this, rrOuter.getBounds(), paint); |
| 1402 } | 1346 } |
| 1403 | 1347 |
| 1404 void GraphicsContext::fillBetweenRoundedRects(const RoundedRect& outer, const Ro
undedRect& inner, const Color& color) | 1348 void GraphicsContext::fillBetweenRoundedRects(const RoundedRect& outer, const Ro
undedRect& inner, const Color& color) |
| 1405 { | 1349 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1423 fillRect(rect, color); | 1367 fillRect(rect, color); |
| 1424 return; | 1368 return; |
| 1425 } | 1369 } |
| 1426 | 1370 |
| 1427 SkVector radii[4]; | 1371 SkVector radii[4]; |
| 1428 setRadii(radii, topLeft, topRight, bottomRight, bottomLeft); | 1372 setRadii(radii, topLeft, topRight, bottomRight, bottomLeft); |
| 1429 | 1373 |
| 1430 SkRRect rr; | 1374 SkRRect rr; |
| 1431 rr.setRectRadii(rect, radii); | 1375 rr.setRectRadii(rect, radii); |
| 1432 | 1376 |
| 1433 SkPaint paint; | 1377 SkPaint paint(immutableState()->fillPaint()); |
| 1434 setupPaintForFilling(&paint); | |
| 1435 paint.setColor(color.rgb()); | 1378 paint.setColor(color.rgb()); |
| 1436 | 1379 |
| 1437 m_canvas->drawRRect(rr, paint); | 1380 m_canvas->drawRRect(rr, paint); |
| 1438 | 1381 |
| 1439 if (m_trackOpaqueRegion) | 1382 if (m_trackOpaqueRegion) |
| 1440 m_opaqueRegion.didDrawBounded(this, rr.getBounds(), paint); | 1383 m_opaqueRegion.didDrawBounded(this, rr.getBounds(), paint); |
| 1441 } | 1384 } |
| 1442 | 1385 |
| 1443 void GraphicsContext::fillEllipse(const FloatRect& ellipse) | 1386 void GraphicsContext::fillEllipse(const FloatRect& ellipse) |
| 1444 { | 1387 { |
| 1445 if (paintingDisabled()) | 1388 if (paintingDisabled()) |
| 1446 return; | 1389 return; |
| 1447 | 1390 |
| 1448 SkRect rect = ellipse; | 1391 SkRect rect = ellipse; |
| 1449 SkPaint paint; | 1392 drawOval(rect, immutableState()->fillPaint()); |
| 1450 setupPaintForFilling(&paint); | |
| 1451 drawOval(rect, paint); | |
| 1452 } | 1393 } |
| 1453 | 1394 |
| 1454 void GraphicsContext::strokePath(const Path& pathToStroke) | 1395 void GraphicsContext::strokePath(const Path& pathToStroke) |
| 1455 { | 1396 { |
| 1456 if (paintingDisabled() || pathToStroke.isEmpty()) | 1397 if (paintingDisabled() || pathToStroke.isEmpty()) |
| 1457 return; | 1398 return; |
| 1458 | 1399 |
| 1459 const SkPath& path = pathToStroke.skPath(); | 1400 const SkPath& path = pathToStroke.skPath(); |
| 1460 SkPaint paint; | 1401 drawPath(path, immutableState()->strokePaint()); |
| 1461 setupPaintForStroking(&paint); | |
| 1462 drawPath(path, paint); | |
| 1463 } | 1402 } |
| 1464 | 1403 |
| 1465 void GraphicsContext::strokeRect(const FloatRect& rect, float lineWidth) | 1404 void GraphicsContext::strokeRect(const FloatRect& rect, float lineWidth) |
| 1466 { | 1405 { |
| 1467 if (paintingDisabled()) | 1406 if (paintingDisabled()) |
| 1468 return; | 1407 return; |
| 1469 | 1408 |
| 1470 SkPaint paint; | 1409 SkPaint paint(immutableState()->strokePaint()); |
| 1471 setupPaintForStroking(&paint); | |
| 1472 paint.setStrokeWidth(WebCoreFloatToSkScalar(lineWidth)); | 1410 paint.setStrokeWidth(WebCoreFloatToSkScalar(lineWidth)); |
| 1473 // strokerect has special rules for CSS when the rect is degenerate: | 1411 // strokerect has special rules for CSS when the rect is degenerate: |
| 1474 // if width==0 && height==0, do nothing | 1412 // if width==0 && height==0, do nothing |
| 1475 // if width==0 || height==0, then just draw line for the other dimension | 1413 // if width==0 || height==0, then just draw line for the other dimension |
| 1476 SkRect r(rect); | 1414 SkRect r(rect); |
| 1477 bool validW = r.width() > 0; | 1415 bool validW = r.width() > 0; |
| 1478 bool validH = r.height() > 0; | 1416 bool validH = r.height() > 0; |
| 1479 if (validW && validH) { | 1417 if (validW && validH) { |
| 1480 drawRect(r, paint); | 1418 drawRect(r, paint); |
| 1481 } else if (validW || validH) { | 1419 } else if (validW || validH) { |
| 1482 // we are expected to respect the lineJoin, so we can't just call | 1420 // we are expected to respect the lineJoin, so we can't just call |
| 1483 // drawLine -- we have to create a path that doubles back on itself. | 1421 // drawLine -- we have to create a path that doubles back on itself. |
| 1484 SkPath path; | 1422 SkPath path; |
| 1485 path.moveTo(r.fLeft, r.fTop); | 1423 path.moveTo(r.fLeft, r.fTop); |
| 1486 path.lineTo(r.fRight, r.fBottom); | 1424 path.lineTo(r.fRight, r.fBottom); |
| 1487 path.close(); | 1425 path.close(); |
| 1488 drawPath(path, paint); | 1426 drawPath(path, paint); |
| 1489 } | 1427 } |
| 1490 } | 1428 } |
| 1491 | 1429 |
| 1492 void GraphicsContext::strokeEllipse(const FloatRect& ellipse) | 1430 void GraphicsContext::strokeEllipse(const FloatRect& ellipse) |
| 1493 { | 1431 { |
| 1494 if (paintingDisabled()) | 1432 if (paintingDisabled()) |
| 1495 return; | 1433 return; |
| 1496 | 1434 |
| 1497 SkRect rect(ellipse); | 1435 drawOval(ellipse, immutableState()->strokePaint()); |
| 1498 SkPaint paint; | |
| 1499 setupPaintForStroking(&paint); | |
| 1500 drawOval(rect, paint); | |
| 1501 } | 1436 } |
| 1502 | 1437 |
| 1503 void GraphicsContext::clipRoundedRect(const RoundedRect& rect, SkRegion::Op regi
onOp) | 1438 void GraphicsContext::clipRoundedRect(const RoundedRect& rect, SkRegion::Op regi
onOp) |
| 1504 { | 1439 { |
| 1505 if (paintingDisabled()) | 1440 if (paintingDisabled()) |
| 1506 return; | 1441 return; |
| 1507 | 1442 |
| 1508 if (!rect.isRounded()) { | 1443 if (!rect.isRounded()) { |
| 1509 clipRect(rect.rect(), NotAntiAliased, regionOp); | 1444 clipRect(rect.rect(), NotAntiAliased, regionOp); |
| 1510 return; | 1445 return; |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1735 setFillRule(oldFillRule); | 1670 setFillRule(oldFillRule); |
| 1736 setFillColor(oldFillColor); | 1671 setFillColor(oldFillColor); |
| 1737 } | 1672 } |
| 1738 | 1673 |
| 1739 void GraphicsContext::clearRect(const FloatRect& rect) | 1674 void GraphicsContext::clearRect(const FloatRect& rect) |
| 1740 { | 1675 { |
| 1741 if (paintingDisabled()) | 1676 if (paintingDisabled()) |
| 1742 return; | 1677 return; |
| 1743 | 1678 |
| 1744 SkRect r = rect; | 1679 SkRect r = rect; |
| 1745 SkPaint paint; | 1680 SkPaint paint(immutableState()->fillPaint()); |
| 1746 setupPaintForFilling(&paint); | |
| 1747 paint.setXfermodeMode(SkXfermode::kClear_Mode); | 1681 paint.setXfermodeMode(SkXfermode::kClear_Mode); |
| 1748 drawRect(r, paint); | 1682 drawRect(r, paint); |
| 1749 } | 1683 } |
| 1750 | 1684 |
| 1751 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2
, float strokeWidth, StrokeStyle penStyle) | 1685 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2
, float strokeWidth, StrokeStyle penStyle) |
| 1752 { | 1686 { |
| 1753 // For odd widths, we add in 0.5 to the appropriate x/y so that the float ar
ithmetic | 1687 // For odd widths, we add in 0.5 to the appropriate x/y so that the float ar
ithmetic |
| 1754 // works out. For example, with a border width of 3, WebKit will pass us (y
1+y2)/2, e.g., | 1688 // works out. For example, with a border width of 3, WebKit will pass us (y
1+y2)/2, e.g., |
| 1755 // (50+53)/2 = 103/2 = 51 when we want 51.5. It is always true that an even
width gave | 1689 // (50+53)/2 = 103/2 = 51 when we want 51.5. It is always true that an even
width gave |
| 1756 // us a perfect position, but an odd width gave us a position that is off by
exactly 0.5. | 1690 // us a perfect position, but an odd width gave us a position that is off by
exactly 0.5. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1814 But webkit can sometimes send us non-convex 4-point values, so we mark t
he path's | 1748 But webkit can sometimes send us non-convex 4-point values, so we mark t
he path's |
| 1815 convexity as unknown, so it will get computed by skia at draw time. | 1749 convexity as unknown, so it will get computed by skia at draw time. |
| 1816 See crbug.com 108605 | 1750 See crbug.com 108605 |
| 1817 */ | 1751 */ |
| 1818 SkPath::Convexity convexity = SkPath::kConvex_Convexity; | 1752 SkPath::Convexity convexity = SkPath::kConvex_Convexity; |
| 1819 if (numPoints == 4) | 1753 if (numPoints == 4) |
| 1820 convexity = SkPath::kUnknown_Convexity; | 1754 convexity = SkPath::kUnknown_Convexity; |
| 1821 path->setConvexity(convexity); | 1755 path->setConvexity(convexity); |
| 1822 } | 1756 } |
| 1823 | 1757 |
| 1824 void GraphicsContext::setupPaintCommon(SkPaint* paint) const | |
| 1825 { | |
| 1826 #if defined(SK_DEBUG) | |
| 1827 { | |
| 1828 SkPaint defaultPaint; | |
| 1829 SkASSERT(*paint == defaultPaint); | |
| 1830 } | |
| 1831 #endif | |
| 1832 | |
| 1833 paint->setAntiAlias(m_paintState->m_shouldAntialias); | |
| 1834 | |
| 1835 if (!SkXfermode::IsMode(m_paintState->m_xferMode.get(), SkXfermode::kSrcOver
_Mode)) | |
| 1836 paint->setXfermode(m_paintState->m_xferMode.get()); | |
| 1837 | |
| 1838 if (m_paintState->m_looper) | |
| 1839 paint->setLooper(m_paintState->m_looper.get()); | |
| 1840 | |
| 1841 paint->setColorFilter(m_paintState->m_colorFilter.get()); | |
| 1842 } | |
| 1843 | |
| 1844 void GraphicsContext::drawOuterPath(const SkPath& path, SkPaint& paint, int widt
h) | 1758 void GraphicsContext::drawOuterPath(const SkPath& path, SkPaint& paint, int widt
h) |
| 1845 { | 1759 { |
| 1846 #if OS(MACOSX) | 1760 #if OS(MACOSX) |
| 1847 paint.setAlpha(64); | 1761 paint.setAlpha(64); |
| 1848 paint.setStrokeWidth(width); | 1762 paint.setStrokeWidth(width); |
| 1849 paint.setPathEffect(new SkCornerPathEffect((width - 1) * 0.5f))->unref(); | 1763 paint.setPathEffect(new SkCornerPathEffect((width - 1) * 0.5f))->unref(); |
| 1850 #else | 1764 #else |
| 1851 paint.setStrokeWidth(1); | 1765 paint.setStrokeWidth(1); |
| 1852 paint.setPathEffect(new SkCornerPathEffect(1))->unref(); | 1766 paint.setPathEffect(new SkCornerPathEffect(1))->unref(); |
| 1853 #endif | 1767 #endif |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1985 { | 1899 { |
| 1986 static const SkPMColor colors[] = { | 1900 static const SkPMColor colors[] = { |
| 1987 SkPreMultiplyARGB(0x60, 0xFF, 0x00, 0x00), // More transparent red | 1901 SkPreMultiplyARGB(0x60, 0xFF, 0x00, 0x00), // More transparent red |
| 1988 SkPreMultiplyARGB(0x60, 0xC0, 0xC0, 0xC0) // More transparent gray | 1902 SkPreMultiplyARGB(0x60, 0xC0, 0xC0, 0xC0) // More transparent gray |
| 1989 }; | 1903 }; |
| 1990 | 1904 |
| 1991 return colors[index]; | 1905 return colors[index]; |
| 1992 } | 1906 } |
| 1993 #endif | 1907 #endif |
| 1994 | 1908 |
| 1995 void GraphicsContext::setupShader(SkPaint* paint, Gradient* grad, Pattern* pat,
SkColor color) const | |
| 1996 { | |
| 1997 RefPtr<SkShader> shader; | |
| 1998 | |
| 1999 if (grad) { | |
| 2000 shader = grad->shader(); | |
| 2001 color = SK_ColorBLACK; | |
| 2002 } else if (pat) { | |
| 2003 shader = pat->shader(); | |
| 2004 color = SK_ColorBLACK; | |
| 2005 paint->setFilterBitmap(imageInterpolationQuality() != InterpolationNone)
; | |
| 2006 } | |
| 2007 | |
| 2008 paint->setColor(m_paintState->applyAlpha(color)); | |
| 2009 | |
| 2010 if (!shader) | |
| 2011 return; | |
| 2012 | |
| 2013 paint->setShader(shader.get()); | |
| 2014 } | |
| 2015 | |
| 2016 void GraphicsContext::didDrawTextInRect(const SkRect& textRect) | 1909 void GraphicsContext::didDrawTextInRect(const SkRect& textRect) |
| 2017 { | 1910 { |
| 2018 if (m_trackTextRegion) { | 1911 if (m_trackTextRegion) { |
| 2019 TRACE_EVENT0("skia", "PlatformContextSkia::trackTextRegion"); | 1912 TRACE_EVENT0("skia", "PlatformContextSkia::trackTextRegion"); |
| 2020 m_textRegion.join(textRect); | 1913 m_textRegion.join(textRect); |
| 2021 } | 1914 } |
| 2022 } | 1915 } |
| 2023 | 1916 |
| 2024 } | 1917 } |
| OLD | NEW |