Index: third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp |
index b7f8fa6918fe10df157761bd6d1bfae7ec446c6d..b749e8828bf1bc5a3f052884f05c55c182a165cb 100644 |
--- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp |
@@ -34,14 +34,14 @@ |
#include "platform/graphics/ImageBuffer.h" |
#include "platform/graphics/Path.h" |
#include "platform/graphics/paint/PaintController.h" |
+#include "platform/graphics/paint/PaintRecord.h" |
+#include "platform/graphics/paint/PaintRecorder.h" |
#include "platform/instrumentation/tracing/TraceEvent.h" |
#include "platform/weborigin/KURL.h" |
#include "skia/ext/platform_canvas.h" |
#include "third_party/skia/include/core/SkAnnotation.h" |
#include "third_party/skia/include/core/SkColorFilter.h" |
#include "third_party/skia/include/core/SkData.h" |
-#include "third_party/skia/include/core/SkPicture.h" |
-#include "third_party/skia/include/core/SkPictureRecorder.h" |
#include "third_party/skia/include/core/SkRRect.h" |
#include "third_party/skia/include/core/SkRefCnt.h" |
#include "third_party/skia/include/effects/SkLumaColorFilter.h" |
@@ -81,8 +81,10 @@ GraphicsContext::GraphicsContext(PaintController& paintController, |
m_paintState = m_paintStateStack.back().get(); |
if (contextDisabled()) { |
- DEFINE_STATIC_LOCAL(SkCanvas*, nullCanvas, (SkMakeNullCanvas().release())); |
- m_canvas = nullCanvas; |
+ DEFINE_STATIC_LOCAL(SkCanvas*, nullSkCanvas, |
+ (SkMakeNullCanvas().release())); |
+ DEFINE_STATIC_LOCAL(PaintCanvasPassThrough, nullCanvas, (nullSkCanvas)); |
+ m_canvas = &nullCanvas; |
} |
} |
@@ -140,12 +142,11 @@ unsigned GraphicsContext::saveCount() const { |
} |
#endif |
-void GraphicsContext::saveLayer(const SkRect* bounds, const SkPaint* paint) { |
+void GraphicsContext::saveLayer(const SkRect* bounds, const PaintFlags* paint) { |
if (contextDisabled()) |
return; |
ASSERT(m_canvas); |
- |
m_canvas->saveLayer(bounds, paint); |
} |
@@ -233,7 +234,7 @@ void GraphicsContext::beginLayer(float opacity, |
if (contextDisabled()) |
return; |
- SkPaint layerPaint; |
+ PaintFlags layerPaint; |
layerPaint.setAlpha(static_cast<unsigned char>(opacity * 255)); |
layerPaint.setBlendMode(xfermode); |
layerPaint.setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter)); |
@@ -274,29 +275,30 @@ void GraphicsContext::beginRecording(const FloatRect& bounds) { |
namespace { |
-sk_sp<SkPicture> createEmptyPicture() { |
- SkPictureRecorder recorder; |
+sk_sp<PaintRecord> createEmptyPicture() { |
+ PaintRecorder recorder; |
recorder.beginRecording(SkRect::MakeEmpty(), nullptr); |
return recorder.finishRecordingAsPicture(); |
} |
} // anonymous namespace |
-sk_sp<SkPicture> GraphicsContext::endRecording() { |
+sk_sp<PaintRecord> GraphicsContext::endRecording() { |
if (contextDisabled()) { |
// Clients expect endRecording() to always return a non-null picture. |
// Cache an empty SKP to minimize overhead when disabled. |
- DEFINE_STATIC_LOCAL(sk_sp<SkPicture>, emptyPicture, (createEmptyPicture())); |
+ DEFINE_STATIC_LOCAL(sk_sp<PaintRecord>, emptyPicture, |
+ (createEmptyPicture())); |
return emptyPicture; |
} |
- sk_sp<SkPicture> picture = m_pictureRecorder.finishRecordingAsPicture(); |
+ sk_sp<PaintRecord> picture = m_pictureRecorder.finishRecordingAsPicture(); |
m_canvas = nullptr; |
ASSERT(picture); |
return picture; |
} |
-void GraphicsContext::drawPicture(const SkPicture* picture) { |
+void GraphicsContext::drawPicture(const PaintRecord* picture) { |
if (contextDisabled() || !picture || picture->cullRect().isEmpty()) |
return; |
@@ -304,7 +306,7 @@ void GraphicsContext::drawPicture(const SkPicture* picture) { |
m_canvas->drawPicture(picture); |
} |
-void GraphicsContext::compositePicture(sk_sp<SkPicture> picture, |
+void GraphicsContext::compositePicture(sk_sp<PaintRecord> picture, |
const FloatRect& dest, |
const FloatRect& src, |
SkBlendMode op) { |
@@ -312,7 +314,7 @@ void GraphicsContext::compositePicture(sk_sp<SkPicture> picture, |
return; |
ASSERT(m_canvas); |
- SkPaint picturePaint; |
+ PaintFlags picturePaint; |
picturePaint.setBlendMode(op); |
m_canvas->save(); |
SkRect sourceBounds = src; |
@@ -322,7 +324,7 @@ void GraphicsContext::compositePicture(sk_sp<SkPicture> picture, |
SkMatrix::kFill_ScaleToFit); |
m_canvas->concat(pictureTransform); |
picturePaint.setImageFilter(SkPictureImageFilter::MakeForLocalSpace( |
- std::move(picture), sourceBounds, |
+ ToSkPicture(picture), sourceBounds, |
static_cast<SkFilterQuality>(imageInterpolationQuality()))); |
m_canvas->saveLayer(&sourceBounds, &picturePaint); |
m_canvas->restore(); |
@@ -480,7 +482,7 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) { |
// probably worth the speed up of no square root, which also won't be exact. |
FloatSize disp = p2 - p1; |
int length = SkScalarRoundToInt(disp.width() + disp.height()); |
- SkPaint paint(immutableState()->strokePaint(length)); |
+ PaintFlags paint(immutableState()->strokePaint(length)); |
if (getStrokeStyle() == DottedStroke || getStrokeStyle() == DashedStroke) { |
// Do a rect fill of our endpoints. This ensures we always have the |
@@ -497,7 +499,7 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) { |
r1.offset(0, -width / 2); |
r2.offset(-width, -width / 2); |
} |
- SkPaint fillPaint; |
+ PaintFlags fillPaint; |
fillPaint.setColor(paint.getColor()); |
drawRect(r1, fillPaint); |
drawRect(r2, fillPaint); |
@@ -626,10 +628,10 @@ void GraphicsContext::drawLineForDocumentMarker(const FloatPoint& pt, |
SkMatrix localMatrix; |
localMatrix.setTranslate(originX, originY); |
- SkPaint paint; |
- paint.setShader(SkShader::MakeBitmapShader( |
+ PaintFlags paint; |
+ paint.setShader(WrapSkShader(SkShader::MakeBitmapShader( |
*misspellBitmap[index], SkShader::kRepeat_TileMode, |
- SkShader::kRepeat_TileMode, &localMatrix)); |
+ SkShader::kRepeat_TileMode, &localMatrix))); |
SkRect rect; |
rect.set(originX, originY, |
@@ -652,7 +654,7 @@ void GraphicsContext::drawLineForText(const FloatPoint& pt, float width) { |
if (width <= 0) |
return; |
- SkPaint paint; |
+ PaintFlags paint; |
switch (getStrokeStyle()) { |
case NoStroke: |
case SolidStroke: |
@@ -701,9 +703,9 @@ void GraphicsContext::drawRect(const IntRect& rect) { |
if (immutableState()->getStrokeData().style() != NoStroke && |
immutableState()->strokeColor().alpha()) { |
// Stroke a width: 1 inset border |
- SkPaint paint(immutableState()->fillPaint()); |
+ PaintFlags paint(immutableState()->fillPaint()); |
paint.setColor(strokeColor().rgb()); |
- paint.setStyle(SkPaint::kStroke_Style); |
+ paint.setStyle(PaintFlags::kStroke_Style); |
paint.setStrokeWidth(1); |
skRect.inset(0.5f, 0.5f); |
@@ -714,7 +716,7 @@ void GraphicsContext::drawRect(const IntRect& rect) { |
void GraphicsContext::drawText(const Font& font, |
const TextRunPaintInfo& runInfo, |
const FloatPoint& point, |
- const SkPaint& paint) { |
+ const PaintFlags& paint) { |
if (contextDisabled()) |
return; |
@@ -732,7 +734,7 @@ void GraphicsContext::drawTextPasses(const DrawTextFunc& drawText) { |
if ((modeFlags & TextModeStroke) && getStrokeStyle() != NoStroke && |
strokeThickness() > 0) { |
- SkPaint paintForStroking(immutableState()->strokePaint()); |
+ PaintFlags paintForStroking(immutableState()->strokePaint()); |
if (modeFlags & TextModeFill) { |
paintForStroking.setLooper( |
0); // shadow was already applied during fill pass |
@@ -747,7 +749,7 @@ void GraphicsContext::drawText(const Font& font, |
if (contextDisabled()) |
return; |
- drawTextPasses([&font, &runInfo, &point, this](const SkPaint& paint) { |
+ drawTextPasses([&font, &runInfo, &point, this](const PaintFlags& paint) { |
if (font.drawText(m_canvas, runInfo, point, m_deviceScaleFactor, paint)) |
m_paintController.setTextPainted(); |
}); |
@@ -760,7 +762,8 @@ void GraphicsContext::drawEmphasisMarks(const Font& font, |
if (contextDisabled()) |
return; |
- drawTextPasses([&font, &runInfo, &mark, &point, this](const SkPaint& paint) { |
+ drawTextPasses([&font, &runInfo, &mark, &point, |
+ this](const PaintFlags& paint) { |
font.drawEmphasisMarks(m_canvas, runInfo, mark, point, m_deviceScaleFactor, |
paint); |
}); |
@@ -775,7 +778,7 @@ void GraphicsContext::drawBidiText( |
return; |
drawTextPasses([&font, &runInfo, &point, customFontNotReadyAction, |
- this](const SkPaint& paint) { |
+ this](const PaintFlags& paint) { |
if (font.drawBidiText(m_canvas, runInfo, point, customFontNotReadyAction, |
m_deviceScaleFactor, paint)) |
m_paintController.setTextPainted(); |
@@ -806,7 +809,7 @@ void GraphicsContext::drawImage( |
const FloatRect src = srcPtr ? *srcPtr : image->rect(); |
- SkPaint imagePaint = immutableState()->fillPaint(); |
+ PaintFlags imagePaint = immutableState()->fillPaint(); |
imagePaint.setBlendMode(op); |
imagePaint.setColor(SK_ColorBLACK); |
imagePaint.setFilterQuality(computeFilterQuality(image, dest, src)); |
@@ -836,7 +839,7 @@ void GraphicsContext::drawImageRRect( |
if (dest.isEmpty() || visibleSrc.isEmpty()) |
return; |
- SkPaint imagePaint = immutableState()->fillPaint(); |
+ PaintFlags imagePaint = immutableState()->fillPaint(); |
imagePaint.setBlendMode(op); |
imagePaint.setColor(SK_ColorBLACK); |
imagePaint.setFilterQuality( |
@@ -856,7 +859,7 @@ void GraphicsContext::drawImageRRect( |
m_canvas->drawRRect(dest, imagePaint); |
} else { |
// Clip-based fallback. |
- SkAutoCanvasRestore autoRestore(m_canvas, true); |
+ PaintCanvasAutoRestore autoRestore(m_canvas, true); |
m_canvas->clipRRect(dest, imagePaint.isAntiAlias()); |
image->draw(m_canvas, imagePaint, dest.rect(), srcRect, respectOrientation, |
Image::ClampImageToSourceRect, m_colorBehavior); |
@@ -925,7 +928,7 @@ void GraphicsContext::drawTiledImage(Image* image, |
m_paintController.setImagePainted(); |
} |
-void GraphicsContext::drawOval(const SkRect& oval, const SkPaint& paint) { |
+void GraphicsContext::drawOval(const SkRect& oval, const PaintFlags& paint) { |
if (contextDisabled()) |
return; |
ASSERT(m_canvas); |
@@ -933,7 +936,7 @@ void GraphicsContext::drawOval(const SkRect& oval, const SkPaint& paint) { |
m_canvas->drawOval(oval, paint); |
} |
-void GraphicsContext::drawPath(const SkPath& path, const SkPaint& paint) { |
+void GraphicsContext::drawPath(const SkPath& path, const PaintFlags& paint) { |
if (contextDisabled()) |
return; |
ASSERT(m_canvas); |
@@ -941,7 +944,7 @@ void GraphicsContext::drawPath(const SkPath& path, const SkPaint& paint) { |
m_canvas->drawPath(path, paint); |
} |
-void GraphicsContext::drawRect(const SkRect& rect, const SkPaint& paint) { |
+void GraphicsContext::drawRect(const SkRect& rect, const PaintFlags& paint) { |
if (contextDisabled()) |
return; |
ASSERT(m_canvas); |
@@ -949,7 +952,7 @@ void GraphicsContext::drawRect(const SkRect& rect, const SkPaint& paint) { |
m_canvas->drawRect(rect, paint); |
} |
-void GraphicsContext::drawRRect(const SkRRect& rrect, const SkPaint& paint) { |
+void GraphicsContext::drawRRect(const SkRRect& rrect, const PaintFlags& paint) { |
if (contextDisabled()) |
return; |
ASSERT(m_canvas); |
@@ -977,7 +980,7 @@ void GraphicsContext::fillRect(const FloatRect& rect, |
if (contextDisabled()) |
return; |
- SkPaint paint = immutableState()->fillPaint(); |
+ PaintFlags paint = immutableState()->fillPaint(); |
paint.setColor(color.rgb()); |
paint.setBlendMode(xferMode); |
@@ -999,7 +1002,7 @@ void GraphicsContext::fillRoundedRect(const FloatRoundedRect& rrect, |
return; |
} |
- SkPaint paint = immutableState()->fillPaint(); |
+ PaintFlags paint = immutableState()->fillPaint(); |
paint.setColor(color.rgb()); |
drawRRect(rrect, paint); |
@@ -1070,7 +1073,7 @@ void GraphicsContext::fillDRRect(const FloatRoundedRect& outer, |
if (color == fillColor()) { |
m_canvas->drawDRRect(outer, inner, immutableState()->fillPaint()); |
} else { |
- SkPaint paint(immutableState()->fillPaint()); |
+ PaintFlags paint(immutableState()->fillPaint()); |
paint.setColor(color.rgb()); |
m_canvas->drawDRRect(outer, inner, paint); |
} |
@@ -1083,9 +1086,9 @@ void GraphicsContext::fillDRRect(const FloatRoundedRect& outer, |
SkRRect strokeRRect = outer; |
strokeRRect.inset(strokeWidth / 2, strokeWidth / 2); |
- SkPaint strokePaint(immutableState()->fillPaint()); |
+ PaintFlags strokePaint(immutableState()->fillPaint()); |
strokePaint.setColor(color.rgb()); |
- strokePaint.setStyle(SkPaint::kStroke_Style); |
+ strokePaint.setStyle(PaintFlags::kStroke_Style); |
strokePaint.setStrokeWidth(strokeWidth); |
m_canvas->drawRRect(strokeRRect, strokePaint); |
@@ -1109,7 +1112,7 @@ void GraphicsContext::strokeRect(const FloatRect& rect, float lineWidth) { |
if (contextDisabled()) |
return; |
- SkPaint paint(immutableState()->strokePaint()); |
+ PaintFlags paint(immutableState()->strokePaint()); |
paint.setStrokeWidth(WebCoreFloatToSkScalar(lineWidth)); |
// Reset the dash effect to account for the width |
immutableState()->getStrokeData().setupPaintDashPathEffect(&paint, 0); |
@@ -1271,7 +1274,7 @@ void GraphicsContext::fillRectWithRoundedHole( |
if (contextDisabled()) |
return; |
- SkPaint paint(immutableState()->fillPaint()); |
+ PaintFlags paint(immutableState()->fillPaint()); |
paint.setColor(color.rgb()); |
m_canvas->drawDRRect(SkRRect::MakeRect(rect), roundedHoleRect, paint); |
} |