コード例 #1
0
ファイル: render_context.cpp プロジェクト: mojca/indigo
void RenderContext::drawAttachmentPoint (RenderItemAttachmentPoint& ri)
{
   setSingleSource(ri.color);
   if (ri.highlighted && opt.highlightColorEnable)
      setSingleSource(opt.highlightColor);
   setLineWidth(_settings.bondLineWidth);
   moveTo(ri.p0);
   lineTo(ri.p1);
   checkPathNonEmpty();
   bbIncludePath(false);
   cairo_stroke(_cr);
   cairoCheckStatus();

   Vec2f n;
   n.copy(ri.dir);
   n.rotateL(1, 0);
   Vec2f p, q, r;
   int waveCnt = 10;
   float waveLength = 0.5f;
   float waveWidth = waveLength / waveCnt;
   float slopeFactor = 0.2f;
   p.lineCombin(ri.p1, n, -0.5f * waveLength);
   moveTo(p);
   float step = waveLength / waveCnt;
   for (int i = 0; i < waveCnt; ++i) {
      int turn = ((i & 1) ? 1 : -1);
      q.lineCombin(p, ri.dir, waveWidth * turn);
      q.addScaled(n, waveWidth * slopeFactor);
      p.addScaled(n, step);
      r.lineCombin(p, ri.dir, waveWidth * turn);
      r.addScaled(n, -waveWidth * slopeFactor);
      cairo_curve_to(_cr, q.x, q.y, r.x, r.y, p.x, p.y);
   }
   checkPathNonEmpty();
   bbIncludePath(false);
   cairo_stroke(_cr);
   cairoCheckStatus();

   QS_DEF(TextItem, ti);
   ti.clear();
   if (ri.number > 0) {
      bprintf(ti.text, "%d", ri.number);
      ti.fontsize = FONT_SIZE_ATTACHMENT_POINT_INDEX;
      setTextItemSize(ti, ri.p1);
      float sz = ti.bbsz.length();
      ti.bbp.addScaled(n, -(sz/2 + _settings.bondLineWidth));
      ti.bbp.addScaled(ri.dir, -(sz/2 + waveWidth + _settings.bondLineWidth));
      drawTextItemText(ti);
   }
}