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

Side by Side Diff: third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.cpp

Issue 1530853002: Split up text painting code into separate functions to setup paint and then paint text. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: If we can't setup paint don't paint text with default paint Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/paint/SVGInlineTextBoxPainter.h" 6 #include "core/paint/SVGInlineTextBoxPainter.h"
7 7
8 #include "core/editing/Editor.h" 8 #include "core/editing/Editor.h"
9 #include "core/editing/markers/DocumentMarkerController.h" 9 #include "core/editing/markers/DocumentMarkerController.h"
10 #include "core/editing/markers/RenderedDocumentMarker.h" 10 #include "core/editing/markers/RenderedDocumentMarker.h"
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 } 289 }
290 break; 290 break;
291 case PT_MARKERS: 291 case PT_MARKERS:
292 break; 292 break;
293 default: 293 default:
294 ASSERT_NOT_REACHED(); 294 ASSERT_NOT_REACHED();
295 } 295 }
296 } 296 }
297 } 297 }
298 298
299 void SVGInlineTextBoxPainter::paintTextWithShadows(const PaintInfo& paintInfo, c onst ComputedStyle& style, 299 bool SVGInlineTextBoxPainter::setupTextPaint(const PaintInfo& paintInfo, const C omputedStyle& style,
300 TextRun& textRun, const SVGTextFragment& fragment, int startPosition, int en dPosition, 300 TextRun& textRun, const SVGTextFragment& fragment, LayoutSVGResourceMode res ourceMode, SkPaint& paint)
fs 2015/12/16 13:21:41 This doesn't really use textRun and fragment, so t
ramya.v 2015/12/17 04:25:46 Done.
301 LayoutSVGResourceMode resourceMode)
302 { 301 {
303 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); 302 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem()));
304 303
305 float scalingFactor = textLayoutObject.scalingFactor(); 304 float scalingFactor = textLayoutObject.scalingFactor();
306 ASSERT(scalingFactor); 305 ASSERT(scalingFactor);
307 306
308 const Font& scaledFont = textLayoutObject.scaledFont();
309 const ShadowList* shadowList = style.textShadow(); 307 const ShadowList* shadowList = style.textShadow();
310 GraphicsContext& context = paintInfo.context;
311 308
312 // Text shadows are disabled when printing. http://crbug.com/258321 309 // Text shadows are disabled when printing. http://crbug.com/258321
313 bool hasShadow = shadowList && !paintInfo.isPrinting(); 310 bool hasShadow = shadowList && !paintInfo.isPrinting();
314 311
315 FloatPoint textOrigin(fragment.x, fragment.y);
316 FloatSize textSize(fragment.width, fragment.height);
317 AffineTransform paintServerTransform; 312 AffineTransform paintServerTransform;
318 const AffineTransform* additionalPaintServerTransform = 0; 313 const AffineTransform* additionalPaintServerTransform = 0;
319 314
320 GraphicsContextStateSaver stateSaver(context, false);
321 if (scalingFactor != 1) { 315 if (scalingFactor != 1) {
322 textOrigin.scale(scalingFactor, scalingFactor);
323 textSize.scale(scalingFactor);
324 stateSaver.save();
325 context.scale(1 / scalingFactor, 1 / scalingFactor);
326 // Adjust the paint-server coordinate space. 316 // Adjust the paint-server coordinate space.
327 paintServerTransform.scale(scalingFactor); 317 paintServerTransform.scale(scalingFactor);
328 additionalPaintServerTransform = &paintServerTransform; 318 additionalPaintServerTransform = &paintServerTransform;
329 } 319 }
330 320
331 SkPaint paint;
332 if (!SVGPaintContext::paintForLayoutObject(paintInfo, style, *LineLayoutPain tShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem()), resource Mode, paint, additionalPaintServerTransform)) 321 if (!SVGPaintContext::paintForLayoutObject(paintInfo, style, *LineLayoutPain tShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem()), resource Mode, paint, additionalPaintServerTransform))
333 return; 322 return false;
334 paint.setAntiAlias(true); 323 paint.setAntiAlias(true);
335 324
336 if (hasShadow) { 325 if (hasShadow) {
337 OwnPtr<DrawLooperBuilder> drawLooperBuilder = shadowList->createDrawLoop er(DrawLooperBuilder::ShadowRespectsAlpha, style.visitedDependentColor(CSSProper tyColor)); 326 OwnPtr<DrawLooperBuilder> drawLooperBuilder = shadowList->createDrawLoop er(DrawLooperBuilder::ShadowRespectsAlpha, style.visitedDependentColor(CSSProper tyColor));
338 RefPtr<SkDrawLooper> drawLooper = drawLooperBuilder->detachDrawLooper(); 327 RefPtr<SkDrawLooper> drawLooper = drawLooperBuilder->detachDrawLooper();
339 paint.setLooper(drawLooper.get()); 328 paint.setLooper(drawLooper.get());
340 } 329 }
341 330
342 if (resourceMode == ApplyToStrokeMode) { 331 if (resourceMode == ApplyToStrokeMode) {
343 StrokeData strokeData; 332 StrokeData strokeData;
344 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, style, *LineL ayoutPaintShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem())) ; 333 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, style, *LineL ayoutPaintShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem())) ;
345 if (style.svgStyle().vectorEffect() != VE_NON_SCALING_STROKE) 334 if (style.svgStyle().vectorEffect() != VE_NON_SCALING_STROKE)
346 strokeData.setThickness(strokeData.thickness() * scalingFactor); 335 strokeData.setThickness(strokeData.thickness() * scalingFactor);
347 strokeData.setupPaint(&paint); 336 strokeData.setupPaint(&paint);
348 } 337 }
338 return true;
339 }
340
341 void SVGInlineTextBoxPainter::paintText(const PaintInfo& paintInfo, TextRun& tex tRun, const SVGTextFragment& fragment, int startPosition, int endPosition, SkPai nt& paint)
fs 2015/12/16 13:21:41 const SkPaint& ?
ramya.v 2015/12/17 04:25:45 Done.
342 {
343 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem()));
344 const Font& scaledFont = textLayoutObject.scaledFont();
345
346 float scalingFactor = textLayoutObject.scalingFactor();
347 ASSERT(scalingFactor);
348
349 FloatPoint textOrigin(fragment.x, fragment.y);
350 FloatSize textSize(fragment.width, fragment.height);
351
352 GraphicsContext& context = paintInfo.context;
353 GraphicsContextStateSaver stateSaver(context, false);
354 if (scalingFactor != 1) {
355 textOrigin.scale(scalingFactor, scalingFactor);
356 textSize.scale(scalingFactor);
357 stateSaver.save();
358 context.scale(1 / scalingFactor, 1 / scalingFactor);
359 }
349 360
350 TextRunPaintInfo textRunPaintInfo(textRun); 361 TextRunPaintInfo textRunPaintInfo(textRun);
351 textRunPaintInfo.from = startPosition; 362 textRunPaintInfo.from = startPosition;
352 textRunPaintInfo.to = endPosition; 363 textRunPaintInfo.to = endPosition;
353 364
354 float baseline = scaledFont.fontMetrics().floatAscent(); 365 float baseline = scaledFont.fontMetrics().floatAscent();
355 textRunPaintInfo.bounds = FloatRect(textOrigin.x(), textOrigin.y() - baselin e, 366 textRunPaintInfo.bounds = FloatRect(textOrigin.x(), textOrigin.y() - baselin e,
356 textSize.width(), textSize.height()); 367 textSize.width(), textSize.height());
357 368
358 context.drawText(scaledFont, textRunPaintInfo, textOrigin, paint); 369 context.drawText(scaledFont, textRunPaintInfo, textOrigin, paint);
359 } 370 }
360 371
361 void SVGInlineTextBoxPainter::paintText(const PaintInfo& paintInfo, const Comput edStyle& style, 372 void SVGInlineTextBoxPainter::paintText(const PaintInfo& paintInfo, const Comput edStyle& style,
362 const ComputedStyle& selectionStyle, const SVGTextFragment& fragment, 373 const ComputedStyle& selectionStyle, const SVGTextFragment& fragment,
363 LayoutSVGResourceMode resourceMode, bool shouldPaintSelection) 374 LayoutSVGResourceMode resourceMode, bool shouldPaintSelection)
364 { 375 {
365 int startPosition = 0; 376 int startPosition = 0;
366 int endPosition = 0; 377 int endPosition = 0;
367 if (shouldPaintSelection) { 378 if (shouldPaintSelection) {
368 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition); 379 m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition);
369 shouldPaintSelection = m_svgInlineTextBox.mapStartEndPositionsIntoFragme ntCoordinates(fragment, startPosition, endPosition); 380 shouldPaintSelection = m_svgInlineTextBox.mapStartEndPositionsIntoFragme ntCoordinates(fragment, startPosition, endPosition);
370 } 381 }
371 382
372 // Fast path if there is no selection, just draw the whole chunk part using the regular style 383 // Fast path if there is no selection, just draw the whole chunk part using the regular style
373 TextRun textRun = m_svgInlineTextBox.constructTextRun(style, fragment); 384 TextRun textRun = m_svgInlineTextBox.constructTextRun(style, fragment);
374 if (!shouldPaintSelection || startPosition >= endPosition) { 385 if (!shouldPaintSelection || startPosition >= endPosition) {
375 paintTextWithShadows(paintInfo, style, textRun, fragment, 0, fragment.le ngth, resourceMode); 386 SkPaint paint;
387 if (setupTextPaint(paintInfo, style, textRun, fragment, resourceMode, pa int))
388 paintText(paintInfo, textRun, fragment, 0, fragment.length, paint);
376 return; 389 return;
377 } 390 }
378 391
379 // Eventually draw text using regular style until the start position of the selection 392 // Eventually draw text using regular style until the start position of the selection
380 bool paintSelectedTextOnly = paintInfo.phase == PaintPhaseSelection; 393 bool paintSelectedTextOnly = paintInfo.phase == PaintPhaseSelection;
381 if (startPosition > 0 && !paintSelectedTextOnly) 394 if (startPosition > 0 && !paintSelectedTextOnly) {
382 paintTextWithShadows(paintInfo, style, textRun, fragment, 0, startPositi on, resourceMode); 395 SkPaint paint;
396 if (setupTextPaint(paintInfo, style, textRun, fragment, resourceMode, pa int))
397 paintText(paintInfo, textRun, fragment, 0, startPosition, paint);
398 }
383 399
384 // Draw text using selection style from the start to the end position of the selection 400 // Draw text using selection style from the start to the end position of the selection
385 if (style != selectionStyle) { 401 if (style != selectionStyle) {
386 StyleDifference diff; 402 StyleDifference diff;
387 diff.setNeedsPaintInvalidationObject(); 403 diff.setNeedsPaintInvalidationObject();
388 SVGResourcesCache::clientStyleChanged(LineLayoutPaintShim::layoutObjectF rom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, selectionStyle); 404 SVGResourcesCache::clientStyleChanged(LineLayoutPaintShim::layoutObjectF rom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, selectionStyle);
389 } 405 }
390 406
391 paintTextWithShadows(paintInfo, selectionStyle, textRun, fragment, startPosi tion, endPosition, resourceMode); 407 SkPaint paint;
408 if (setupTextPaint(paintInfo, selectionStyle, textRun, fragment, resourceMod e, paint))
409 paintText(paintInfo, textRun, fragment, startPosition, endPosition, pain t);
392 410
393 if (style != selectionStyle) { 411 if (style != selectionStyle) {
394 StyleDifference diff; 412 StyleDifference diff;
395 diff.setNeedsPaintInvalidationObject(); 413 diff.setNeedsPaintInvalidationObject();
396 SVGResourcesCache::clientStyleChanged(LineLayoutPaintShim::layoutObjectF rom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, style); 414 SVGResourcesCache::clientStyleChanged(LineLayoutPaintShim::layoutObjectF rom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, style);
397 } 415 }
398 416
399 // Eventually draw text using regular style from the end position of the sel ection to the end of the current chunk part 417 // Eventually draw text using regular style from the end position of the sel ection to the end of the current chunk part
400 if (endPosition < static_cast<int>(fragment.length) && !paintSelectedTextOnl y) 418 if (endPosition < static_cast<int>(fragment.length) && !paintSelectedTextOnl y) {
401 paintTextWithShadows(paintInfo, style, textRun, fragment, endPosition, f ragment.length, resourceMode); 419 SkPaint paint;
420 if (setupTextPaint(paintInfo, style, textRun, fragment, resourceMode, pa int))
421 paintText(paintInfo, textRun, fragment, endPosition, fragment.length , paint);
422 }
402 } 423 }
403 424
404 void SVGInlineTextBoxPainter::paintTextMatchMarker(GraphicsContext& context, con st LayoutPoint&, DocumentMarker* marker, const ComputedStyle& style, const Font& font) 425 void SVGInlineTextBoxPainter::paintTextMatchMarker(GraphicsContext& context, con st LayoutPoint&, DocumentMarker* marker, const ComputedStyle& style, const Font& font)
405 { 426 {
406 // SVG is only interested in the TextMatch markers. 427 // SVG is only interested in the TextMatch markers.
407 if (marker->type() != DocumentMarker::TextMatch) 428 if (marker->type() != DocumentMarker::TextMatch)
408 return; 429 return;
409 430
410 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); 431 LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutPai ntShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem()));
411 432
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 if (!fragmentTransform.isIdentity()) 465 if (!fragmentTransform.isIdentity())
445 context.concatCTM(fragmentTransform); 466 context.concatCTM(fragmentTransform);
446 context.setFillColor(color); 467 context.setFillColor(color);
447 context.fillRect(fragmentRect, color); 468 context.fillRect(fragmentRect, color);
448 } 469 }
449 } 470 }
450 } 471 }
451 } 472 }
452 473
453 } // namespace blink 474 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698