summaryrefslogtreecommitdiffstats
path: root/WebCore/html/TimeRanges.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/html/TimeRanges.cpp')
-rw-r--r--WebCore/html/TimeRanges.cpp56
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