| 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 16 matching lines...) Expand all Loading... |
| 27 #include "platform/graphics/GraphicsContext.h" | 27 #include "platform/graphics/GraphicsContext.h" |
| 28 | 28 |
| 29 #include "platform/geometry/FloatRect.h" | 29 #include "platform/geometry/FloatRect.h" |
| 30 #include "platform/geometry/FloatRoundedRect.h" | 30 #include "platform/geometry/FloatRoundedRect.h" |
| 31 #include "platform/geometry/IntRect.h" | 31 #include "platform/geometry/IntRect.h" |
| 32 #include "platform/graphics/ColorSpace.h" | 32 #include "platform/graphics/ColorSpace.h" |
| 33 #include "platform/graphics/GraphicsContextStateSaver.h" | 33 #include "platform/graphics/GraphicsContextStateSaver.h" |
| 34 #include "platform/graphics/ImageBuffer.h" | 34 #include "platform/graphics/ImageBuffer.h" |
| 35 #include "platform/graphics/Path.h" | 35 #include "platform/graphics/Path.h" |
| 36 #include "platform/graphics/paint/PaintController.h" | 36 #include "platform/graphics/paint/PaintController.h" |
| 37 #include "platform/graphics/paint/PaintRecord.h" |
| 38 #include "platform/graphics/paint/PaintRecorder.h" |
| 37 #include "platform/instrumentation/tracing/TraceEvent.h" | 39 #include "platform/instrumentation/tracing/TraceEvent.h" |
| 38 #include "platform/weborigin/KURL.h" | 40 #include "platform/weborigin/KURL.h" |
| 39 #include "skia/ext/platform_canvas.h" | 41 #include "skia/ext/platform_canvas.h" |
| 40 #include "third_party/skia/include/core/SkAnnotation.h" | 42 #include "third_party/skia/include/core/SkAnnotation.h" |
| 41 #include "third_party/skia/include/core/SkColorFilter.h" | 43 #include "third_party/skia/include/core/SkColorFilter.h" |
| 42 #include "third_party/skia/include/core/SkData.h" | 44 #include "third_party/skia/include/core/SkData.h" |
| 43 #include "third_party/skia/include/core/SkPicture.h" | |
| 44 #include "third_party/skia/include/core/SkPictureRecorder.h" | |
| 45 #include "third_party/skia/include/core/SkRRect.h" | 45 #include "third_party/skia/include/core/SkRRect.h" |
| 46 #include "third_party/skia/include/core/SkRefCnt.h" | 46 #include "third_party/skia/include/core/SkRefCnt.h" |
| 47 #include "third_party/skia/include/effects/SkLumaColorFilter.h" | 47 #include "third_party/skia/include/effects/SkLumaColorFilter.h" |
| 48 #include "third_party/skia/include/effects/SkPictureImageFilter.h" | 48 #include "third_party/skia/include/effects/SkPictureImageFilter.h" |
| 49 #include "third_party/skia/include/pathops/SkPathOps.h" | 49 #include "third_party/skia/include/pathops/SkPathOps.h" |
| 50 #include "third_party/skia/include/utils/SkNullCanvas.h" | 50 #include "third_party/skia/include/utils/SkNullCanvas.h" |
| 51 #include "wtf/Assertions.h" | 51 #include "wtf/Assertions.h" |
| 52 #include "wtf/MathExtras.h" | 52 #include "wtf/MathExtras.h" |
| 53 #include <memory> | 53 #include <memory> |
| 54 | 54 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 74 m_hasMetaData(!!metaData) { | 74 m_hasMetaData(!!metaData) { |
| 75 if (metaData) | 75 if (metaData) |
| 76 m_metaData = *metaData; | 76 m_metaData = *metaData; |
| 77 | 77 |
| 78 // FIXME: Do some tests to determine how many states are typically used, and | 78 // FIXME: Do some tests to determine how many states are typically used, and |
| 79 // allocate several here. | 79 // allocate several here. |
| 80 m_paintStateStack.push_back(GraphicsContextState::create()); | 80 m_paintStateStack.push_back(GraphicsContextState::create()); |
| 81 m_paintState = m_paintStateStack.back().get(); | 81 m_paintState = m_paintStateStack.back().get(); |
| 82 | 82 |
| 83 if (contextDisabled()) { | 83 if (contextDisabled()) { |
| 84 DEFINE_STATIC_LOCAL(SkCanvas*, nullCanvas, (SkMakeNullCanvas().release())); | 84 DEFINE_STATIC_LOCAL(SkCanvas*, nullSkCanvas, |
| 85 m_canvas = nullCanvas; | 85 (SkMakeNullCanvas().release())); |
| 86 DEFINE_STATIC_LOCAL(PaintCanvasPassThrough, nullCanvas, (nullSkCanvas)); |
| 87 m_canvas = &nullCanvas; |
| 86 } | 88 } |
| 87 } | 89 } |
| 88 | 90 |
| 89 GraphicsContext::~GraphicsContext() { | 91 GraphicsContext::~GraphicsContext() { |
| 90 #if DCHECK_IS_ON() | 92 #if DCHECK_IS_ON() |
| 91 if (!m_disableDestructionChecks) { | 93 if (!m_disableDestructionChecks) { |
| 92 ASSERT(!m_paintStateIndex); | 94 ASSERT(!m_paintStateIndex); |
| 93 ASSERT(!m_paintState->saveCount()); | 95 ASSERT(!m_paintState->saveCount()); |
| 94 ASSERT(!m_layerCount); | 96 ASSERT(!m_layerCount); |
| 95 ASSERT(!saveCount()); | 97 ASSERT(!saveCount()); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 // (on top of its own saveCount), except for the first frame. | 135 // (on top of its own saveCount), except for the first frame. |
| 134 unsigned count = m_paintStateIndex; | 136 unsigned count = m_paintStateIndex; |
| 135 ASSERT(m_paintStateStack.size() > m_paintStateIndex); | 137 ASSERT(m_paintStateStack.size() > m_paintStateIndex); |
| 136 for (unsigned i = 0; i <= m_paintStateIndex; ++i) | 138 for (unsigned i = 0; i <= m_paintStateIndex; ++i) |
| 137 count += m_paintStateStack[i]->saveCount(); | 139 count += m_paintStateStack[i]->saveCount(); |
| 138 | 140 |
| 139 return count; | 141 return count; |
| 140 } | 142 } |
| 141 #endif | 143 #endif |
| 142 | 144 |
| 143 void GraphicsContext::saveLayer(const SkRect* bounds, const SkPaint* paint) { | 145 void GraphicsContext::saveLayer(const SkRect* bounds, const PaintFlags* paint) { |
| 144 if (contextDisabled()) | 146 if (contextDisabled()) |
| 145 return; | 147 return; |
| 146 | 148 |
| 147 ASSERT(m_canvas); | 149 ASSERT(m_canvas); |
| 148 | |
| 149 m_canvas->saveLayer(bounds, paint); | 150 m_canvas->saveLayer(bounds, paint); |
| 150 } | 151 } |
| 151 | 152 |
| 152 void GraphicsContext::restoreLayer() { | 153 void GraphicsContext::restoreLayer() { |
| 153 if (contextDisabled()) | 154 if (contextDisabled()) |
| 154 return; | 155 return; |
| 155 | 156 |
| 156 ASSERT(m_canvas); | 157 ASSERT(m_canvas); |
| 157 | 158 |
| 158 m_canvas->restore(); | 159 m_canvas->restore(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 } | 227 } |
| 227 | 228 |
| 228 void GraphicsContext::beginLayer(float opacity, | 229 void GraphicsContext::beginLayer(float opacity, |
| 229 SkBlendMode xfermode, | 230 SkBlendMode xfermode, |
| 230 const FloatRect* bounds, | 231 const FloatRect* bounds, |
| 231 ColorFilter colorFilter, | 232 ColorFilter colorFilter, |
| 232 sk_sp<SkImageFilter> imageFilter) { | 233 sk_sp<SkImageFilter> imageFilter) { |
| 233 if (contextDisabled()) | 234 if (contextDisabled()) |
| 234 return; | 235 return; |
| 235 | 236 |
| 236 SkPaint layerPaint; | 237 PaintFlags layerPaint; |
| 237 layerPaint.setAlpha(static_cast<unsigned char>(opacity * 255)); | 238 layerPaint.setAlpha(static_cast<unsigned char>(opacity * 255)); |
| 238 layerPaint.setBlendMode(xfermode); | 239 layerPaint.setBlendMode(xfermode); |
| 239 layerPaint.setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter)); | 240 layerPaint.setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter)); |
| 240 layerPaint.setImageFilter(std::move(imageFilter)); | 241 layerPaint.setImageFilter(std::move(imageFilter)); |
| 241 | 242 |
| 242 if (bounds) { | 243 if (bounds) { |
| 243 SkRect skBounds = *bounds; | 244 SkRect skBounds = *bounds; |
| 244 saveLayer(&skBounds, &layerPaint); | 245 saveLayer(&skBounds, &layerPaint); |
| 245 } else { | 246 } else { |
| 246 saveLayer(nullptr, &layerPaint); | 247 saveLayer(nullptr, &layerPaint); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 267 return; | 268 return; |
| 268 | 269 |
| 269 DCHECK(!m_canvas); | 270 DCHECK(!m_canvas); |
| 270 m_canvas = m_pictureRecorder.beginRecording(bounds, nullptr); | 271 m_canvas = m_pictureRecorder.beginRecording(bounds, nullptr); |
| 271 if (m_hasMetaData) | 272 if (m_hasMetaData) |
| 272 skia::GetMetaData(*m_canvas) = m_metaData; | 273 skia::GetMetaData(*m_canvas) = m_metaData; |
| 273 } | 274 } |
| 274 | 275 |
| 275 namespace { | 276 namespace { |
| 276 | 277 |
| 277 sk_sp<SkPicture> createEmptyPicture() { | 278 sk_sp<PaintRecord> createEmptyPicture() { |
| 278 SkPictureRecorder recorder; | 279 PaintRecorder recorder; |
| 279 recorder.beginRecording(SkRect::MakeEmpty(), nullptr); | 280 recorder.beginRecording(SkRect::MakeEmpty(), nullptr); |
| 280 return recorder.finishRecordingAsPicture(); | 281 return recorder.finishRecordingAsPicture(); |
| 281 } | 282 } |
| 282 | 283 |
| 283 } // anonymous namespace | 284 } // anonymous namespace |
| 284 | 285 |
| 285 sk_sp<SkPicture> GraphicsContext::endRecording() { | 286 sk_sp<PaintRecord> GraphicsContext::endRecording() { |
| 286 if (contextDisabled()) { | 287 if (contextDisabled()) { |
| 287 // Clients expect endRecording() to always return a non-null picture. | 288 // Clients expect endRecording() to always return a non-null picture. |
| 288 // Cache an empty SKP to minimize overhead when disabled. | 289 // Cache an empty SKP to minimize overhead when disabled. |
| 289 DEFINE_STATIC_LOCAL(sk_sp<SkPicture>, emptyPicture, (createEmptyPicture())); | 290 DEFINE_STATIC_LOCAL(sk_sp<PaintRecord>, emptyPicture, |
| 291 (createEmptyPicture())); |
| 290 return emptyPicture; | 292 return emptyPicture; |
| 291 } | 293 } |
| 292 | 294 |
| 293 sk_sp<SkPicture> picture = m_pictureRecorder.finishRecordingAsPicture(); | 295 sk_sp<PaintRecord> picture = m_pictureRecorder.finishRecordingAsPicture(); |
| 294 m_canvas = nullptr; | 296 m_canvas = nullptr; |
| 295 ASSERT(picture); | 297 ASSERT(picture); |
| 296 return picture; | 298 return picture; |
| 297 } | 299 } |
| 298 | 300 |
| 299 void GraphicsContext::drawPicture(const SkPicture* picture) { | 301 void GraphicsContext::drawPicture(const PaintRecord* picture) { |
| 300 if (contextDisabled() || !picture || picture->cullRect().isEmpty()) | 302 if (contextDisabled() || !picture || picture->cullRect().isEmpty()) |
| 301 return; | 303 return; |
| 302 | 304 |
| 303 ASSERT(m_canvas); | 305 ASSERT(m_canvas); |
| 304 m_canvas->drawPicture(picture); | 306 m_canvas->drawPicture(picture); |
| 305 } | 307 } |
| 306 | 308 |
| 307 void GraphicsContext::compositePicture(sk_sp<SkPicture> picture, | 309 void GraphicsContext::compositePicture(sk_sp<PaintRecord> picture, |
| 308 const FloatRect& dest, | 310 const FloatRect& dest, |
| 309 const FloatRect& src, | 311 const FloatRect& src, |
| 310 SkBlendMode op) { | 312 SkBlendMode op) { |
| 311 if (contextDisabled() || !picture) | 313 if (contextDisabled() || !picture) |
| 312 return; | 314 return; |
| 313 ASSERT(m_canvas); | 315 ASSERT(m_canvas); |
| 314 | 316 |
| 315 SkPaint picturePaint; | 317 PaintFlags picturePaint; |
| 316 picturePaint.setBlendMode(op); | 318 picturePaint.setBlendMode(op); |
| 317 m_canvas->save(); | 319 m_canvas->save(); |
| 318 SkRect sourceBounds = src; | 320 SkRect sourceBounds = src; |
| 319 SkRect skBounds = dest; | 321 SkRect skBounds = dest; |
| 320 SkMatrix pictureTransform; | 322 SkMatrix pictureTransform; |
| 321 pictureTransform.setRectToRect(sourceBounds, skBounds, | 323 pictureTransform.setRectToRect(sourceBounds, skBounds, |
| 322 SkMatrix::kFill_ScaleToFit); | 324 SkMatrix::kFill_ScaleToFit); |
| 323 m_canvas->concat(pictureTransform); | 325 m_canvas->concat(pictureTransform); |
| 324 picturePaint.setImageFilter(SkPictureImageFilter::MakeForLocalSpace( | 326 picturePaint.setImageFilter(SkPictureImageFilter::MakeForLocalSpace( |
| 325 std::move(picture), sourceBounds, | 327 ToSkPicture(picture), sourceBounds, |
| 326 static_cast<SkFilterQuality>(imageInterpolationQuality()))); | 328 static_cast<SkFilterQuality>(imageInterpolationQuality()))); |
| 327 m_canvas->saveLayer(&sourceBounds, &picturePaint); | 329 m_canvas->saveLayer(&sourceBounds, &picturePaint); |
| 328 m_canvas->restore(); | 330 m_canvas->restore(); |
| 329 m_canvas->restore(); | 331 m_canvas->restore(); |
| 330 } | 332 } |
| 331 | 333 |
| 332 void GraphicsContext::drawFocusRingPath(const SkPath& path, | 334 void GraphicsContext::drawFocusRingPath(const SkPath& path, |
| 333 const Color& color, | 335 const Color& color, |
| 334 float width) { | 336 float width) { |
| 335 drawPlatformFocusRing(path, m_canvas, color.rgb(), width); | 337 drawPlatformFocusRing(path, m_canvas, color.rgb(), width); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 FloatPoint p1 = point1; | 475 FloatPoint p1 = point1; |
| 474 FloatPoint p2 = point2; | 476 FloatPoint p2 = point2; |
| 475 bool isVerticalLine = (p1.x() == p2.x()); | 477 bool isVerticalLine = (p1.x() == p2.x()); |
| 476 int width = roundf(strokeThickness()); | 478 int width = roundf(strokeThickness()); |
| 477 | 479 |
| 478 // We know these are vertical or horizontal lines, so the length will just | 480 // We know these are vertical or horizontal lines, so the length will just |
| 479 // be the sum of the displacement component vectors give or take 1 - | 481 // be the sum of the displacement component vectors give or take 1 - |
| 480 // probably worth the speed up of no square root, which also won't be exact. | 482 // probably worth the speed up of no square root, which also won't be exact. |
| 481 FloatSize disp = p2 - p1; | 483 FloatSize disp = p2 - p1; |
| 482 int length = SkScalarRoundToInt(disp.width() + disp.height()); | 484 int length = SkScalarRoundToInt(disp.width() + disp.height()); |
| 483 SkPaint paint(immutableState()->strokePaint(length)); | 485 PaintFlags paint(immutableState()->strokePaint(length)); |
| 484 | 486 |
| 485 if (getStrokeStyle() == DottedStroke || getStrokeStyle() == DashedStroke) { | 487 if (getStrokeStyle() == DottedStroke || getStrokeStyle() == DashedStroke) { |
| 486 // Do a rect fill of our endpoints. This ensures we always have the | 488 // Do a rect fill of our endpoints. This ensures we always have the |
| 487 // appearance of being a border. We then draw the actual dotted/dashed | 489 // appearance of being a border. We then draw the actual dotted/dashed |
| 488 // line. | 490 // line. |
| 489 SkRect r1, r2; | 491 SkRect r1, r2; |
| 490 r1.set(p1.x(), p1.y(), p1.x() + width, p1.y() + width); | 492 r1.set(p1.x(), p1.y(), p1.x() + width, p1.y() + width); |
| 491 r2.set(p2.x(), p2.y(), p2.x() + width, p2.y() + width); | 493 r2.set(p2.x(), p2.y(), p2.x() + width, p2.y() + width); |
| 492 | 494 |
| 493 if (isVerticalLine) { | 495 if (isVerticalLine) { |
| 494 r1.offset(-width / 2, 0); | 496 r1.offset(-width / 2, 0); |
| 495 r2.offset(-width / 2, -width); | 497 r2.offset(-width / 2, -width); |
| 496 } else { | 498 } else { |
| 497 r1.offset(0, -width / 2); | 499 r1.offset(0, -width / 2); |
| 498 r2.offset(-width, -width / 2); | 500 r2.offset(-width, -width / 2); |
| 499 } | 501 } |
| 500 SkPaint fillPaint; | 502 PaintFlags fillPaint; |
| 501 fillPaint.setColor(paint.getColor()); | 503 fillPaint.setColor(paint.getColor()); |
| 502 drawRect(r1, fillPaint); | 504 drawRect(r1, fillPaint); |
| 503 drawRect(r2, fillPaint); | 505 drawRect(r2, fillPaint); |
| 504 } | 506 } |
| 505 | 507 |
| 506 adjustLineToPixelBoundaries(p1, p2, width, penStyle); | 508 adjustLineToPixelBoundaries(p1, p2, width, penStyle); |
| 507 m_canvas->drawLine(p1.x(), p1.y(), p2.x(), p2.y(), paint); | 509 m_canvas->drawLine(p1.x(), p1.y(), p2.x(), p2.y(), paint); |
| 508 } | 510 } |
| 509 | 511 |
| 510 void GraphicsContext::drawLineForDocumentMarker(const FloatPoint& pt, | 512 void GraphicsContext::drawLineForDocumentMarker(const FloatPoint& pt, |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 | 621 |
| 620 // Offset it vertically by 1 so that there's some space under the text. | 622 // Offset it vertically by 1 so that there's some space under the text. |
| 621 SkScalar originY = WebCoreFloatToSkScalar(pt.y()) + 1; | 623 SkScalar originY = WebCoreFloatToSkScalar(pt.y()) + 1; |
| 622 originX *= deviceScaleFactor; | 624 originX *= deviceScaleFactor; |
| 623 originY *= deviceScaleFactor; | 625 originY *= deviceScaleFactor; |
| 624 #endif | 626 #endif |
| 625 | 627 |
| 626 SkMatrix localMatrix; | 628 SkMatrix localMatrix; |
| 627 localMatrix.setTranslate(originX, originY); | 629 localMatrix.setTranslate(originX, originY); |
| 628 | 630 |
| 629 SkPaint paint; | 631 PaintFlags paint; |
| 630 paint.setShader(SkShader::MakeBitmapShader( | 632 paint.setShader(WrapSkShader(SkShader::MakeBitmapShader( |
| 631 *misspellBitmap[index], SkShader::kRepeat_TileMode, | 633 *misspellBitmap[index], SkShader::kRepeat_TileMode, |
| 632 SkShader::kRepeat_TileMode, &localMatrix)); | 634 SkShader::kRepeat_TileMode, &localMatrix))); |
| 633 | 635 |
| 634 SkRect rect; | 636 SkRect rect; |
| 635 rect.set(originX, originY, | 637 rect.set(originX, originY, |
| 636 originX + WebCoreFloatToSkScalar(width) * deviceScaleFactor, | 638 originX + WebCoreFloatToSkScalar(width) * deviceScaleFactor, |
| 637 originY + SkIntToScalar(misspellBitmap[index]->height())); | 639 originY + SkIntToScalar(misspellBitmap[index]->height())); |
| 638 | 640 |
| 639 if (deviceScaleFactor == 2) { | 641 if (deviceScaleFactor == 2) { |
| 640 save(); | 642 save(); |
| 641 scale(0.5, 0.5); | 643 scale(0.5, 0.5); |
| 642 } | 644 } |
| 643 drawRect(rect, paint); | 645 drawRect(rect, paint); |
| 644 if (deviceScaleFactor == 2) | 646 if (deviceScaleFactor == 2) |
| 645 restore(); | 647 restore(); |
| 646 } | 648 } |
| 647 | 649 |
| 648 void GraphicsContext::drawLineForText(const FloatPoint& pt, float width) { | 650 void GraphicsContext::drawLineForText(const FloatPoint& pt, float width) { |
| 649 if (contextDisabled()) | 651 if (contextDisabled()) |
| 650 return; | 652 return; |
| 651 | 653 |
| 652 if (width <= 0) | 654 if (width <= 0) |
| 653 return; | 655 return; |
| 654 | 656 |
| 655 SkPaint paint; | 657 PaintFlags paint; |
| 656 switch (getStrokeStyle()) { | 658 switch (getStrokeStyle()) { |
| 657 case NoStroke: | 659 case NoStroke: |
| 658 case SolidStroke: | 660 case SolidStroke: |
| 659 case DoubleStroke: { | 661 case DoubleStroke: { |
| 660 int thickness = SkMax32(static_cast<int>(strokeThickness()), 1); | 662 int thickness = SkMax32(static_cast<int>(strokeThickness()), 1); |
| 661 SkRect r; | 663 SkRect r; |
| 662 r.fLeft = WebCoreFloatToSkScalar(pt.x()); | 664 r.fLeft = WebCoreFloatToSkScalar(pt.x()); |
| 663 // Avoid anti-aliasing lines. Currently, these are always horizontal. | 665 // Avoid anti-aliasing lines. Currently, these are always horizontal. |
| 664 // Round to nearest pixel to match text and other content. | 666 // Round to nearest pixel to match text and other content. |
| 665 r.fTop = WebCoreFloatToSkScalar(floorf(pt.y() + 0.5f)); | 667 r.fTop = WebCoreFloatToSkScalar(floorf(pt.y() + 0.5f)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 694 if (rect.isEmpty()) | 696 if (rect.isEmpty()) |
| 695 return; | 697 return; |
| 696 | 698 |
| 697 SkRect skRect = rect; | 699 SkRect skRect = rect; |
| 698 if (immutableState()->fillColor().alpha()) | 700 if (immutableState()->fillColor().alpha()) |
| 699 drawRect(skRect, immutableState()->fillPaint()); | 701 drawRect(skRect, immutableState()->fillPaint()); |
| 700 | 702 |
| 701 if (immutableState()->getStrokeData().style() != NoStroke && | 703 if (immutableState()->getStrokeData().style() != NoStroke && |
| 702 immutableState()->strokeColor().alpha()) { | 704 immutableState()->strokeColor().alpha()) { |
| 703 // Stroke a width: 1 inset border | 705 // Stroke a width: 1 inset border |
| 704 SkPaint paint(immutableState()->fillPaint()); | 706 PaintFlags paint(immutableState()->fillPaint()); |
| 705 paint.setColor(strokeColor().rgb()); | 707 paint.setColor(strokeColor().rgb()); |
| 706 paint.setStyle(SkPaint::kStroke_Style); | 708 paint.setStyle(PaintFlags::kStroke_Style); |
| 707 paint.setStrokeWidth(1); | 709 paint.setStrokeWidth(1); |
| 708 | 710 |
| 709 skRect.inset(0.5f, 0.5f); | 711 skRect.inset(0.5f, 0.5f); |
| 710 drawRect(skRect, paint); | 712 drawRect(skRect, paint); |
| 711 } | 713 } |
| 712 } | 714 } |
| 713 | 715 |
| 714 void GraphicsContext::drawText(const Font& font, | 716 void GraphicsContext::drawText(const Font& font, |
| 715 const TextRunPaintInfo& runInfo, | 717 const TextRunPaintInfo& runInfo, |
| 716 const FloatPoint& point, | 718 const FloatPoint& point, |
| 717 const SkPaint& paint) { | 719 const PaintFlags& paint) { |
| 718 if (contextDisabled()) | 720 if (contextDisabled()) |
| 719 return; | 721 return; |
| 720 | 722 |
| 721 if (font.drawText(m_canvas, runInfo, point, m_deviceScaleFactor, paint)) | 723 if (font.drawText(m_canvas, runInfo, point, m_deviceScaleFactor, paint)) |
| 722 m_paintController.setTextPainted(); | 724 m_paintController.setTextPainted(); |
| 723 } | 725 } |
| 724 | 726 |
| 725 template <typename DrawTextFunc> | 727 template <typename DrawTextFunc> |
| 726 void GraphicsContext::drawTextPasses(const DrawTextFunc& drawText) { | 728 void GraphicsContext::drawTextPasses(const DrawTextFunc& drawText) { |
| 727 TextDrawingModeFlags modeFlags = textDrawingMode(); | 729 TextDrawingModeFlags modeFlags = textDrawingMode(); |
| 728 | 730 |
| 729 if (modeFlags & TextModeFill) { | 731 if (modeFlags & TextModeFill) { |
| 730 drawText(immutableState()->fillPaint()); | 732 drawText(immutableState()->fillPaint()); |
| 731 } | 733 } |
| 732 | 734 |
| 733 if ((modeFlags & TextModeStroke) && getStrokeStyle() != NoStroke && | 735 if ((modeFlags & TextModeStroke) && getStrokeStyle() != NoStroke && |
| 734 strokeThickness() > 0) { | 736 strokeThickness() > 0) { |
| 735 SkPaint paintForStroking(immutableState()->strokePaint()); | 737 PaintFlags paintForStroking(immutableState()->strokePaint()); |
| 736 if (modeFlags & TextModeFill) { | 738 if (modeFlags & TextModeFill) { |
| 737 paintForStroking.setLooper( | 739 paintForStroking.setLooper( |
| 738 0); // shadow was already applied during fill pass | 740 0); // shadow was already applied during fill pass |
| 739 } | 741 } |
| 740 drawText(paintForStroking); | 742 drawText(paintForStroking); |
| 741 } | 743 } |
| 742 } | 744 } |
| 743 | 745 |
| 744 void GraphicsContext::drawText(const Font& font, | 746 void GraphicsContext::drawText(const Font& font, |
| 745 const TextRunPaintInfo& runInfo, | 747 const TextRunPaintInfo& runInfo, |
| 746 const FloatPoint& point) { | 748 const FloatPoint& point) { |
| 747 if (contextDisabled()) | 749 if (contextDisabled()) |
| 748 return; | 750 return; |
| 749 | 751 |
| 750 drawTextPasses([&font, &runInfo, &point, this](const SkPaint& paint) { | 752 drawTextPasses([&font, &runInfo, &point, this](const PaintFlags& paint) { |
| 751 if (font.drawText(m_canvas, runInfo, point, m_deviceScaleFactor, paint)) | 753 if (font.drawText(m_canvas, runInfo, point, m_deviceScaleFactor, paint)) |
| 752 m_paintController.setTextPainted(); | 754 m_paintController.setTextPainted(); |
| 753 }); | 755 }); |
| 754 } | 756 } |
| 755 | 757 |
| 756 void GraphicsContext::drawEmphasisMarks(const Font& font, | 758 void GraphicsContext::drawEmphasisMarks(const Font& font, |
| 757 const TextRunPaintInfo& runInfo, | 759 const TextRunPaintInfo& runInfo, |
| 758 const AtomicString& mark, | 760 const AtomicString& mark, |
| 759 const FloatPoint& point) { | 761 const FloatPoint& point) { |
| 760 if (contextDisabled()) | 762 if (contextDisabled()) |
| 761 return; | 763 return; |
| 762 | 764 |
| 763 drawTextPasses([&font, &runInfo, &mark, &point, this](const SkPaint& paint) { | 765 drawTextPasses([&font, &runInfo, &mark, &point, |
| 766 this](const PaintFlags& paint) { |
| 764 font.drawEmphasisMarks(m_canvas, runInfo, mark, point, m_deviceScaleFactor, | 767 font.drawEmphasisMarks(m_canvas, runInfo, mark, point, m_deviceScaleFactor, |
| 765 paint); | 768 paint); |
| 766 }); | 769 }); |
| 767 } | 770 } |
| 768 | 771 |
| 769 void GraphicsContext::drawBidiText( | 772 void GraphicsContext::drawBidiText( |
| 770 const Font& font, | 773 const Font& font, |
| 771 const TextRunPaintInfo& runInfo, | 774 const TextRunPaintInfo& runInfo, |
| 772 const FloatPoint& point, | 775 const FloatPoint& point, |
| 773 Font::CustomFontNotReadyAction customFontNotReadyAction) { | 776 Font::CustomFontNotReadyAction customFontNotReadyAction) { |
| 774 if (contextDisabled()) | 777 if (contextDisabled()) |
| 775 return; | 778 return; |
| 776 | 779 |
| 777 drawTextPasses([&font, &runInfo, &point, customFontNotReadyAction, | 780 drawTextPasses([&font, &runInfo, &point, customFontNotReadyAction, |
| 778 this](const SkPaint& paint) { | 781 this](const PaintFlags& paint) { |
| 779 if (font.drawBidiText(m_canvas, runInfo, point, customFontNotReadyAction, | 782 if (font.drawBidiText(m_canvas, runInfo, point, customFontNotReadyAction, |
| 780 m_deviceScaleFactor, paint)) | 783 m_deviceScaleFactor, paint)) |
| 781 m_paintController.setTextPainted(); | 784 m_paintController.setTextPainted(); |
| 782 }); | 785 }); |
| 783 } | 786 } |
| 784 | 787 |
| 785 void GraphicsContext::drawHighlightForText(const Font& font, | 788 void GraphicsContext::drawHighlightForText(const Font& font, |
| 786 const TextRun& run, | 789 const TextRun& run, |
| 787 const FloatPoint& point, | 790 const FloatPoint& point, |
| 788 int h, | 791 int h, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 799 Image* image, | 802 Image* image, |
| 800 const FloatRect& dest, | 803 const FloatRect& dest, |
| 801 const FloatRect* srcPtr, | 804 const FloatRect* srcPtr, |
| 802 SkBlendMode op, | 805 SkBlendMode op, |
| 803 RespectImageOrientationEnum shouldRespectImageOrientation) { | 806 RespectImageOrientationEnum shouldRespectImageOrientation) { |
| 804 if (contextDisabled() || !image) | 807 if (contextDisabled() || !image) |
| 805 return; | 808 return; |
| 806 | 809 |
| 807 const FloatRect src = srcPtr ? *srcPtr : image->rect(); | 810 const FloatRect src = srcPtr ? *srcPtr : image->rect(); |
| 808 | 811 |
| 809 SkPaint imagePaint = immutableState()->fillPaint(); | 812 PaintFlags imagePaint = immutableState()->fillPaint(); |
| 810 imagePaint.setBlendMode(op); | 813 imagePaint.setBlendMode(op); |
| 811 imagePaint.setColor(SK_ColorBLACK); | 814 imagePaint.setColor(SK_ColorBLACK); |
| 812 imagePaint.setFilterQuality(computeFilterQuality(image, dest, src)); | 815 imagePaint.setFilterQuality(computeFilterQuality(image, dest, src)); |
| 813 imagePaint.setAntiAlias(shouldAntialias()); | 816 imagePaint.setAntiAlias(shouldAntialias()); |
| 814 image->draw(m_canvas, imagePaint, dest, src, shouldRespectImageOrientation, | 817 image->draw(m_canvas, imagePaint, dest, src, shouldRespectImageOrientation, |
| 815 Image::ClampImageToSourceRect, m_colorBehavior); | 818 Image::ClampImageToSourceRect, m_colorBehavior); |
| 816 m_paintController.setImagePainted(); | 819 m_paintController.setImagePainted(); |
| 817 } | 820 } |
| 818 | 821 |
| 819 void GraphicsContext::drawImageRRect( | 822 void GraphicsContext::drawImageRRect( |
| 820 Image* image, | 823 Image* image, |
| 821 const FloatRoundedRect& dest, | 824 const FloatRoundedRect& dest, |
| 822 const FloatRect& srcRect, | 825 const FloatRect& srcRect, |
| 823 SkBlendMode op, | 826 SkBlendMode op, |
| 824 RespectImageOrientationEnum respectOrientation) { | 827 RespectImageOrientationEnum respectOrientation) { |
| 825 if (contextDisabled() || !image) | 828 if (contextDisabled() || !image) |
| 826 return; | 829 return; |
| 827 | 830 |
| 828 if (!dest.isRounded()) { | 831 if (!dest.isRounded()) { |
| 829 drawImage(image, dest.rect(), &srcRect, op, respectOrientation); | 832 drawImage(image, dest.rect(), &srcRect, op, respectOrientation); |
| 830 return; | 833 return; |
| 831 } | 834 } |
| 832 | 835 |
| 833 DCHECK(dest.isRenderable()); | 836 DCHECK(dest.isRenderable()); |
| 834 | 837 |
| 835 const FloatRect visibleSrc = intersection(srcRect, image->rect()); | 838 const FloatRect visibleSrc = intersection(srcRect, image->rect()); |
| 836 if (dest.isEmpty() || visibleSrc.isEmpty()) | 839 if (dest.isEmpty() || visibleSrc.isEmpty()) |
| 837 return; | 840 return; |
| 838 | 841 |
| 839 SkPaint imagePaint = immutableState()->fillPaint(); | 842 PaintFlags imagePaint = immutableState()->fillPaint(); |
| 840 imagePaint.setBlendMode(op); | 843 imagePaint.setBlendMode(op); |
| 841 imagePaint.setColor(SK_ColorBLACK); | 844 imagePaint.setColor(SK_ColorBLACK); |
| 842 imagePaint.setFilterQuality( | 845 imagePaint.setFilterQuality( |
| 843 computeFilterQuality(image, dest.rect(), srcRect)); | 846 computeFilterQuality(image, dest.rect(), srcRect)); |
| 844 imagePaint.setAntiAlias(shouldAntialias()); | 847 imagePaint.setAntiAlias(shouldAntialias()); |
| 845 | 848 |
| 846 bool useShader = (visibleSrc == srcRect) && | 849 bool useShader = (visibleSrc == srcRect) && |
| 847 (respectOrientation == DoNotRespectImageOrientation); | 850 (respectOrientation == DoNotRespectImageOrientation); |
| 848 if (useShader) { | 851 if (useShader) { |
| 849 const SkMatrix localMatrix = SkMatrix::MakeRectToRect( | 852 const SkMatrix localMatrix = SkMatrix::MakeRectToRect( |
| 850 visibleSrc, dest.rect(), SkMatrix::kFill_ScaleToFit); | 853 visibleSrc, dest.rect(), SkMatrix::kFill_ScaleToFit); |
| 851 useShader = image->applyShader(imagePaint, localMatrix, m_colorBehavior); | 854 useShader = image->applyShader(imagePaint, localMatrix, m_colorBehavior); |
| 852 } | 855 } |
| 853 | 856 |
| 854 if (useShader) { | 857 if (useShader) { |
| 855 // Shader-based fast path. | 858 // Shader-based fast path. |
| 856 m_canvas->drawRRect(dest, imagePaint); | 859 m_canvas->drawRRect(dest, imagePaint); |
| 857 } else { | 860 } else { |
| 858 // Clip-based fallback. | 861 // Clip-based fallback. |
| 859 SkAutoCanvasRestore autoRestore(m_canvas, true); | 862 PaintCanvasAutoRestore autoRestore(m_canvas, true); |
| 860 m_canvas->clipRRect(dest, imagePaint.isAntiAlias()); | 863 m_canvas->clipRRect(dest, imagePaint.isAntiAlias()); |
| 861 image->draw(m_canvas, imagePaint, dest.rect(), srcRect, respectOrientation, | 864 image->draw(m_canvas, imagePaint, dest.rect(), srcRect, respectOrientation, |
| 862 Image::ClampImageToSourceRect, m_colorBehavior); | 865 Image::ClampImageToSourceRect, m_colorBehavior); |
| 863 } | 866 } |
| 864 | 867 |
| 865 m_paintController.setImagePainted(); | 868 m_paintController.setImagePainted(); |
| 866 } | 869 } |
| 867 | 870 |
| 868 SkFilterQuality GraphicsContext::computeFilterQuality( | 871 SkFilterQuality GraphicsContext::computeFilterQuality( |
| 869 Image* image, | 872 Image* image, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 // Just do a scale. | 921 // Just do a scale. |
| 919 drawImage(image, dest, &srcRect, op); | 922 drawImage(image, dest, &srcRect, op); |
| 920 return; | 923 return; |
| 921 } | 924 } |
| 922 | 925 |
| 923 image->drawTiledBorder(*this, dest, srcRect, tileScaleFactor, hRule, vRule, | 926 image->drawTiledBorder(*this, dest, srcRect, tileScaleFactor, hRule, vRule, |
| 924 op); | 927 op); |
| 925 m_paintController.setImagePainted(); | 928 m_paintController.setImagePainted(); |
| 926 } | 929 } |
| 927 | 930 |
| 928 void GraphicsContext::drawOval(const SkRect& oval, const SkPaint& paint) { | 931 void GraphicsContext::drawOval(const SkRect& oval, const PaintFlags& paint) { |
| 929 if (contextDisabled()) | 932 if (contextDisabled()) |
| 930 return; | 933 return; |
| 931 ASSERT(m_canvas); | 934 ASSERT(m_canvas); |
| 932 | 935 |
| 933 m_canvas->drawOval(oval, paint); | 936 m_canvas->drawOval(oval, paint); |
| 934 } | 937 } |
| 935 | 938 |
| 936 void GraphicsContext::drawPath(const SkPath& path, const SkPaint& paint) { | 939 void GraphicsContext::drawPath(const SkPath& path, const PaintFlags& paint) { |
| 937 if (contextDisabled()) | 940 if (contextDisabled()) |
| 938 return; | 941 return; |
| 939 ASSERT(m_canvas); | 942 ASSERT(m_canvas); |
| 940 | 943 |
| 941 m_canvas->drawPath(path, paint); | 944 m_canvas->drawPath(path, paint); |
| 942 } | 945 } |
| 943 | 946 |
| 944 void GraphicsContext::drawRect(const SkRect& rect, const SkPaint& paint) { | 947 void GraphicsContext::drawRect(const SkRect& rect, const PaintFlags& paint) { |
| 945 if (contextDisabled()) | 948 if (contextDisabled()) |
| 946 return; | 949 return; |
| 947 ASSERT(m_canvas); | 950 ASSERT(m_canvas); |
| 948 | 951 |
| 949 m_canvas->drawRect(rect, paint); | 952 m_canvas->drawRect(rect, paint); |
| 950 } | 953 } |
| 951 | 954 |
| 952 void GraphicsContext::drawRRect(const SkRRect& rrect, const SkPaint& paint) { | 955 void GraphicsContext::drawRRect(const SkRRect& rrect, const PaintFlags& paint) { |
| 953 if (contextDisabled()) | 956 if (contextDisabled()) |
| 954 return; | 957 return; |
| 955 ASSERT(m_canvas); | 958 ASSERT(m_canvas); |
| 956 | 959 |
| 957 m_canvas->drawRRect(rrect, paint); | 960 m_canvas->drawRRect(rrect, paint); |
| 958 } | 961 } |
| 959 | 962 |
| 960 void GraphicsContext::fillPath(const Path& pathToFill) { | 963 void GraphicsContext::fillPath(const Path& pathToFill) { |
| 961 if (contextDisabled() || pathToFill.isEmpty()) | 964 if (contextDisabled() || pathToFill.isEmpty()) |
| 962 return; | 965 return; |
| 963 | 966 |
| 964 drawPath(pathToFill.getSkPath(), immutableState()->fillPaint()); | 967 drawPath(pathToFill.getSkPath(), immutableState()->fillPaint()); |
| 965 } | 968 } |
| 966 | 969 |
| 967 void GraphicsContext::fillRect(const FloatRect& rect) { | 970 void GraphicsContext::fillRect(const FloatRect& rect) { |
| 968 if (contextDisabled()) | 971 if (contextDisabled()) |
| 969 return; | 972 return; |
| 970 | 973 |
| 971 drawRect(rect, immutableState()->fillPaint()); | 974 drawRect(rect, immutableState()->fillPaint()); |
| 972 } | 975 } |
| 973 | 976 |
| 974 void GraphicsContext::fillRect(const FloatRect& rect, | 977 void GraphicsContext::fillRect(const FloatRect& rect, |
| 975 const Color& color, | 978 const Color& color, |
| 976 SkBlendMode xferMode) { | 979 SkBlendMode xferMode) { |
| 977 if (contextDisabled()) | 980 if (contextDisabled()) |
| 978 return; | 981 return; |
| 979 | 982 |
| 980 SkPaint paint = immutableState()->fillPaint(); | 983 PaintFlags paint = immutableState()->fillPaint(); |
| 981 paint.setColor(color.rgb()); | 984 paint.setColor(color.rgb()); |
| 982 paint.setBlendMode(xferMode); | 985 paint.setBlendMode(xferMode); |
| 983 | 986 |
| 984 drawRect(rect, paint); | 987 drawRect(rect, paint); |
| 985 } | 988 } |
| 986 | 989 |
| 987 void GraphicsContext::fillRoundedRect(const FloatRoundedRect& rrect, | 990 void GraphicsContext::fillRoundedRect(const FloatRoundedRect& rrect, |
| 988 const Color& color) { | 991 const Color& color) { |
| 989 if (contextDisabled()) | 992 if (contextDisabled()) |
| 990 return; | 993 return; |
| 991 | 994 |
| 992 if (!rrect.isRounded() || !rrect.isRenderable()) { | 995 if (!rrect.isRounded() || !rrect.isRenderable()) { |
| 993 fillRect(rrect.rect(), color); | 996 fillRect(rrect.rect(), color); |
| 994 return; | 997 return; |
| 995 } | 998 } |
| 996 | 999 |
| 997 if (color == fillColor()) { | 1000 if (color == fillColor()) { |
| 998 drawRRect(rrect, immutableState()->fillPaint()); | 1001 drawRRect(rrect, immutableState()->fillPaint()); |
| 999 return; | 1002 return; |
| 1000 } | 1003 } |
| 1001 | 1004 |
| 1002 SkPaint paint = immutableState()->fillPaint(); | 1005 PaintFlags paint = immutableState()->fillPaint(); |
| 1003 paint.setColor(color.rgb()); | 1006 paint.setColor(color.rgb()); |
| 1004 | 1007 |
| 1005 drawRRect(rrect, paint); | 1008 drawRRect(rrect, paint); |
| 1006 } | 1009 } |
| 1007 | 1010 |
| 1008 namespace { | 1011 namespace { |
| 1009 | 1012 |
| 1010 bool isSimpleDRRect(const FloatRoundedRect& outer, | 1013 bool isSimpleDRRect(const FloatRoundedRect& outer, |
| 1011 const FloatRoundedRect& inner) { | 1014 const FloatRoundedRect& inner) { |
| 1012 // A DRRect is "simple" (i.e. can be drawn as a rrect stroke) if | 1015 // A DRRect is "simple" (i.e. can be drawn as a rrect stroke) if |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 const FloatRoundedRect& inner, | 1066 const FloatRoundedRect& inner, |
| 1064 const Color& color) { | 1067 const Color& color) { |
| 1065 if (contextDisabled()) | 1068 if (contextDisabled()) |
| 1066 return; | 1069 return; |
| 1067 ASSERT(m_canvas); | 1070 ASSERT(m_canvas); |
| 1068 | 1071 |
| 1069 if (!isSimpleDRRect(outer, inner)) { | 1072 if (!isSimpleDRRect(outer, inner)) { |
| 1070 if (color == fillColor()) { | 1073 if (color == fillColor()) { |
| 1071 m_canvas->drawDRRect(outer, inner, immutableState()->fillPaint()); | 1074 m_canvas->drawDRRect(outer, inner, immutableState()->fillPaint()); |
| 1072 } else { | 1075 } else { |
| 1073 SkPaint paint(immutableState()->fillPaint()); | 1076 PaintFlags paint(immutableState()->fillPaint()); |
| 1074 paint.setColor(color.rgb()); | 1077 paint.setColor(color.rgb()); |
| 1075 m_canvas->drawDRRect(outer, inner, paint); | 1078 m_canvas->drawDRRect(outer, inner, paint); |
| 1076 } | 1079 } |
| 1077 | 1080 |
| 1078 return; | 1081 return; |
| 1079 } | 1082 } |
| 1080 | 1083 |
| 1081 // We can draw this as a stroked rrect. | 1084 // We can draw this as a stroked rrect. |
| 1082 float strokeWidth = inner.rect().x() - outer.rect().x(); | 1085 float strokeWidth = inner.rect().x() - outer.rect().x(); |
| 1083 SkRRect strokeRRect = outer; | 1086 SkRRect strokeRRect = outer; |
| 1084 strokeRRect.inset(strokeWidth / 2, strokeWidth / 2); | 1087 strokeRRect.inset(strokeWidth / 2, strokeWidth / 2); |
| 1085 | 1088 |
| 1086 SkPaint strokePaint(immutableState()->fillPaint()); | 1089 PaintFlags strokePaint(immutableState()->fillPaint()); |
| 1087 strokePaint.setColor(color.rgb()); | 1090 strokePaint.setColor(color.rgb()); |
| 1088 strokePaint.setStyle(SkPaint::kStroke_Style); | 1091 strokePaint.setStyle(PaintFlags::kStroke_Style); |
| 1089 strokePaint.setStrokeWidth(strokeWidth); | 1092 strokePaint.setStrokeWidth(strokeWidth); |
| 1090 | 1093 |
| 1091 m_canvas->drawRRect(strokeRRect, strokePaint); | 1094 m_canvas->drawRRect(strokeRRect, strokePaint); |
| 1092 } | 1095 } |
| 1093 | 1096 |
| 1094 void GraphicsContext::fillEllipse(const FloatRect& ellipse) { | 1097 void GraphicsContext::fillEllipse(const FloatRect& ellipse) { |
| 1095 if (contextDisabled()) | 1098 if (contextDisabled()) |
| 1096 return; | 1099 return; |
| 1097 | 1100 |
| 1098 drawOval(ellipse, immutableState()->fillPaint()); | 1101 drawOval(ellipse, immutableState()->fillPaint()); |
| 1099 } | 1102 } |
| 1100 | 1103 |
| 1101 void GraphicsContext::strokePath(const Path& pathToStroke) { | 1104 void GraphicsContext::strokePath(const Path& pathToStroke) { |
| 1102 if (contextDisabled() || pathToStroke.isEmpty()) | 1105 if (contextDisabled() || pathToStroke.isEmpty()) |
| 1103 return; | 1106 return; |
| 1104 | 1107 |
| 1105 drawPath(pathToStroke.getSkPath(), immutableState()->strokePaint()); | 1108 drawPath(pathToStroke.getSkPath(), immutableState()->strokePaint()); |
| 1106 } | 1109 } |
| 1107 | 1110 |
| 1108 void GraphicsContext::strokeRect(const FloatRect& rect, float lineWidth) { | 1111 void GraphicsContext::strokeRect(const FloatRect& rect, float lineWidth) { |
| 1109 if (contextDisabled()) | 1112 if (contextDisabled()) |
| 1110 return; | 1113 return; |
| 1111 | 1114 |
| 1112 SkPaint paint(immutableState()->strokePaint()); | 1115 PaintFlags paint(immutableState()->strokePaint()); |
| 1113 paint.setStrokeWidth(WebCoreFloatToSkScalar(lineWidth)); | 1116 paint.setStrokeWidth(WebCoreFloatToSkScalar(lineWidth)); |
| 1114 // Reset the dash effect to account for the width | 1117 // Reset the dash effect to account for the width |
| 1115 immutableState()->getStrokeData().setupPaintDashPathEffect(&paint, 0); | 1118 immutableState()->getStrokeData().setupPaintDashPathEffect(&paint, 0); |
| 1116 // strokerect has special rules for CSS when the rect is degenerate: | 1119 // strokerect has special rules for CSS when the rect is degenerate: |
| 1117 // if width==0 && height==0, do nothing | 1120 // if width==0 && height==0, do nothing |
| 1118 // if width==0 || height==0, then just draw line for the other dimension | 1121 // if width==0 || height==0, then just draw line for the other dimension |
| 1119 SkRect r(rect); | 1122 SkRect r(rect); |
| 1120 bool validW = r.width() > 0; | 1123 bool validW = r.width() > 0; |
| 1121 bool validH = r.height() > 0; | 1124 bool validH = r.height() > 0; |
| 1122 if (validW && validH) { | 1125 if (validW && validH) { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1264 concat(affineTransformToSkMatrix(affine)); | 1267 concat(affineTransformToSkMatrix(affine)); |
| 1265 } | 1268 } |
| 1266 | 1269 |
| 1267 void GraphicsContext::fillRectWithRoundedHole( | 1270 void GraphicsContext::fillRectWithRoundedHole( |
| 1268 const FloatRect& rect, | 1271 const FloatRect& rect, |
| 1269 const FloatRoundedRect& roundedHoleRect, | 1272 const FloatRoundedRect& roundedHoleRect, |
| 1270 const Color& color) { | 1273 const Color& color) { |
| 1271 if (contextDisabled()) | 1274 if (contextDisabled()) |
| 1272 return; | 1275 return; |
| 1273 | 1276 |
| 1274 SkPaint paint(immutableState()->fillPaint()); | 1277 PaintFlags paint(immutableState()->fillPaint()); |
| 1275 paint.setColor(color.rgb()); | 1278 paint.setColor(color.rgb()); |
| 1276 m_canvas->drawDRRect(SkRRect::MakeRect(rect), roundedHoleRect, paint); | 1279 m_canvas->drawDRRect(SkRRect::MakeRect(rect), roundedHoleRect, paint); |
| 1277 } | 1280 } |
| 1278 | 1281 |
| 1279 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, | 1282 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, |
| 1280 FloatPoint& p2, | 1283 FloatPoint& p2, |
| 1281 float strokeWidth, | 1284 float strokeWidth, |
| 1282 StrokeStyle penStyle) { | 1285 StrokeStyle penStyle) { |
| 1283 // For odd widths, we add in 0.5 to the appropriate x/y so that the float | 1286 // For odd widths, we add in 0.5 to the appropriate x/y so that the float |
| 1284 // arithmetic works out. For example, with a border width of 3, WebKit will | 1287 // arithmetic works out. For example, with a border width of 3, WebKit will |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1414 static const SkPMColor colors[] = { | 1417 static const SkPMColor colors[] = { |
| 1415 SkPreMultiplyARGB(0x60, 0xFF, 0x00, 0x00), // More transparent red | 1418 SkPreMultiplyARGB(0x60, 0xFF, 0x00, 0x00), // More transparent red |
| 1416 SkPreMultiplyARGB(0x60, 0xC0, 0xC0, 0xC0) // More transparent gray | 1419 SkPreMultiplyARGB(0x60, 0xC0, 0xC0, 0xC0) // More transparent gray |
| 1417 }; | 1420 }; |
| 1418 | 1421 |
| 1419 return colors[index]; | 1422 return colors[index]; |
| 1420 } | 1423 } |
| 1421 #endif | 1424 #endif |
| 1422 | 1425 |
| 1423 } // namespace blink | 1426 } // namespace blink |
| OLD | NEW |