| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 Google Inc. All rights reserved. | 2 * Copyright (c) 2012 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. | 3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 ShapeResult::~ShapeResult() {} | 176 ShapeResult::~ShapeResult() {} |
| 177 | 177 |
| 178 size_t ShapeResult::ByteSize() const { | 178 size_t ShapeResult::ByteSize() const { |
| 179 size_t self_byte_size = sizeof(this); | 179 size_t self_byte_size = sizeof(this); |
| 180 for (unsigned i = 0; i < runs_.size(); ++i) { | 180 for (unsigned i = 0; i < runs_.size(); ++i) { |
| 181 self_byte_size += runs_[i]->ByteSize(); | 181 self_byte_size += runs_[i]->ByteSize(); |
| 182 } | 182 } |
| 183 return self_byte_size; | 183 return self_byte_size; |
| 184 } | 184 } |
| 185 | 185 |
| 186 unsigned ShapeResult::StartIndexForResult() const { |
| 187 return !Rtl() ? runs_.front()->start_index_ : runs_.back()->start_index_; |
| 188 } |
| 189 |
| 190 unsigned ShapeResult::EndIndexForResult() const { |
| 191 return StartIndexForResult() + NumCharacters(); |
| 192 } |
| 193 |
| 194 // If the position is outside of the result, returns the start or the end offset |
| 195 // depends on the position. |
| 186 unsigned ShapeResult::OffsetForPosition(float target_x, | 196 unsigned ShapeResult::OffsetForPosition(float target_x, |
| 187 bool include_partial_glyphs) const { | 197 bool include_partial_glyphs) const { |
| 188 unsigned characters_so_far = 0; | 198 unsigned characters_so_far = 0; |
| 189 float current_x = 0; | 199 float current_x = 0; |
| 190 | 200 |
| 191 if (Rtl()) { | 201 if (Rtl()) { |
| 202 if (target_x <= 0) |
| 203 return num_characters_; |
| 192 characters_so_far = num_characters_; | 204 characters_so_far = num_characters_; |
| 193 for (unsigned i = 0; i < runs_.size(); ++i) { | 205 for (unsigned i = 0; i < runs_.size(); ++i) { |
| 194 if (!runs_[i]) | 206 if (!runs_[i]) |
| 195 continue; | 207 continue; |
| 196 characters_so_far -= runs_[i]->num_characters_; | 208 characters_so_far -= runs_[i]->num_characters_; |
| 197 float next_x = current_x + runs_[i]->width_; | 209 float next_x = current_x + runs_[i]->width_; |
| 198 float offset_for_run = target_x - current_x; | 210 float offset_for_run = target_x - current_x; |
| 199 if (offset_for_run >= 0 && offset_for_run <= runs_[i]->width_) { | 211 if (offset_for_run >= 0 && offset_for_run <= runs_[i]->width_) { |
| 200 // The x value in question is within this script run. | 212 // The x value in question is within this script run. |
| 201 const unsigned index = runs_[i]->CharacterIndexForXPosition( | 213 const unsigned index = runs_[i]->CharacterIndexForXPosition( |
| 202 offset_for_run, include_partial_glyphs); | 214 offset_for_run, include_partial_glyphs); |
| 203 return characters_so_far + index; | 215 return characters_so_far + index; |
| 204 } | 216 } |
| 205 current_x = next_x; | 217 current_x = next_x; |
| 206 } | 218 } |
| 207 } else { | 219 } else { |
| 220 if (target_x <= 0) |
| 221 return 0; |
| 208 for (unsigned i = 0; i < runs_.size(); ++i) { | 222 for (unsigned i = 0; i < runs_.size(); ++i) { |
| 209 if (!runs_[i]) | 223 if (!runs_[i]) |
| 210 continue; | 224 continue; |
| 211 float next_x = current_x + runs_[i]->width_; | 225 float next_x = current_x + runs_[i]->width_; |
| 212 float offset_for_run = target_x - current_x; | 226 float offset_for_run = target_x - current_x; |
| 213 if (offset_for_run >= 0 && offset_for_run <= runs_[i]->width_) { | 227 if (offset_for_run >= 0 && offset_for_run <= runs_[i]->width_) { |
| 214 const unsigned index = runs_[i]->CharacterIndexForXPosition( | 228 const unsigned index = runs_[i]->CharacterIndexForXPosition( |
| 215 offset_for_run, include_partial_glyphs); | 229 offset_for_run, include_partial_glyphs); |
| 216 return characters_so_far + index; | 230 return characters_so_far + index; |
| 217 } | 231 } |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 result->width_ = run->width_; | 485 result->width_ = run->width_; |
| 472 result->num_glyphs_ = count; | 486 result->num_glyphs_ = count; |
| 473 DCHECK_EQ(result->num_glyphs_, count); // no overflow | 487 DCHECK_EQ(result->num_glyphs_, count); // no overflow |
| 474 result->has_vertical_offsets_ = | 488 result->has_vertical_offsets_ = |
| 475 font_data->PlatformData().IsVerticalAnyUpright(); | 489 font_data->PlatformData().IsVerticalAnyUpright(); |
| 476 result->runs_.push_back(std::move(run)); | 490 result->runs_.push_back(std::move(run)); |
| 477 return result.Release(); | 491 return result.Release(); |
| 478 } | 492 } |
| 479 | 493 |
| 480 } // namespace blink | 494 } // namespace blink |
| OLD | NEW |