// Tests for some of the helpers in SkTemplates.h static void test_automalloc_realloc(skiatest::Reporter* reporter) { SkAutoSTMalloc<1, int> array; // test we have a valid pointer, should not crash array[0] = 1; REPORTER_ASSERT(reporter, array[0] == 1); // using realloc for init array.realloc(1); array[0] = 1; REPORTER_ASSERT(reporter, array[0] == 1); // verify realloc can grow array.realloc(2); REPORTER_ASSERT(reporter, array[0] == 1); // realloc can shrink array.realloc(1); REPORTER_ASSERT(reporter, array[0] == 1); // should not crash array.realloc(0); // grow and shrink again array.realloc(10); for (int i = 0; i < 10; i++) { array[i] = 10 - i; } array.realloc(20); for (int i = 0; i < 10; i++) { REPORTER_ASSERT(reporter, array[i] == 10 - i); } array.realloc(10); for (int i = 0; i < 10; i++) { REPORTER_ASSERT(reporter, array[i] == 10 - i); } array.realloc(1); REPORTER_ASSERT(reporter, array[0] = 10); // resets mixed with realloc, below stack alloc size array.reset(0); array.realloc(1); array.reset(1); array[0] = 1; REPORTER_ASSERT(reporter, array[0] == 1); // reset and realloc > stack size array.reset(2); array.realloc(3); array[0] = 1; REPORTER_ASSERT(reporter, array[0] == 1); array.realloc(1); REPORTER_ASSERT(reporter, array[0] == 1); }
bool SkFontDescriptor::Deserialize(SkStream* stream, SkFontDescriptor* result) { result->fStyle = (SkTypeface::Style)stream->readPackedUInt(); SkAutoSTMalloc<4, SkFixed> axis; size_t axisCount = 0; size_t index = 0; for (size_t id; (id = stream->readPackedUInt()) != kSentinel;) { switch (id) { case kFontFamilyName: read_string(stream, &result->fFamilyName); break; case kFullName: read_string(stream, &result->fFullName); break; case kPostscriptName: read_string(stream, &result->fPostscriptName); break; case kFontAxes: axisCount = read_uint(stream); axis.reset(axisCount); for (size_t i = 0; i < axisCount; ++i) { axis[i] = read_uint(stream); } break; case kFontIndex: index = read_uint(stream); break; case kFontFileName: // Remove when MIN_PICTURE_VERSION > 41 skip_string(stream); break; default: SkDEBUGFAIL("Unknown id used by a font descriptor"); return false; } } size_t length = stream->readPackedUInt(); if (length > 0) { SkAutoTUnref<SkData> data(SkData::NewUninitialized(length)); if (stream->read(data->writable_data(), length) == length) { result->fFontData.reset(new SkFontData(new SkMemoryStream(data), index, axis, axisCount)); } else { SkDEBUGFAIL("Could not read font data"); return false; } } return true; }