aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-01-17 20:19:13 +0000
committerGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-01-17 20:19:13 +0000
commit148a3961b1c82a891012f2feb2a875cea2593170 (patch)
tree19447e5c86ddf83f248d30075befdf78cc759d54
parent8e679fe0238771c32609a4f33045dd599509d2cf (diff)
Don't die when there are no fonts available.
-rw-r--r--src/core/SkPictureFlat.cpp2
-rw-r--r--src/core/SkPictureFlat.h13
-rw-r--r--src/core/SkPictureRecord.cpp4
-rw-r--r--tests/FontHostStreamTest.cpp2
4 files changed, 13 insertions, 8 deletions
diff --git a/src/core/SkPictureFlat.cpp b/src/core/SkPictureFlat.cpp
index e104a402bc..9221c1eb87 100644
--- a/src/core/SkPictureFlat.cpp
+++ b/src/core/SkPictureFlat.cpp
@@ -120,7 +120,7 @@ SkFlatData* SkFlatData::Create(SkFlatController* controller, const void* obj,
SkFlatData* result = (SkFlatData*) controller->allocThrow(allocSize);
result->fIndex = index;
- result->fTopBot[0] = result->fTopBot[1] = 0; // initial to sentinel values
+ result->setTopBotUnwritten();
result->fFlatSize = size;
// put the serialized contents into the data section of the new allocation
diff --git a/src/core/SkPictureFlat.h b/src/core/SkPictureFlat.h
index 9594a594dd..c01e9a3724 100644
--- a/src/core/SkPictureFlat.h
+++ b/src/core/SkPictureFlat.h
@@ -333,20 +333,20 @@ public:
}
// returns true if fTopBot[] has been recorded
- bool isTopBotValid() const {
- return fTopBot[0] < fTopBot[1];
+ bool isTopBotWritten() const {
+ return !SkScalarIsNaN(fTopBot[0]);
}
// Returns fTopBot array, so it can be passed to a routine to compute them.
// For efficiency, we assert that fTopBot have not been recorded yet.
SkScalar* writableTopBot() {
- SkASSERT(!this->isTopBotValid());
+ SkASSERT(!this->isTopBotWritten());
return fTopBot;
}
// return the topbot[] after it has been recorded
const SkScalar* topBot() const {
- SkASSERT(this->isTopBotValid());
+ SkASSERT(this->isTopBotWritten());
return fTopBot;
}
@@ -360,6 +360,11 @@ private:
// This is *not* part of the key for search/sort
SkScalar fTopBot[2];
+ // marks fTopBot[] as unrecorded
+ void setTopBotUnwritten() {
+ this->fTopBot[0] = this->fTopBot[1] = SK_ScalarNaN; // initial to sentinel values
+ }
+
// From here down is the data we look at in the search/sort. We always begin
// with the checksum and then length.
uint32_t fChecksum;
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index 4010387660..3e481acf07 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -538,9 +538,9 @@ static void computeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]
void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, int index,
SkScalar minY, SkScalar maxY) {
SkFlatData* flat = fPaints.writableFlatData(index);
- if (!flat->isTopBotValid()) {
+ if (!flat->isTopBotWritten()) {
computeFontMetricsTopBottom(paint, flat->writableTopBot());
- SkASSERT(flat->isTopBotValid());
+ SkASSERT(flat->isTopBotWritten());
}
addScalar(flat->topBot()[0] + minY);
addScalar(flat->topBot()[1] + maxY);
diff --git a/tests/FontHostStreamTest.cpp b/tests/FontHostStreamTest.cpp
index eb301e3535..bbf1a03ef3 100644
--- a/tests/FontHostStreamTest.cpp
+++ b/tests/FontHostStreamTest.cpp
@@ -94,7 +94,7 @@ static void test_fontHostStream(skiatest::Reporter* reporter) {
const SkFontID typefaceID = SkTypeface::UniqueID(origTypeface);
SkStream* fontData = SkFontHost::OpenStream(typefaceID);
SkTypeface* streamTypeface = SkTypeface::CreateFromStream(fontData);
- paint.setTypeface(streamTypeface)->unref();
+ SkSafeUnref(paint.setTypeface(streamTypeface));
drawBG(&streamCanvas);
streamCanvas.drawPosText("A", 1, &point, paint);