1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "gfxSkipChars.h"
9 gfxSkipCharsIterator::SetOriginalOffset(int32_t aOffset
)
11 aOffset
+= mOriginalStringToSkipCharsOffset
;
12 NS_ASSERTION(uint32_t(aOffset
) <= mSkipChars
->mCharCount
,
15 mOriginalStringOffset
= aOffset
;
17 uint32_t rangeCount
= mSkipChars
->mRanges
.Length();
18 if (rangeCount
== 0) {
19 mSkippedStringOffset
= aOffset
;
23 // at start of string?
25 mSkippedStringOffset
= 0;
27 rangeCount
&& mSkipChars
->mRanges
[0].Start() == 0 ? 0 : -1;
31 // find the range that includes or precedes aOffset
32 uint32_t lo
= 0, hi
= rangeCount
;
33 const gfxSkipChars::SkippedRange
* ranges
= mSkipChars
->mRanges
.Elements();
35 uint32_t mid
= (lo
+ hi
) / 2;
36 if (uint32_t(aOffset
) < ranges
[mid
].Start()) {
43 if (lo
== rangeCount
) {
44 mCurrentRangeIndex
= rangeCount
- 1;
45 } else if (uint32_t(aOffset
) < ranges
[lo
].Start()) {
46 mCurrentRangeIndex
= lo
- 1;
47 if (mCurrentRangeIndex
== -1) {
48 mSkippedStringOffset
= aOffset
;
52 mCurrentRangeIndex
= lo
;
55 const gfxSkipChars::SkippedRange
& r
= ranges
[mCurrentRangeIndex
];
56 if (uint32_t(aOffset
) < r
.End()) {
57 mSkippedStringOffset
= r
.SkippedOffset();
61 mSkippedStringOffset
= aOffset
- r
.NextDelta();
65 gfxSkipCharsIterator::SetSkippedOffset(uint32_t aOffset
)
67 NS_ASSERTION((mSkipChars
->mRanges
.IsEmpty() &&
68 aOffset
<= mSkipChars
->mCharCount
) ||
69 (aOffset
<= mSkipChars
->LastRange().SkippedOffset() +
70 mSkipChars
->mCharCount
-
71 mSkipChars
->LastRange().End()),
72 "Invalid skipped offset");
73 mSkippedStringOffset
= aOffset
;
75 uint32_t rangeCount
= mSkipChars
->mRanges
.Length();
76 if (rangeCount
== 0) {
77 mOriginalStringOffset
= aOffset
;
81 uint32_t lo
= 0, hi
= rangeCount
;
82 const gfxSkipChars::SkippedRange
* ranges
= mSkipChars
->mRanges
.Elements();
84 uint32_t mid
= (lo
+ hi
) / 2;
85 if (aOffset
< ranges
[mid
].SkippedOffset()) {
92 if (lo
== rangeCount
) {
93 mCurrentRangeIndex
= rangeCount
- 1;
94 } else if (aOffset
< ranges
[lo
].SkippedOffset()) {
95 mCurrentRangeIndex
= lo
- 1;
96 if (mCurrentRangeIndex
== -1) {
97 mOriginalStringOffset
= aOffset
;
101 mCurrentRangeIndex
= lo
;
104 const gfxSkipChars::SkippedRange
& r
= ranges
[mCurrentRangeIndex
];
105 mOriginalStringOffset
= r
.End() + aOffset
- r
.SkippedOffset();
109 gfxSkipCharsIterator::IsOriginalCharSkipped(int32_t* aRunLength
) const
111 if (mCurrentRangeIndex
== -1) {
112 // we're before the first skipped range (if any)
114 uint32_t end
= mSkipChars
->mRanges
.IsEmpty() ?
115 mSkipChars
->mCharCount
: mSkipChars
->mRanges
[0].Start();
116 *aRunLength
= end
- mOriginalStringOffset
;
118 return mSkipChars
->mCharCount
== uint32_t(mOriginalStringOffset
);
121 const gfxSkipChars::SkippedRange
& range
=
122 mSkipChars
->mRanges
[mCurrentRangeIndex
];
124 if (uint32_t(mOriginalStringOffset
) < range
.End()) {
126 *aRunLength
= range
.End() - mOriginalStringOffset
;
133 uint32_t(mCurrentRangeIndex
) + 1 < mSkipChars
->mRanges
.Length() ?
134 mSkipChars
->mRanges
[mCurrentRangeIndex
+ 1].Start() :
135 mSkipChars
->mCharCount
;
136 *aRunLength
= end
- mOriginalStringOffset
;
139 return mSkipChars
->mCharCount
== uint32_t(mOriginalStringOffset
);