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

Side by Side Diff: src/gpu/GrAtlasTextContext.cpp

Issue 1065773005: Fix for segfault on destruction of BitmapTextBlob (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 8 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/gpu/GrAtlasTextContext.h ('k') | src/gpu/GrBatchAtlas.h » ('j') | 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 2015 Google Inc. 2 * Copyright 2015 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 #include "GrAtlasTextContext.h" 7 #include "GrAtlasTextContext.h"
8 8
9 #include "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrBatch.h" 10 #include "GrBatch.h"
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 const SkPaint& skPaint, 653 const SkPaint& skPaint,
654 const SkMatrix& viewMatrix, 654 const SkMatrix& viewMatrix,
655 const SkTDArray<char>& fallb ackTxt, 655 const SkTDArray<char>& fallb ackTxt,
656 const SkTDArray<SkScalar>& f allbackPos, 656 const SkTDArray<SkScalar>& f allbackPos,
657 int scalarsPerPosition, 657 int scalarsPerPosition,
658 const SkPoint& offset, 658 const SkPoint& offset,
659 const SkIRect& clipRect) { 659 const SkIRect& clipRect) {
660 SkASSERT(fallbackTxt.count()); 660 SkASSERT(fallbackTxt.count());
661 blob->setHasBitmap(); 661 blob->setHasBitmap();
662 Run& run = blob->fRuns[runIndex]; 662 Run& run = blob->fRuns[runIndex];
663 PerSubRunInfo& subRun = run.fSubRunInfo.push_back(); 663 // Push back a new subrun to fill and set the override descriptor
664 subRun.fOverrideDescriptor.reset(SkNEW(SkAutoDescriptor)); 664 run.push_back();
665 skPaint.getScalerContextDescriptor(subRun.fOverrideDescriptor, 665 run.fOverrideDescriptor.reset(SkNEW(SkAutoDescriptor));
666 skPaint.getScalerContextDescriptor(run.fOverrideDescriptor,
666 &fDeviceProperties, &viewMatrix, false); 667 &fDeviceProperties, &viewMatrix, false);
667 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface, 668 SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface,
668 subRun.fOverrideDescriptor-> getDesc()); 669 run.fOverrideDescriptor->get Desc());
669 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, paint.getColor( ), viewMatrix, 670 this->internalDrawBMPPosText(blob, runIndex, cache, skPaint, paint.getColor( ), viewMatrix,
670 fallbackTxt.begin(), fallbackTxt.count(), 671 fallbackTxt.begin(), fallbackTxt.count(),
671 fallbackPos.begin(), scalarsPerPosition, offset , clipRect); 672 fallbackPos.begin(), scalarsPerPosition, offset , clipRect);
672 SkGlyphCache::AttachCache(cache); 673 SkGlyphCache::AttachCache(cache);
673 } 674 }
674 675
675 inline GrAtlasTextContext::BitmapTextBlob* 676 inline GrAtlasTextContext::BitmapTextBlob*
676 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, 677 GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint,
677 const SkMatrix& viewMatrix, SkGlyphCache** cache , 678 const SkMatrix& viewMatrix, SkGlyphCache** cache ,
678 SkPaint* dfPaint, SkScalar* textRatio) { 679 SkPaint* dfPaint, SkScalar* textRatio) {
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 // new strike, we instead keep our ref to the old strike and use the packed ids from 1596 // new strike, we instead keep our ref to the old strike and use the packed ids from
1596 // it. These ids will still be valid as long as we hold the ref . When we are done 1597 // it. These ids will still be valid as long as we hold the ref . When we are done
1597 // updating our cache of the GrGlyph*s, we drop our ref on the o ld strike 1598 // updating our cache of the GrGlyph*s, we drop our ref on the o ld strike
1598 bool regenerateGlyphs = false; 1599 bool regenerateGlyphs = false;
1599 GrBatchTextStrike* strike = NULL; 1600 GrBatchTextStrike* strike = NULL;
1600 if (regenerateTextureCoords) { 1601 if (regenerateTextureCoords) {
1601 info.fBulkUseToken.reset(); 1602 info.fBulkUseToken.reset();
1602 1603
1603 // We can reuse if we have a valid strike and our descriptor s / typeface are the 1604 // We can reuse if we have a valid strike and our descriptor s / typeface are the
1604 // same 1605 // same
1605 const SkDescriptor* newDesc = info.fOverrideDescriptor ? 1606 const SkDescriptor* newDesc = run.fOverrideDescriptor ?
1606 info.fOverrideDescriptor->getD esc() : 1607 run.fOverrideDescriptor->getDe sc() :
1607 run.fDescriptor.getDesc(); 1608 run.fDescriptor.getDesc();
1608 if (!cache || !SkTypeface::Equal(typeface, run.fTypeface) || 1609 if (!cache || !SkTypeface::Equal(typeface, run.fTypeface) ||
1609 !(desc->equals(*newDesc))) { 1610 !(desc->equals(*newDesc))) {
1610 if (cache) { 1611 if (cache) {
1611 SkGlyphCache::AttachCache(cache); 1612 SkGlyphCache::AttachCache(cache);
1612 } 1613 }
1613 desc = newDesc; 1614 desc = newDesc;
1614 cache = SkGlyphCache::DetachCache(run.fTypeface, desc); 1615 cache = SkGlyphCache::DetachCache(run.fTypeface, desc);
1615 scaler = GrTextContext::GetGrFontScaler(cache); 1616 scaler = GrTextContext::GetGrFontScaler(cache);
1616 strike = run.fStrike; 1617 strike = run.fStrike;
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
2164 pipelineBuilder.setFromPaint(grPaint, rt, clip); 2165 pipelineBuilder.setFromPaint(grPaint, rt, clip);
2165 2166
2166 GrColor color = grPaint.getColor(); 2167 GrColor color = grPaint.getColor();
2167 for (int run = 0; run < cacheBlob->fRunCount; run++) { 2168 for (int run = 0; run < cacheBlob->fRunCount; run++) {
2168 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, 0, 0, sk Paint); 2169 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, 0, 0, sk Paint);
2169 } 2170 }
2170 2171
2171 // Now flush big glyphs 2172 // Now flush big glyphs
2172 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip, 0, 0); 2173 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip, 0, 0);
2173 } 2174 }
OLDNEW
« no previous file with comments | « src/gpu/GrAtlasTextContext.h ('k') | src/gpu/GrBatchAtlas.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698