blob: 83420c17ddd20eb72f81c379961032b1a68264e2 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/fonts/symbols_iterator.h"
#include "third_party/blink/renderer/platform/fonts/utf16_ragel_iterator.h"
#include <unicode/uchar.h>
#include <unicode/uniset.h>
#include <memory>
namespace blink {
namespace {
using emoji_text_iter_t = UTF16RagelIterator;
// Scanner gode generated by Ragel and imported from third_party.
#include "third_party/emoji-segmenter/src/emoji_presentation_scanner.c"
} // namespace
SymbolsIterator::SymbolsIterator(const UChar* buffer, unsigned buffer_size)
: cursor_(0), next_token_end_(0), next_token_emoji_(false) {
if (buffer_size) {
buffer_iterator_ = UTF16RagelIterator(buffer, buffer_size, cursor_);
next_token_end_ = cursor_ + (scan_emoji_presentation(buffer_iterator_,
buffer_iterator_.end(),
&next_token_emoji_) -
buffer_iterator_);
}
}
bool SymbolsIterator::Consume(unsigned* symbols_limit,
FontFallbackPriority* font_fallback_priority) {
if (cursor_ >= buffer_iterator_.end().Cursor())
return false;
bool current_token_emoji = false;
do {
cursor_ = next_token_end_;
current_token_emoji = next_token_emoji_;
if (cursor_ >= buffer_iterator_.end().Cursor())
break;
buffer_iterator_.SetCursor(cursor_);
next_token_end_ = cursor_ + (scan_emoji_presentation(buffer_iterator_,
buffer_iterator_.end(),
&next_token_emoji_) -
buffer_iterator_);
} while (current_token_emoji == next_token_emoji_);
*font_fallback_priority = current_token_emoji
? FontFallbackPriority::kEmojiEmoji
: FontFallbackPriority::kText;
*symbols_limit = cursor_;
return true;
}
} // namespace blink