/** Handles the "point" command that adds a point to the point list. */ void EmSpecialHandler::point (InputReader &ir, SpecialActions &actions) { DPair pos(actions.getX(), actions.getY()); int n = ir.getInt(); if (ir.getPunct() == ',') { pos.x(ir.getDouble()); if (ir.getPunct() == ',') pos.y(ir.getDouble()); } _points[n] = pos; }
/** Handles the "line" command that draws a straight line between two points * from the point list. */ void EmSpecialHandler::line (InputReader &ir, SpecialActions& actions) { int pointnum1 = ir.getInt(); int cut1 = 'p'; if (isalpha(ir.peek())) cut1 = ir.get(); ir.getPunct(); int pointnum2 = ir.getInt(); int cut2 = 'p'; if (isalpha(ir.peek())) cut2 = ir.get(); double linewidth = _linewidth; if (ir.getPunct() == ',') linewidth = read_length(ir); auto it1=_points.find(pointnum1); auto it2=_points.find(pointnum2); if (it1 != _points.end() && it2 != _points.end()) create_line(it1->second, it2->second, char(cut1), char(cut2), linewidth, actions); else { // Line endpoints don't necessarily have to be defined before // a line definition. If a point isn't defined yet, we put the line // in a wait list and process the lines at the end of the page. _lines.emplace_back(Line(pointnum1, pointnum2, char(cut1), char(cut2), linewidth)); } }