コード例 #1
0
ファイル: asm.c プロジェクト: q3k/ski
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;
}
コード例 #2
0
 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);
 }
コード例 #3
0
 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;
 }
コード例 #4
0
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;
}
コード例 #5
0
 boost::optional<Unit> ScheduleTypeLimits_Impl::units(bool returnIP) const
 {
   return ScheduleTypeLimits::units(unitType(), returnIP);
 }