13d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien/*
23d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * Copyright (C) 2014 The Android Open Source Project
33d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien *
43d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * Licensed under the Apache License, Version 2.0 (the "License");
53d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * you may not use this file except in compliance with the License.
63d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * You may obtain a copy of the License at
73d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien *
83d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien *      http://www.apache.org/licenses/LICENSE-2.0
93d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien *
103d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * Unless required by applicable law or agreed to in writing, software
113d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * distributed under the License is distributed on an "AS IS" BASIS,
123d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * See the License for the specific language governing permissions and
143d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien * limitations under the License.
153d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien */
163d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien
173d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien#ifndef MINIKIN_GRAPHEME_BREAK_H
183d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien#define MINIKIN_GRAPHEME_BREAK_H
193d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien
203d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Leviennamespace android {
213d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien
223d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levienclass GraphemeBreak {
233d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levienpublic:
243d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    // These values must be kept in sync with CURSOR_AFTER etc in Paint.java
253d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    enum MoveOpt {
263d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien        AFTER = 0,
273d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien        AT_OR_AFTER = 1,
283d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien        BEFORE = 2,
293d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien        AT_OR_BEFORE = 3,
303d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien        AT = 4
313d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    };
323d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien
333d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    // Determine whether the given offset is a grapheme break.
343d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    // This implementation generally follows Unicode TR29 extended
353d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    // grapheme break, but with some tweaks to more closely match
363d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    // existing implementations.
373d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    static bool isGraphemeBreak(const uint16_t* buf, size_t start, size_t count, size_t offset);
383d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien
393d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    // Matches Android's Java API. Note, return (size_t)-1 for AT to
403d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    // signal non-break because unsigned return type.
413d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien    static size_t getTextRunCursor(const uint16_t* buf, size_t start, size_t count,
423d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien            size_t offset, MoveOpt opt);
433d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien};
443d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien
453d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien}  // namespace android
463d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien
473d28a3fcebfed4744d1ef0307a8bdc8fc01e364cRaph Levien#endif  // MINIKIN_GRAPHEME_BREAK_H