1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/thebes/gfxSkipChars.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,140 @@ 1.4 +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- 1.5 + * This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "gfxSkipChars.h" 1.10 + 1.11 +void 1.12 +gfxSkipCharsIterator::SetOriginalOffset(int32_t aOffset) 1.13 +{ 1.14 + aOffset += mOriginalStringToSkipCharsOffset; 1.15 + NS_ASSERTION(uint32_t(aOffset) <= mSkipChars->mCharCount, 1.16 + "Invalid offset"); 1.17 + 1.18 + mOriginalStringOffset = aOffset; 1.19 + 1.20 + uint32_t rangeCount = mSkipChars->mRanges.Length(); 1.21 + if (rangeCount == 0) { 1.22 + mSkippedStringOffset = aOffset; 1.23 + return; 1.24 + } 1.25 + 1.26 + // at start of string? 1.27 + if (aOffset == 0) { 1.28 + mSkippedStringOffset = 0; 1.29 + mCurrentRangeIndex = 1.30 + rangeCount && mSkipChars->mRanges[0].Start() == 0 ? 0 : -1; 1.31 + return; 1.32 + } 1.33 + 1.34 + // find the range that includes or precedes aOffset 1.35 + uint32_t lo = 0, hi = rangeCount; 1.36 + const gfxSkipChars::SkippedRange* ranges = mSkipChars->mRanges.Elements(); 1.37 + while (lo < hi) { 1.38 + uint32_t mid = (lo + hi) / 2; 1.39 + if (uint32_t(aOffset) < ranges[mid].Start()) { 1.40 + hi = mid; 1.41 + } else { 1.42 + lo = mid + 1; 1.43 + } 1.44 + } 1.45 + 1.46 + if (lo == rangeCount) { 1.47 + mCurrentRangeIndex = rangeCount - 1; 1.48 + } else if (uint32_t(aOffset) < ranges[lo].Start()) { 1.49 + mCurrentRangeIndex = lo - 1; 1.50 + if (mCurrentRangeIndex == -1) { 1.51 + mSkippedStringOffset = aOffset; 1.52 + return; 1.53 + } 1.54 + } else { 1.55 + mCurrentRangeIndex = lo; 1.56 + } 1.57 + 1.58 + const gfxSkipChars::SkippedRange& r = ranges[mCurrentRangeIndex]; 1.59 + if (uint32_t(aOffset) < r.End()) { 1.60 + mSkippedStringOffset = r.SkippedOffset(); 1.61 + return; 1.62 + } 1.63 + 1.64 + mSkippedStringOffset = aOffset - r.NextDelta(); 1.65 +} 1.66 + 1.67 +void 1.68 +gfxSkipCharsIterator::SetSkippedOffset(uint32_t aOffset) 1.69 +{ 1.70 + NS_ASSERTION((mSkipChars->mRanges.IsEmpty() && 1.71 + aOffset <= mSkipChars->mCharCount) || 1.72 + (aOffset <= mSkipChars->LastRange().SkippedOffset() + 1.73 + mSkipChars->mCharCount - 1.74 + mSkipChars->LastRange().End()), 1.75 + "Invalid skipped offset"); 1.76 + mSkippedStringOffset = aOffset; 1.77 + 1.78 + uint32_t rangeCount = mSkipChars->mRanges.Length(); 1.79 + if (rangeCount == 0) { 1.80 + mOriginalStringOffset = aOffset; 1.81 + return; 1.82 + } 1.83 + 1.84 + uint32_t lo = 0, hi = rangeCount; 1.85 + const gfxSkipChars::SkippedRange* ranges = mSkipChars->mRanges.Elements(); 1.86 + while (lo < hi) { 1.87 + uint32_t mid = (lo + hi) / 2; 1.88 + if (aOffset < ranges[mid].SkippedOffset()) { 1.89 + hi = mid; 1.90 + } else { 1.91 + lo = mid + 1; 1.92 + } 1.93 + } 1.94 + 1.95 + if (lo == rangeCount) { 1.96 + mCurrentRangeIndex = rangeCount - 1; 1.97 + } else if (aOffset < ranges[lo].SkippedOffset()) { 1.98 + mCurrentRangeIndex = lo - 1; 1.99 + if (mCurrentRangeIndex == -1) { 1.100 + mOriginalStringOffset = aOffset; 1.101 + return; 1.102 + } 1.103 + } else { 1.104 + mCurrentRangeIndex = lo; 1.105 + } 1.106 + 1.107 + const gfxSkipChars::SkippedRange& r = ranges[mCurrentRangeIndex]; 1.108 + mOriginalStringOffset = r.End() + aOffset - r.SkippedOffset(); 1.109 +} 1.110 + 1.111 +bool 1.112 +gfxSkipCharsIterator::IsOriginalCharSkipped(int32_t* aRunLength) const 1.113 +{ 1.114 + if (mCurrentRangeIndex == -1) { 1.115 + // we're before the first skipped range (if any) 1.116 + if (aRunLength) { 1.117 + uint32_t end = mSkipChars->mRanges.IsEmpty() ? 1.118 + mSkipChars->mCharCount : mSkipChars->mRanges[0].Start(); 1.119 + *aRunLength = end - mOriginalStringOffset; 1.120 + } 1.121 + return mSkipChars->mCharCount == uint32_t(mOriginalStringOffset); 1.122 + } 1.123 + 1.124 + const gfxSkipChars::SkippedRange& range = 1.125 + mSkipChars->mRanges[mCurrentRangeIndex]; 1.126 + 1.127 + if (uint32_t(mOriginalStringOffset) < range.End()) { 1.128 + if (aRunLength) { 1.129 + *aRunLength = range.End() - mOriginalStringOffset; 1.130 + } 1.131 + return true; 1.132 + } 1.133 + 1.134 + if (aRunLength) { 1.135 + uint32_t end = 1.136 + uint32_t(mCurrentRangeIndex) + 1 < mSkipChars->mRanges.Length() ? 1.137 + mSkipChars->mRanges[mCurrentRangeIndex + 1].Start() : 1.138 + mSkipChars->mCharCount; 1.139 + *aRunLength = end - mOriginalStringOffset; 1.140 + } 1.141 + 1.142 + return mSkipChars->mCharCount == uint32_t(mOriginalStringOffset); 1.143 +}