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

Side by Side Diff: Source/core/rendering/InlineIterator.h

Issue 46393003: BidiResolver should not append an isolated run if it is in a other line. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Proposed patch Created 7 years, 1 month 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All right r eserved. 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All right r eserved.
4 * Copyright (C) 2010 Google Inc. All rights reserved. 4 * Copyright (C) 2010 Google Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 return WTF::Unicode::OtherNeutral; 414 return WTF::Unicode::OtherNeutral;
415 } 415 }
416 416
417 template<> 417 template<>
418 inline void InlineBidiResolver::increment() 418 inline void InlineBidiResolver::increment()
419 { 419 {
420 m_current.increment(this, InlineIterator::FastIncrementInIsolatedRenderer); 420 m_current.increment(this, InlineIterator::FastIncrementInIsolatedRenderer);
421 } 421 }
422 422
423 template <> 423 template <>
424 inline bool InlineBidiResolver::isEndOfParagraph(const InlineIterator& end) 424 inline bool InlineBidiResolver::isEndOfLine(const InlineIterator& end)
425 { 425 {
426 bool inEndOfParagraph = m_current == end || m_current.atEnd() || (inIsolate( ) && m_current.m_obj == end.m_obj); 426 bool inEndOfParagraph = m_current == end || m_current.atEnd() || (inIsolate( ) && m_current.m_obj == end.m_obj);
leviw_travelin_and_unemployed 2013/10/30 17:44:37 This seems pretty weird. isEndOfLine returning "in
427 if (inIsolate() && inEndOfParagraph) { 427 if (inIsolate() && inEndOfParagraph) {
428 m_current.moveTo(m_current.m_obj, end.m_pos, m_current.m_nextBreakablePo sition); 428 m_current.moveTo(m_current.m_obj, end.m_pos, m_current.m_nextBreakablePo sition);
429 m_last = m_current; 429 m_last = m_current;
430 updateStatusLastFromCurrentDirection(WTF::Unicode::OtherNeutral); 430 updateStatusLastFromCurrentDirection(WTF::Unicode::OtherNeutral);
431 } 431 }
432 return inEndOfParagraph; 432 return inEndOfParagraph;
433 } 433 }
434 434
435 static inline bool isIsolatedInline(RenderObject* object) 435 static inline bool isIsolatedInline(RenderObject* object)
436 { 436 {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 template <> 582 template <>
583 inline void InlineBidiResolver::appendRun() 583 inline void InlineBidiResolver::appendRun()
584 { 584 {
585 if (!m_emptyRun && !m_eor.atEnd() && !m_reachedEndOfLine) { 585 if (!m_emptyRun && !m_eor.atEnd() && !m_reachedEndOfLine) {
586 // Keep track of when we enter/leave "unicode-bidi: isolate" inlines. 586 // Keep track of when we enter/leave "unicode-bidi: isolate" inlines.
587 // Initialize our state depending on if we're starting in the middle of such an inline. 587 // Initialize our state depending on if we're starting in the middle of such an inline.
588 // FIXME: Could this initialize from this->inIsolate() instead of walkin g up the render tree? 588 // FIXME: Could this initialize from this->inIsolate() instead of walkin g up the render tree?
589 IsolateTracker isolateTracker(numberOfIsolateAncestors(m_sor)); 589 IsolateTracker isolateTracker(numberOfIsolateAncestors(m_sor));
590 int start = m_sor.m_pos; 590 int start = m_sor.m_pos;
591 RenderObject* obj = m_sor.m_obj; 591 RenderObject* obj = m_sor.m_obj;
592 while (obj && obj != m_eor.m_obj && obj != endOfLine.m_obj) { 592 while (obj && obj != m_eor.m_obj && obj != m_runAtEndOfLine.m_obj) {
593 if (isolateTracker.inIsolate()) 593 if (isolateTracker.inIsolate())
594 isolateTracker.addFakeRunIfNecessary(obj, start, obj->length(), *this); 594 isolateTracker.addFakeRunIfNecessary(obj, start, obj->length(), *this);
595 else 595 else
596 RenderBlockFlow::appendRunsForObject(m_runs, start, obj->length( ), obj, *this); 596 RenderBlockFlow::appendRunsForObject(m_runs, start, obj->length( ), obj, *this);
597 // FIXME: start/obj should be an InlineIterator instead of two separ ate variables. 597 // FIXME: start/obj should be an InlineIterator instead of two separ ate variables.
598 start = 0; 598 start = 0;
599 obj = bidiNextSkippingEmptyInlines(m_sor.root(), obj, &isolateTracke r); 599 obj = bidiNextSkippingEmptyInlines(m_sor.root(), obj, &isolateTracke r);
600 } 600 }
601 if (obj) { 601 bool isEndOfLine = obj == m_endOfLine.m_obj && !m_endOfLine.m_pos;
602 if (obj && !isEndOfLine) {
602 unsigned pos = obj == m_eor.m_obj ? m_eor.m_pos : INT_MAX; 603 unsigned pos = obj == m_eor.m_obj ? m_eor.m_pos : INT_MAX;
603 if (obj == endOfLine.m_obj && endOfLine.m_pos <= pos) { 604 if (obj == m_runAtEndOfLine.m_obj && m_runAtEndOfLine.m_pos <= pos) {
604 m_reachedEndOfLine = true; 605 m_reachedEndOfLine = true;
605 pos = endOfLine.m_pos; 606 pos = m_runAtEndOfLine.m_pos;
606 } 607 }
607 // It's OK to add runs for zero-length RenderObjects, just don't mak e the run larger than it should be 608 // It's OK to add runs for zero-length RenderObjects, just don't mak e the run larger than it should be
608 int end = obj->length() ? pos + 1 : 0; 609 int end = obj->length() ? pos + 1 : 0;
609 if (isolateTracker.inIsolate()) 610 if (isolateTracker.inIsolate())
610 isolateTracker.addFakeRunIfNecessary(obj, start, end, *this); 611 isolateTracker.addFakeRunIfNecessary(obj, start, end, *this);
611 else 612 else
612 RenderBlockFlow::appendRunsForObject(m_runs, start, end, obj, *t his); 613 RenderBlockFlow::appendRunsForObject(m_runs, start, end, obj, *t his);
613 } 614 }
614 615
615 m_eor.increment(); 616 m_eor.increment();
616 m_sor = m_eor; 617 m_sor = m_eor;
617 } 618 }
618 619
619 m_direction = WTF::Unicode::OtherNeutral; 620 m_direction = WTF::Unicode::OtherNeutral;
620 m_status.eor = WTF::Unicode::OtherNeutral; 621 m_status.eor = WTF::Unicode::OtherNeutral;
621 } 622 }
622 623
623 } 624 }
624 625
625 #endif // InlineIterator_h 626 #endif // InlineIterator_h
OLDNEW
« no previous file with comments | « no previous file | Source/core/rendering/RenderBlockLineLayout.cpp » ('j') | Source/platform/text/BidiResolver.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698