Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: third_party/WebKit/Source/platform/fonts/Font.cpp

Issue 2869433002: [LayoutNG] Add Font::GetTextIntercepts for LayoutNG (Closed)
Patch Set: Fix compiler warning Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/platform/fonts/Font.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/fonts/Font.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698