AsmStatus asm_templ(const char *str, unsigned char *templ) { typedef enum { TemplUnit, TemplStopOrUnit } TemplState; TemplateInfo tinfo; Unit unit; unsigned s = 0; TemplState state = TemplUnit; /* initialize tinfo to an illegal state */ tinfo.slot[0].unit = tinfo.slot[1].unit = tinfo.slot[2].unit = A_Unit; if (*str == '.') /* skip leading "." */ str++; /* scan str and fill in tinfo */ while (*str) { if (s == SLOTS_PER_BUNDLE) return AsmBadTemplate; switch (state) { case TemplUnit: /* expecting a unit char */ if ((unit = unitType(toupper(*str))) == No_Unit) return AsmBadTemplate; tinfo.slot[s].unit = unit; tinfo.slot[s].stop = SB_Cont; state = TemplStopOrUnit; break; case TemplStopOrUnit: /* expecting a comma or a unit char */ if (*str == ',') { tinfo.slot[s++].stop = SB_Stop; state = TemplUnit; } else { if (s == SLOTS_PER_BUNDLE-1) return AsmBadTemplate; if ((unit = unitType(toupper(*str))) == No_Unit) return AsmBadTemplate; tinfo.slot[++s].unit = unit; tinfo.slot[s].stop = SB_Cont; } break; } str++; } /* convert "xLI" to "xLX" */ if (tinfo.slot[1].unit == L_Unit && tinfo.slot[2].unit == I_Unit) tinfo.slot[2].unit = X_Unit; /* search for matching template */ if ((*templ = templSB_from_info(&tinfo)) >= 32) return AsmBadTemplate; return AsmOK; }
OSOptionalQuantity ScheduleTypeLimits_Impl::getQuantityFromDouble(unsigned index, boost::optional<double> value, bool returnIP) const { OptionalUnit siUnits = ScheduleTypeLimits::units(unitType(),false); OS_ASSERT(siUnits); OptionalUnit units = siUnits->clone(); if (returnIP) { units = ScheduleTypeLimits::units(unitType(),true); OS_ASSERT(units); } if (value) { Quantity siQuantity(*value,*siUnits); if (!returnIP || (siUnits.get() == units.get())) { return OSOptionalQuantity(siQuantity); } else { OptionalQuantity result = convert(siQuantity,*units); OS_ASSERT(result); return OSOptionalQuantity(*result); } } return OSOptionalQuantity(*units); }
boost::optional<double> ScheduleTypeLimits_Impl::getDoubleFromQuantity(unsigned index, Quantity q) const { OptionalUnit siUnits = ScheduleTypeLimits::units(unitType(),false); if (siUnits) { if (q.units() == siUnits) { return q.value(); } else { OptionalQuantity converted = convert(q,*siUnits); if (converted) { return q.value(); } } } return boost::none; }
float SVGTextLayoutEngineBaseline::calculateBaselineShift(const SVGRenderStyle& style, SVGElement* context) const { if (style.baselineShift() == BS_LENGTH) { auto baselineShiftValueLength = style.baselineShiftValue(); if (baselineShiftValueLength.unitType() == LengthTypePercentage) return baselineShiftValueLength.valueAsPercentage() * m_font.pixelSize(); SVGLengthContext lengthContext(context); return baselineShiftValueLength.value(lengthContext); } switch (style.baselineShift()) { case BS_BASELINE: return 0; case BS_SUB: return -m_font.fontMetrics().floatHeight() / 2; case BS_SUPER: return m_font.fontMetrics().floatHeight() / 2; case BS_LENGTH: break; } ASSERT_NOT_REACHED(); return 0; }
boost::optional<Unit> ScheduleTypeLimits_Impl::units(bool returnIP) const { return ScheduleTypeLimits::units(unitType(), returnIP); }