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

Side by Side Diff: src/core/SkTextBlob.cpp

Issue 654873003: Implicit SkTextBlob bounds (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: minor cleanup Created 6 years, 2 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 | « src/core/SkRecordDraw.cpp ('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 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkTextBlob.h" 8 #include "SkTextBlob.h"
9 9
10 #include "SkReadBuffer.h" 10 #include "SkReadBuffer.h"
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 } 311 }
312 } 312 }
313 313
314 void SkTextBlobBuilder::updateDeferredBounds() { 314 void SkTextBlobBuilder::updateDeferredBounds() {
315 SkASSERT(!fDeferredBounds || fRunCount > 0); 315 SkASSERT(!fDeferredBounds || fRunCount > 0);
316 316
317 if (!fDeferredBounds) { 317 if (!fDeferredBounds) {
318 return; 318 return;
319 } 319 }
320 320
321 // FIXME: measure the current run & union bounds 321 SkASSERT(fLastRun >= sizeof(SkTextBlob));
322 SkTextBlob::RunRecord* run = reinterpret_cast<SkTextBlob::RunRecord*>(fStora ge.get() +
323 fLastR un);
324 SkRect runBounds = SkRect::MakeEmpty();
325 if (SkTextBlob::kDefault_Positioning == run->positioning()) {
326 run->font().measureText(run->glyphBuffer(),
327 run->glyphCount() * sizeof(uint16_t),
mtklein 2014/10/16 17:03:59 So we're always GlyphID encoded in SkTextBlobs?
reed1 2014/10/16 17:06:17 agreed. If blobs require glyphs, then lets at leas
f(malita) 2014/10/16 17:21:56 We already do, when allocating runs (allocInternal
reed1 2014/10/16 17:27:18 the value of an assert here is to document that *t
f(malita) 2014/10/16 17:52:43 Done.
328 &runBounds);
329 } else {
330 SkTextBlob::GlyphPositioning positioning = run->positioning();
331 SkASSERT(SkTextBlob::kFull_Positioning == positioning
332 || SkTextBlob::kHorizontal_Positioning == positioning);
333
334 SkScalar* glyphOffset = run->posBuffer();
335 for (unsigned i = 0; i < run->glyphCount(); ++i) {
336 SkRect glyphBounds;
337 run->font().measureText(run->glyphBuffer() + i,
338 sizeof(uint16_t),
339 &glyphBounds);
340 glyphBounds.offset(*glyphOffset,
mtklein 2014/10/16 17:03:59 Can't hurt to comment this up a little, or perhaps
f(malita) 2014/10/16 17:21:56 Will do.
341 (SkTextBlob::kFull_Positioning == positioning)
342 ? *(glyphOffset + 1) : 0);
mtklein 2014/10/16 17:06:20 Wait a sec, are the offsets relative to each other
f(malita) 2014/10/16 17:21:56 They're relative to the start, and measureText alw
343 runBounds.join(glyphBounds);
344 glyphOffset += SkTextBlob::ScalarsPerGlyph(positioning);
345 }
346
347 SkASSERT((void*)glyphOffset <= SkTextBlob::RunRecord::Next(run));
mtklein 2014/10/16 17:03:59 Can we assert == here, or is there other data stor
f(malita) 2014/10/16 17:21:56 There's padding/alignment.
348 }
349
350 runBounds.offset(run->offset());
351
352 fBounds.join(runBounds);
322 fDeferredBounds = false; 353 fDeferredBounds = false;
323 } 354 }
324 355
325 void SkTextBlobBuilder::reserve(size_t size) { 356 void SkTextBlobBuilder::reserve(size_t size) {
326 // We don't currently pre-allocate, but maybe someday... 357 // We don't currently pre-allocate, but maybe someday...
327 if (fStorageUsed + size <= fStorageSize) { 358 if (fStorageUsed + size <= fStorageSize) {
328 return; 359 return;
329 } 360 }
330 361
331 if (0 == fRunCount) { 362 if (0 == fRunCount) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 513
483 fStorageUsed = 0; 514 fStorageUsed = 0;
484 fStorageSize = 0; 515 fStorageSize = 0;
485 fRunCount = 0; 516 fRunCount = 0;
486 fLastRun = 0; 517 fLastRun = 0;
487 fBounds.setEmpty(); 518 fBounds.setEmpty();
488 519
489 return blob; 520 return blob;
490 } 521 }
491 522
OLDNEW
« no previous file with comments | « src/core/SkRecordDraw.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698