/* external function definitions */ void * balloc(int size) { static char fnc[] = "balloc"; void *p; if (size <= 0) { return (void *) (0); } if ((p = (void *) malloc((unsigned) size)) == (void *) (0)) { if (errno == ENOMEM) { /* GASP!!!! */ gasp(size); _exit(1); } Abort("%t %s(): abort: malloc(%u): %m\n", fnc, (unsigned) size); } return p; }
static bool is_hinted_without_gasp(DWriteFontTypeface* typeface) { AutoTDWriteTable<SkOTTableMaximumProfile> maxp(typeface->fDWriteFontFace.get()); if (!maxp.fExists) { return false; } if (maxp.fSize < sizeof(SkOTTableMaximumProfile::Version::TT)) { return false; } if (maxp->version.version != SkOTTableMaximumProfile::Version::TT::VERSION) { return false; } if (0 == maxp->version.tt.maxSizeOfInstructions) { // No hints. return false; } AutoTDWriteTable<SkOTTableGridAndScanProcedure> gasp(typeface->fDWriteFontFace.get()); return !gasp.fExists; }
/** If the rendering mode for the specified 'size' is gridfit, then place * the gridfit range into 'range'. Otherwise, leave 'range' alone. */ static void expand_range_if_gridfit_only(DWriteFontTypeface* typeface, int size, PPEMRange* range) { AutoTDWriteTable<SkOTTableGridAndScanProcedure> gasp(typeface->fDWriteFontFace.get()); if (!gasp.fExists) { return; } if (gasp.fSize < sizeof(SkOTTableGridAndScanProcedure)) { return; } if (gasp->version != SkOTTableGridAndScanProcedure::version0 && gasp->version != SkOTTableGridAndScanProcedure::version1) { return; } uint16_t numRanges = SkEndianSwap16(gasp->numRanges); if (numRanges > 1024 || gasp.fSize < sizeof(SkOTTableGridAndScanProcedure) + sizeof(SkOTTableGridAndScanProcedure::GaspRange) * numRanges) { return; } const SkOTTableGridAndScanProcedure::GaspRange* rangeTable = SkTAfter<const SkOTTableGridAndScanProcedure::GaspRange>(gasp.get()); int minPPEM = -1; for (uint16_t i = 0; i < numRanges; ++i, ++rangeTable) { int maxPPEM = SkEndianSwap16(rangeTable->maxPPEM); // Test that the size is in range and the range is gridfit only. if (minPPEM < size && size <= maxPPEM && rangeTable->flags.raw.value == SkOTTableGridAndScanProcedure::GaspRange::behavior::Raw::GridfitMask) { range->min = minPPEM + 1; range->max = maxPPEM; return; } minPPEM = maxPPEM; } }