diff options
Diffstat (limited to 'WebCore/html/TimeRanges.cpp')
-rw-r--r-- | WebCore/html/TimeRanges.cpp | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/WebCore/html/TimeRanges.cpp b/WebCore/html/TimeRanges.cpp index ad81ac8..e5b070d 100644 --- a/WebCore/html/TimeRanges.cpp +++ b/WebCore/html/TimeRanges.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 Apple Inc. All rights reserved. + * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,6 +34,17 @@ TimeRanges::TimeRanges(float start, float end) add(start, end); } +PassRefPtr<TimeRanges> TimeRanges::copy() +{ + RefPtr<TimeRanges> newSession = TimeRanges::create(); + + unsigned size = m_ranges.size(); + for (unsigned i = 0; i < size; i++) + newSession->add(m_ranges[i].m_start, m_ranges[i].m_end); + + return newSession.release(); +} + float TimeRanges::start(unsigned index, ExceptionCode& ec) const { if (index >= length()) { @@ -53,9 +64,46 @@ float TimeRanges::end(unsigned index, ExceptionCode& ec) const } void TimeRanges::add(float start, float end) -{ - m_ranges.append(Range(start, end)); - // FIXME normalize +{ + ASSERT(start <= end); + unsigned int overlappingArcIndex; + Range addedRange(start, end); + + // For each present range check if we need to: + // - merge with the added range, in case we are overlapping or contiguous + // - Need to insert in place, we we are completely, not overlapping and not contiguous + // in between two ranges. + // + // TODO: Given that we assume that ranges are correctly ordered, this could be optimized. + + for (overlappingArcIndex = 0; overlappingArcIndex < m_ranges.size(); overlappingArcIndex++) { + if (addedRange.isOverlappingRange(m_ranges[overlappingArcIndex]) + || addedRange.isContiguousWithRange(m_ranges[overlappingArcIndex])) { + // We need to merge the addedRange and that range. + addedRange = addedRange.unionWithOverlappingOrContiguousRange(m_ranges[overlappingArcIndex]); + m_ranges.remove(overlappingArcIndex); + overlappingArcIndex--; + } else { + // Check the case for which there is no more to do + if (!overlappingArcIndex) { + if (addedRange.isBeforeRange(m_ranges[0])) { + // First index, and we are completely before that range (and not contiguous, nor overlapping). + // We just need to be inserted here. + break; + } + } else { + if (m_ranges[overlappingArcIndex - 1].isBeforeRange(addedRange) + && addedRange.isBeforeRange(m_ranges[overlappingArcIndex])) { + // We are exactly after the current previous range, and before the current range, while + // not overlapping with none of them. Insert here. + break; + } + } + } + } + + // Now that we are sure we don't overlap with any range, just add it. + m_ranges.insert(overlappingArcIndex, addedRange); } bool TimeRanges::contain(float time) const |