| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 
| 3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) | 3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) | 
| 4  *           (C) 2000 Dirk Mueller (mueller@kde.org) | 4  *           (C) 2000 Dirk Mueller (mueller@kde.org) | 
| 5  * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. | 5  * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. | 
| 6  * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. | 6  * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. | 
| 7  * | 7  * | 
| 8  * This library is free software; you can redistribute it and/or | 8  * This library is free software; you can redistribute it and/or | 
| 9  * modify it under the terms of the GNU Library General Public | 9  * modify it under the terms of the GNU Library General Public | 
| 10  * License as published by the Free Software Foundation; either | 10  * License as published by the Free Software Foundation; either | 
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 265 } | 265 } | 
| 266 | 266 | 
| 267 float Font::Width(const TextRun& run, | 267 float Font::Width(const TextRun& run, | 
| 268                   HashSet<const SimpleFontData*>* fallback_fonts, | 268                   HashSet<const SimpleFontData*>* fallback_fonts, | 
| 269                   FloatRect* glyph_bounds) const { | 269                   FloatRect* glyph_bounds) const { | 
| 270   FontCachePurgePreventer purge_preventer; | 270   FontCachePurgePreventer purge_preventer; | 
| 271   CachingWordShaper shaper(*this); | 271   CachingWordShaper shaper(*this); | 
| 272   return shaper.Width(run, fallback_fonts, glyph_bounds); | 272   return shaper.Width(run, fallback_fonts, glyph_bounds); | 
| 273 } | 273 } | 
| 274 | 274 | 
| 275 static int GetInterceptsFromBlobs( | 275 namespace {  // anonymous namespace | 
| 276     const ShapeResultBloberizer::BlobBuffer& blobs, | 276 | 
| 277     const SkPaint& paint, | 277 unsigned InterceptsFromBlobs(const ShapeResultBloberizer::BlobBuffer& blobs, | 
| 278     const std::tuple<float, float>& bounds, | 278                              const SkPaint& paint, | 
| 279     SkScalar* intercepts_buffer) { | 279                              const std::tuple<float, float>& bounds, | 
|  | 280                              SkScalar* intercepts_buffer) { | 
| 280   SkScalar bounds_array[2] = {std::get<0>(bounds), std::get<1>(bounds)}; | 281   SkScalar bounds_array[2] = {std::get<0>(bounds), std::get<1>(bounds)}; | 
| 281 | 282 | 
| 282   int num_intervals = 0; | 283   unsigned num_intervals = 0; | 
| 283   for (const auto& blob_info : blobs) { | 284   for (const auto& blob_info : blobs) { | 
| 284     DCHECK(blob_info.blob); | 285     DCHECK(blob_info.blob); | 
| 285 | 286 | 
| 286     // ShapeResultBloberizer splits for a new blob rotation, but does not split | 287     // ShapeResultBloberizer splits for a new blob rotation, but does not split | 
| 287     // for a change in font. A TextBlob can contain runs with differing fonts | 288     // for a change in font. A TextBlob can contain runs with differing fonts | 
| 288     // and the getTextBlobIntercepts method handles multiple fonts for us. For | 289     // and the getTextBlobIntercepts method handles multiple fonts for us. For | 
| 289     // upright in vertical blobs we currently have to bail, see crbug.com/655154 | 290     // upright in vertical blobs we currently have to bail, see crbug.com/655154 | 
| 290     if (blob_info.rotation == ShapeResultBloberizer::BlobRotation::kCCWRotation) | 291     if (blob_info.rotation == ShapeResultBloberizer::BlobRotation::kCCWRotation) | 
| 291       continue; | 292       continue; | 
| 292 | 293 | 
| 293     SkScalar* offset_intercepts_buffer = nullptr; | 294     SkScalar* offset_intercepts_buffer = nullptr; | 
| 294     if (intercepts_buffer) | 295     if (intercepts_buffer) | 
| 295       offset_intercepts_buffer = &intercepts_buffer[num_intervals]; | 296       offset_intercepts_buffer = &intercepts_buffer[num_intervals]; | 
| 296     num_intervals += paint.getTextBlobIntercepts( | 297     num_intervals += paint.getTextBlobIntercepts( | 
| 297         blob_info.blob.get(), bounds_array, offset_intercepts_buffer); | 298         blob_info.blob.get(), bounds_array, offset_intercepts_buffer); | 
| 298   } | 299   } | 
| 299   return num_intervals; | 300   return num_intervals; | 
| 300 } | 301 } | 
| 301 | 302 | 
|  | 303 void GetTextInterceptsInternal(const ShapeResultBloberizer::BlobBuffer& blobs, | 
|  | 304                                const PaintFlags& flags, | 
|  | 305                                const std::tuple<float, float>& bounds, | 
|  | 306                                Vector<Font::TextIntercept>& intercepts) { | 
|  | 307   // Get the number of intervals, without copying the actual values by | 
|  | 308   // specifying nullptr for the buffer, following the Skia allocation model for | 
|  | 309   // retrieving text intercepts. | 
|  | 310   SkPaint paint(ToSkPaint(flags)); | 
|  | 311   unsigned num_intervals = InterceptsFromBlobs(blobs, paint, bounds, nullptr); | 
|  | 312   if (!num_intervals) | 
|  | 313     return; | 
|  | 314   DCHECK_EQ(num_intervals % 2, 0u); | 
|  | 315   intercepts.resize(num_intervals / 2u); | 
|  | 316 | 
|  | 317   InterceptsFromBlobs(blobs, paint, bounds, | 
|  | 318                       reinterpret_cast<SkScalar*>(intercepts.data())); | 
|  | 319 } | 
|  | 320 | 
|  | 321 }  // anonymous namespace | 
|  | 322 | 
| 302 void Font::GetTextIntercepts(const TextRunPaintInfo& run_info, | 323 void Font::GetTextIntercepts(const TextRunPaintInfo& run_info, | 
| 303                              float device_scale_factor, | 324                              float device_scale_factor, | 
| 304                              const PaintFlags& flags, | 325                              const PaintFlags& flags, | 
| 305                              const std::tuple<float, float>& bounds, | 326                              const std::tuple<float, float>& bounds, | 
| 306                              Vector<TextIntercept>& intercepts) const { | 327                              Vector<TextIntercept>& intercepts) const { | 
| 307   if (ShouldSkipDrawing()) | 328   if (ShouldSkipDrawing()) | 
| 308     return; | 329     return; | 
| 309 | 330 | 
| 310   ShapeResultBloberizer bloberizer( | 331   ShapeResultBloberizer bloberizer( | 
| 311       *this, device_scale_factor, ShapeResultBloberizer::Type::kTextIntercepts); | 332       *this, device_scale_factor, ShapeResultBloberizer::Type::kTextIntercepts); | 
| 312 |  | 
| 313   CachingWordShaper word_shaper(*this); | 333   CachingWordShaper word_shaper(*this); | 
| 314   ShapeResultBuffer buffer; | 334   ShapeResultBuffer buffer; | 
| 315   word_shaper.FillResultBuffer(run_info, &buffer); | 335   word_shaper.FillResultBuffer(run_info, &buffer); | 
| 316   bloberizer.FillGlyphs(run_info, buffer); | 336   bloberizer.FillGlyphs(run_info, buffer); | 
| 317 | 337 | 
| 318   const auto& blobs = bloberizer.Blobs(); | 338   GetTextInterceptsInternal(bloberizer.Blobs(), flags, bounds, intercepts); | 
|  | 339 } | 
| 319 | 340 | 
| 320   // Get the number of intervals, without copying the actual values by | 341 void Font::GetTextIntercepts(const TextFragmentPaintInfo& text_info, | 
| 321   // specifying nullptr for the buffer, following the Skia allocation model for | 342                              float device_scale_factor, | 
| 322   // retrieving text intercepts. | 343                              const PaintFlags& flags, | 
| 323   SkPaint paint(ToSkPaint(flags)); | 344                              const std::tuple<float, float>& bounds, | 
| 324   int num_intervals = GetInterceptsFromBlobs(blobs, paint, bounds, nullptr); | 345                              Vector<TextIntercept>& intercepts) const { | 
| 325   if (!num_intervals) | 346   if (ShouldSkipDrawing()) | 
| 326     return; | 347     return; | 
| 327   DCHECK_EQ(num_intervals % 2, 0); |  | 
| 328   intercepts.resize(num_intervals / 2); |  | 
| 329 | 348 | 
| 330   GetInterceptsFromBlobs(blobs, paint, bounds, | 349   ShapeResultBloberizer bloberizer( | 
| 331                          reinterpret_cast<SkScalar*>(intercepts.data())); | 350       *this, device_scale_factor, ShapeResultBloberizer::Type::kTextIntercepts); | 
|  | 351   bloberizer.FillGlyphs(text_info.text, text_info.from, text_info.to, | 
|  | 352                         text_info.shape_result); | 
|  | 353 | 
|  | 354   GetTextInterceptsInternal(bloberizer.Blobs(), flags, bounds, intercepts); | 
| 332 } | 355 } | 
| 333 | 356 | 
| 334 static inline FloatRect PixelSnappedSelectionRect(FloatRect rect) { | 357 static inline FloatRect PixelSnappedSelectionRect(FloatRect rect) { | 
| 335   // Using roundf() rather than ceilf() for the right edge as a compromise to | 358   // Using roundf() rather than ceilf() for the right edge as a compromise to | 
| 336   // ensure correct caret positioning. | 359   // ensure correct caret positioning. | 
| 337   float rounded_x = roundf(rect.X()); | 360   float rounded_x = roundf(rect.X()); | 
| 338   return FloatRect(rounded_x, rect.Y(), roundf(rect.MaxX() - rounded_x), | 361   return FloatRect(rounded_x, rect.Y(), roundf(rect.MaxX() - rounded_x), | 
| 339                    rect.Height()); | 362                    rect.Height()); | 
| 340 } | 363 } | 
| 341 | 364 | 
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 466 | 489 | 
| 467 bool Font::LoadingCustomFonts() const { | 490 bool Font::LoadingCustomFonts() const { | 
| 468   return font_fallback_list_ && font_fallback_list_->LoadingCustomFonts(); | 491   return font_fallback_list_ && font_fallback_list_->LoadingCustomFonts(); | 
| 469 } | 492 } | 
| 470 | 493 | 
| 471 bool Font::IsFallbackValid() const { | 494 bool Font::IsFallbackValid() const { | 
| 472   return !font_fallback_list_ || font_fallback_list_->IsValid(); | 495   return !font_fallback_list_ || font_fallback_list_->IsValid(); | 
| 473 } | 496 } | 
| 474 | 497 | 
| 475 }  // namespace blink | 498 }  // namespace blink | 
| OLD | NEW | 
|---|