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