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 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 STACK_ALLOCATED() | 250 STACK_ALLOCATED() |
251 public: | 251 public: |
252 GlyphBufferBloberizer(const GlyphBuffer& buffer, | 252 GlyphBufferBloberizer(const GlyphBuffer& buffer, |
253 const Font* font, | 253 const Font* font, |
254 float deviceScaleFactor) | 254 float deviceScaleFactor) |
255 : m_buffer(buffer), | 255 : m_buffer(buffer), |
256 m_font(font), | 256 m_font(font), |
257 m_deviceScaleFactor(deviceScaleFactor), | 257 m_deviceScaleFactor(deviceScaleFactor), |
258 m_hasVerticalOffsets(buffer.hasVerticalOffsets()), | 258 m_hasVerticalOffsets(buffer.hasVerticalOffsets()), |
259 m_index(0), | 259 m_index(0), |
| 260 m_endIndex(m_buffer.size()), |
260 m_blobCount(0), | 261 m_blobCount(0), |
261 m_rotation(buffer.isEmpty() ? NoRotation : computeBlobRotation( | 262 m_rotation(buffer.isEmpty() ? NoRotation : computeBlobRotation( |
262 buffer.fontDataAt(0))) {} | 263 buffer.fontDataAt(0))) { |
| 264 if (m_buffer.hasSkipInkExceptions()) { |
| 265 while (m_endIndex > 0 && m_buffer.isSkipInkException(m_endIndex - 1)) |
| 266 m_endIndex--; |
| 267 } |
| 268 } |
263 | 269 |
264 bool done() const { return m_index >= m_buffer.size(); } | 270 bool done() const { return m_index >= m_endIndex; } |
265 unsigned blobCount() const { return m_blobCount; } | 271 unsigned blobCount() const { return m_blobCount; } |
266 | 272 |
267 std::pair<sk_sp<SkTextBlob>, BlobRotation> next() { | 273 std::pair<sk_sp<SkTextBlob>, BlobRotation> next() { |
268 ASSERT(!done()); | 274 ASSERT(!done()); |
269 const BlobRotation currentRotation = m_rotation; | 275 const BlobRotation currentRotation = m_rotation; |
270 | 276 |
271 while (m_index < m_buffer.size()) { | 277 while (m_index < m_endIndex) { |
| 278 if (m_buffer.hasSkipInkExceptions()) { |
| 279 while (m_index < m_endIndex && m_buffer.isSkipInkException(m_index)) |
| 280 m_index++; |
| 281 } |
| 282 |
272 const SimpleFontData* fontData = m_buffer.fontDataAt(m_index); | 283 const SimpleFontData* fontData = m_buffer.fontDataAt(m_index); |
273 ASSERT(fontData); | 284 ASSERT(fontData); |
274 | 285 |
275 const BlobRotation newRotation = computeBlobRotation(fontData); | 286 const BlobRotation newRotation = computeBlobRotation(fontData); |
276 if (newRotation != m_rotation) { | 287 if (newRotation != m_rotation) { |
277 // We're switching to an orientation which requires a different rotation | 288 // We're switching to an orientation which requires a different rotation |
278 // => emit the pending blob (and start a new one with the new | 289 // => emit the pending blob (and start a new one with the new |
279 // rotation). | 290 // rotation). |
280 m_rotation = newRotation; | 291 m_rotation = newRotation; |
281 break; | 292 break; |
282 } | 293 } |
283 | 294 |
284 const unsigned start = m_index++; | 295 const unsigned start = m_index++; |
285 while (m_index < m_buffer.size() && | 296 while (m_index < m_endIndex && m_buffer.fontDataAt(m_index) == fontData && |
286 m_buffer.fontDataAt(m_index) == fontData) | 297 !m_buffer.isSkipInkException(m_index)) |
287 m_index++; | 298 m_index++; |
288 | 299 |
289 appendRun(start, m_index - start, fontData); | 300 appendRun(start, m_index - start, fontData); |
290 } | 301 } |
291 | 302 |
292 m_blobCount++; | 303 m_blobCount++; |
293 return std::make_pair(m_builder.make(), currentRotation); | 304 return std::make_pair(m_builder.make(), currentRotation); |
294 } | 305 } |
295 | 306 |
296 private: | 307 private: |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 } | 347 } |
337 } | 348 } |
338 | 349 |
339 const GlyphBuffer& m_buffer; | 350 const GlyphBuffer& m_buffer; |
340 const Font* m_font; | 351 const Font* m_font; |
341 const float m_deviceScaleFactor; | 352 const float m_deviceScaleFactor; |
342 const bool m_hasVerticalOffsets; | 353 const bool m_hasVerticalOffsets; |
343 | 354 |
344 SkTextBlobBuilder m_builder; | 355 SkTextBlobBuilder m_builder; |
345 unsigned m_index; | 356 unsigned m_index; |
| 357 unsigned m_endIndex; |
346 unsigned m_blobCount; | 358 unsigned m_blobCount; |
347 BlobRotation m_rotation; | 359 BlobRotation m_rotation; |
348 }; | 360 }; |
349 | 361 |
350 } // anonymous namespace | 362 } // anonymous namespace |
351 | 363 |
352 void Font::drawGlyphBuffer(SkCanvas* canvas, | 364 void Font::drawGlyphBuffer(SkCanvas* canvas, |
353 const SkPaint& paint, | 365 const SkPaint& paint, |
354 const TextRunPaintInfo& runInfo, | 366 const TextRunPaintInfo& runInfo, |
355 const GlyphBuffer& glyphBuffer, | 367 const GlyphBuffer& glyphBuffer, |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 if (!numIntervals) | 444 if (!numIntervals) |
433 return; | 445 return; |
434 DCHECK_EQ(numIntervals % 2, 0); | 446 DCHECK_EQ(numIntervals % 2, 0); |
435 intercepts.resize(numIntervals / 2); | 447 intercepts.resize(numIntervals / 2); |
436 paint.getTextBlobIntercepts(runInfo.cachedTextBlob->get(), boundsArray, | 448 paint.getTextBlobIntercepts(runInfo.cachedTextBlob->get(), boundsArray, |
437 reinterpret_cast<SkScalar*>(intercepts.data())); | 449 reinterpret_cast<SkScalar*>(intercepts.data())); |
438 return; | 450 return; |
439 } | 451 } |
440 | 452 |
441 GlyphBuffer glyphBuffer; | 453 GlyphBuffer glyphBuffer; |
| 454 // Compute skip-ink exceptions in the GlyphBuffer. |
| 455 // Skip the computation if 8Bit(), no such characters in Latin-1. |
| 456 if (!runInfo.run.is8Bit()) |
| 457 glyphBuffer.saveSkipInkExceptions(); |
442 buildGlyphBuffer(runInfo, glyphBuffer); | 458 buildGlyphBuffer(runInfo, glyphBuffer); |
443 | 459 |
444 // Get the number of intervals, without copying the actual values by | 460 // Get the number of intervals, without copying the actual values by |
445 // specifying nullptr for the buffer, following the Skia allocation model for | 461 // specifying nullptr for the buffer, following the Skia allocation model for |
446 // retrieving text intercepts. | 462 // retrieving text intercepts. |
447 int numIntervals = getInterceptsFromBloberizer( | 463 int numIntervals = getInterceptsFromBloberizer( |
448 glyphBuffer, this, paint, deviceScaleFactor, bounds, nullptr); | 464 glyphBuffer, this, paint, deviceScaleFactor, bounds, nullptr); |
449 if (!numIntervals) | 465 if (!numIntervals) |
450 return; | 466 return; |
451 DCHECK_EQ(numIntervals % 2, 0); | 467 DCHECK_EQ(numIntervals % 2, 0); |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 | 636 |
621 bool Font::loadingCustomFonts() const { | 637 bool Font::loadingCustomFonts() const { |
622 return m_fontFallbackList && m_fontFallbackList->loadingCustomFonts(); | 638 return m_fontFallbackList && m_fontFallbackList->loadingCustomFonts(); |
623 } | 639 } |
624 | 640 |
625 bool Font::isFallbackValid() const { | 641 bool Font::isFallbackValid() const { |
626 return !m_fontFallbackList || m_fontFallbackList->isValid(); | 642 return !m_fontFallbackList || m_fontFallbackList->isValid(); |
627 } | 643 } |
628 | 644 |
629 } // namespace blink | 645 } // namespace blink |
OLD | NEW |