Example #1
0
static void xlsx_new_page(const pGEcontext gc, pDevDesc dd) {
  XLSX_dev *xlsx_obj = (XLSX_dev*) dd->deviceSpecific;

  if (xlsx_obj->pageno > 0) {
    Rf_error("xlsx device only supports one page");
  }

  xlsx_obj->clp->set_clipping_region(0.0, 0.0, dd->right, dd->bottom);
  main_tree mt(xlsx_obj->new_id(), xlsx_obj->new_id(),
               xlsx_obj->offx, xlsx_obj->offy,
               dd->right, dd->bottom, xlsx_obj->standalone);

  fprintf(xlsx_obj->file, "%s", mt.x_opening_tag().c_str() );

  int bg_fill, fill, col;
  a_color bg_temp(gc->fill);
  if (bg_temp.is_visible())
    bg_fill = gc->fill;
  else bg_fill = dd->startfill;

  a_color bg_color(bg_fill);
  if( bg_color.is_transparent() < 1 ){
    fill = gc->fill;
    col = gc->col;
    gc->fill = bg_fill;
    gc->col = bg_fill;
    xlsx_rect(0, 0, dd->right, dd->bottom, gc, dd);
    gc->fill = fill;
    gc->col = col;
  }



  xlsx_obj->pageno++;
}
 void OverlayMenuDisplay::openingAnimation()
 {
   ROS_DEBUG("openningAnimation");
   prepareOverlay();
   int current_width = animation_t_ / animate_duration * overlay_->getTextureWidth();
   int current_height = animation_t_ / animate_duration * overlay_->getTextureHeight();
   {
     ScopedPixelBuffer buffer = overlay_->getBuffer();
     QColor bg_color(0, 0, 0, 255.0 / 2.0);
     QColor transparent(0, 0, 0, 0.0);
     QImage Hud = buffer.getQImage(*overlay_);
     for (int i = 0; i < overlay_->getTextureWidth(); i++) {
       for (int j = 0; j < overlay_->getTextureHeight(); j++) {
         if (i > (overlay_->getTextureWidth() - current_width) / 2.0 &&
             i < overlay_->getTextureWidth() - (overlay_->getTextureWidth() - current_width) / 2.0 &&
             j > (overlay_->getTextureHeight() - current_height) / 2.0 &&
             j < overlay_->getTextureHeight() - (overlay_->getTextureHeight() - current_height) / 2.0) {
           Hud.setPixel(i, j, bg_color.rgba());
         }
         else {
           Hud.setPixel(i, j, transparent.rgba());
         }
       }
     }
   }
   overlay_->setDimensions(overlay_->getTextureWidth(), overlay_->getTextureHeight());
   int window_width = context_->getViewManager()->getRenderPanel()->width();
   int window_height = context_->getViewManager()->getRenderPanel()->height();
   double window_left = (window_width - (int)overlay_->getTextureWidth()) / 2.0;
   double window_top = (window_height - (int)overlay_->getTextureHeight()) / 2.0;
   overlay_->setPosition(window_left, window_top);
                         
   current_menu_ = next_menu_;
 }
 void OverlayMenuDisplay::redraw()
 {
   ROS_DEBUG("redraw");
   prepareOverlay();
   {
     ScopedPixelBuffer buffer = overlay_->getBuffer();
     QColor bg_color(0, 0, 0, 255.0 / 2.0);
     QColor fg_color(25, 255, 240, 255.0);
     QImage Hud = buffer.getQImage(*overlay_, bg_color);
     QPainter painter( &Hud );
     painter.setRenderHint(QPainter::Antialiasing, true);
     painter.setPen(QPen(fg_color, 1, Qt::SolidLine));
     painter.setFont(font());
     int line_height = fontMetrics().height();
     int w = drawAreaWidth(next_menu_);
     painter.drawText(menu_padding_x,  menu_padding_y,
                      w, line_height,
                      Qt::TextWordWrap | Qt::AlignLeft | Qt::AlignTop,
                      next_menu_->title.c_str());
     for (size_t i = 0; i < next_menu_->menus.size(); i++) {
       std::string menu = getMenuString(next_menu_, i);
       painter.drawText(menu_padding_x, line_height * ( 1 + i ) + menu_padding_y + menu_last_padding_y,
                        w, line_height,
                        Qt::TextWordWrap | Qt::AlignLeft | Qt::AlignTop,
                        menu.c_str());
     }
     if (next_menu_->current_index <= next_menu_->menus.size()) {
       // draw '>'
       painter.drawText(menu_padding_x - fontMetrics().width(">") * 2,
                        line_height * ( 1 + next_menu_->current_index ) + menu_padding_y + menu_last_padding_y,
                        w, line_height,
                        Qt::TextWordWrap | Qt::AlignLeft | Qt::AlignTop,
                        ">");
     }
     // draw line
     int texture_width = overlay_->getTextureWidth();
     int texture_height = overlay_->getTextureHeight();
     painter.drawLine(menu_padding_x / 2, menu_last_padding_y / 2 + line_height,
                      menu_padding_x / 2, texture_height - menu_last_padding_y / 2);
     painter.drawLine(texture_width - menu_padding_x / 2, menu_last_padding_y / 2 + line_height,
                      texture_width - menu_padding_x / 2, texture_height - menu_last_padding_y / 2);
     painter.drawLine(menu_padding_x / 2, menu_last_padding_y / 2 + line_height,
                      texture_width - menu_padding_x / 2, menu_last_padding_y / 2 + line_height);
     painter.drawLine(menu_padding_x / 2, texture_height - menu_last_padding_y / 2,
                      texture_width - menu_padding_x / 2, texture_height - menu_last_padding_y / 2);
     
     painter.end();
     current_menu_ = next_menu_;
   }
   overlay_->setDimensions(overlay_->getTextureWidth(), overlay_->getTextureHeight());
   int window_width = context_->getViewManager()->getRenderPanel()->width();
   int window_height = context_->getViewManager()->getRenderPanel()->height();
   double window_left = (window_width - (int)overlay_->getTextureWidth()) / 2.0;
   double window_top = (window_height - (int)overlay_->getTextureHeight()) / 2.0;
   overlay_->setPosition(window_left, window_top);
 }
Example #4
0
void GrabCut::show()
{
    Scalar fg_color(255,0,0);
    Scalar bg_color(0,255,0);
    cv::Mat scribbled_src = _src.clone();
    const float alpha = 0.7f;
    
    for(int y=0; y < _gcut.rows; y++){
        for(int x=0; x < _gcut.cols; x++){
            if(_gcut.at<uchar>(y, x) == cv::GC_FGD) {
                cv::circle(scribbled_src, cv::Point(x, y), 2, fg_color, -1);
            } 
            else if(_gcut.at<uchar>(y, x) == cv::GC_BGD) {
                cv::circle(scribbled_src, cv::Point(x, y), 2, bg_color, -1);
            } 
            else if(_gcut.at<uchar>(y, x) == cv::GC_PR_BGD) {
                cv::Vec3b& pix = scribbled_src.at<cv::Vec3b>(y, x);
                pix[0] = (uchar)(pix[0] * alpha + bg_color[0] * (1-alpha));
                pix[1] = (uchar)(pix[1] * alpha + bg_color[1] * (1-alpha));
                pix[2] = (uchar)(pix[2] * alpha + bg_color[2] * (1-alpha));
            } 
            else if(_gcut.at<uchar>(y, x) == cv::GC_PR_FGD) {
                cv::Vec3b& pix = scribbled_src.at<cv::Vec3b>(y, x);
                pix[0] = (uchar)(pix[0] * alpha + fg_color[0] * (1-alpha));
                pix[1] = (uchar)(pix[1] * alpha + fg_color[1] * (1-alpha));
                pix[2] = (uchar)(pix[2] * alpha + fg_color[2] * (1-alpha));
            }
        }
    }
    Rect roi;
    Mat scrb;
    roi = Rect(_src.cols,0,_src.cols,_src.rows);
    scribbled_src.copyTo(_dsp(roi));
    
    Mat msk = getBinMask();
    cv::Mat send = msk.clone();
    cv::Mat sendFilter;
    cv::Mat resultMat = filterMaskAndMergeMat(send, _cutResultMask, _gcutBuffer);
    Mat fg = getFGByMask(resultMat);//getFG();
    roi = Rect(_src.cols,_src.rows,_src.cols,_src.rows);
    fg.copyTo(_dsp(roi));
  //  imshow("fg", fg);
    
   // imshow("mergeResultMat", resultMat);
    _cutResultMask = resultMat;
    //Rect    tmp = getMaskRct(_gcutBuffer);
    cvtColor(msk,msk,COLOR_GRAY2BGR);
    roi = Rect(0,_src.rows,_src.cols,_src.rows);
    msk.copyTo(_dsp(roi));
    //imshow("msk", msk);
    //imshow("_mask", _mask);
    imshow(_name,_dsp);
    waitKey(1);
}
Example #5
0
/**
 * Main game loop
 */
void Game::Game::run()
{
	std::cout << "Game Launched" << std::endl;
	while(WindowManager::gw->isOpen())
	{
		sf::Color bg_color(87,123,255);
		WindowManager::gw->clear(bg_color);
		checkEvents();
		GameEngine::gc->update();
		GameEngine::gc->draw();
		WindowManager::gw->display();
		
	}
}
Example #6
0
static void setupHardware(void) {
	// TODO: Put hardware configuration and initialisation in here
	SystemInit();

	resetGPIO();

	setInput_P2();

	ADCInit(ADC_CLK);

	//resetto il termometro
	pinMode(OUTPUT);
	digitalWrite(HIGH);

	Initial_Hardware();	//init lcd hardware

	Initial_GLCD_Hor();	//init lcd "software"

	bg_color(BLACK);


	int sto_premendo = 0;

	eMBErrorCode    eStatus;

	eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_NONE );

	/* Initialize the holding register values before starting the
	 * Modbus stack
	 */
	int i;

	for( i = 0; i < REG_HOLDING_NREGS; i++ )
	{
		usRegHoldingBuf[i] = 0;
	}

	sensors.distance1 = 1;
	sensors.distance2 = 2;
	sensors.lumino = 3;
	sensors.mic = 4;
	sensors.vibro = 5;
	actual_DHT11.humidity = 666;
	actual_DHT11.temperature = 666;

	//associo ai registri holding il valore dei sensori
	*(usRegHoldingBuf     ) = (USHORT *) &sensors.distance1;
	*(usRegHoldingBuf + 1 ) = (USHORT *) &sensors.distance2;
	*(usRegHoldingBuf + 2 ) = (USHORT *) &sensors.lumino;
	*(usRegHoldingBuf + 3 ) = (USHORT *) &sensors.mic;
	*(usRegHoldingBuf + 4 ) = (USHORT *) &sensors.vibro;
	*(usRegHoldingBuf + 5 ) = (USHORT *) &actual_DHT11.humidity;
	*(usRegHoldingBuf + 6 ) = (USHORT *) &actual_DHT11.temperature;


	/* Enable the Modbus Protocol Stack. */
	eStatus = eMBEnable(  );


	// Warning: If you do not initialize the hardware clock, the timings will be inaccurate
}
BOOL CColorEditSampleDlg::OnInitDialog() {
  CDialog::OnInitDialog();

  CDC *dc = __super::GetDC();

  // icon
  HICON icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  SetIcon(icon, TRUE);
  SetIcon(icon, FALSE);

  // edit
  LOGFONT font;
  {
    CString font_name = _T("Tahoma");
    LONG font_size = 14;

    _tcsncpy_s(font.lfFaceName, font_name, LF_FACESIZE);
    {
      static const int kPhysicalPx = 72;
      int logicalPx = dc->GetDeviceCaps(LOGPIXELSY);
      font.lfHeight = font_size * 10 * (-1) * logicalPx / kPhysicalPx;
    }
    font.lfWidth = 0;
    font.lfEscapement = 0;
    font.lfOrientation = 0;
    font.lfWeight = FW_NORMAL;
    font.lfItalic = FALSE;
    font.lfUnderline = FALSE;
    font.lfStrikeOut = FALSE;
    font.lfCharSet = DEFAULT_CHARSET;
    font.lfOutPrecision = OUT_DEFAULT_PRECIS;
    font.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    font.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
    font.lfQuality = DEFAULT_QUALITY;
  }

  CSize edit_size(320, 100);

  COLORREF text_color(RGB(0, 0, 128));
  COLORREF placeholder_color(RGB(128, 0, 0));
  COLORREF bg_color(RGB(64, 128, 128));
  COLORREF border_color(RGB(139, 87, 66));
  COLORREF focus_text_color(RGB(0, 64, 255));
  COLORREF focus_placeholder_color(RGB(255, 64, 0));
  COLORREF focus_bg_color(RGB(128, 255, 255));
  COLORREF focus_border_color(RGB(139, 69, 0));

  UINT border_width = 10;
  LONG left_margin = 10;
  LONG right_margin = 10;

  CPoint id_pos(50, 50);
  id_edit_.CreateEdit(100,
                      this,
                      id_pos,
                      edit_size,
                      false,
                      _T(""),
                      _T("Id or email"),
                      &font,
                      text_color,
                      placeholder_color,
                      bg_color,
                      border_color,
                      focus_text_color,
                      focus_placeholder_color,
                      focus_bg_color,
                      focus_border_color,
                      border_width,
                      left_margin,
                      right_margin);

  CPoint pw_pos(50, 160);
  pw_edit_.CreateEdit(101,
                      this,
                      pw_pos,
                      edit_size,
                      true,
                      _T(""),
                      _T("Password"),
                      &font,
                      text_color,
                      placeholder_color,
                      bg_color,
                      border_color,
                      focus_text_color,
                      focus_placeholder_color,
                      focus_bg_color,
                      focus_border_color,
                      border_width,
                      left_margin,
                      right_margin);

  //
  __super::ReleaseDC(dc);
  return TRUE;
}
Example #8
0
// Load map general properties
bool j1Map::LoadMap()
{
	bool ret = true;
	pugi::xml_node map = map_file.child("map");

	if(map == NULL)
	{
		LOG("Error parsing map xml file: Cannot find 'map' tag.");
		ret = false;
	}
	else
	{
		data.width = map.attribute("width").as_int();
		data.height = map.attribute("height").as_int();
		data.tile_width = map.attribute("tilewidth").as_int();
		data.tile_height = map.attribute("tileheight").as_int();
		p2SString bg_color(map.attribute("backgroundcolor").as_string());

		data.background_color.r = 0;
		data.background_color.g = 0;
		data.background_color.b = 0;
		data.background_color.a = 0;

		if(bg_color.Length() > 0)
		{
			p2SString red, green, blue;
			bg_color.SubString(1, 2, red);
			bg_color.SubString(3, 4, green);
			bg_color.SubString(5, 6, blue);

			int v = 0;

			sscanf_s(red.GetString(), "%x", &v);
			if(v >= 0 && v <= 255) data.background_color.r = v;

			sscanf_s(green.GetString(), "%x", &v);
			if(v >= 0 && v <= 255) data.background_color.g = v;

			sscanf_s(blue.GetString(), "%x", &v);
			if(v >= 0 && v <= 255) data.background_color.b = v;
		}

		p2SString orientation(map.attribute("orientation").as_string());

		if(orientation == "orthogonal")
		{
			data.type = MAPTYPE_ORTHOGONAL;
		}
		else if(orientation == "isometric")
		{
			data.type = MAPTYPE_ISOMETRIC;
		}
		else if(orientation == "staggered")
		{
			data.type = MAPTYPE_STAGGERED;
		}
		else
		{
			data.type = MAPTYPE_UNKNOWN;
		}
	}

	return ret;
}
  void PieChartDisplay::drawPlot(double val)
  {
    QColor fg_color(fg_color_);

    if (auto_color_change_) {
      double r
        = std::min(1.0, fabs((val - min_value_) / (max_value_ - min_value_)));
      fg_color.setRed((max_color_.red() - fg_color_.red()) * r
                      + fg_color_.red());
      fg_color.setGreen((max_color_.green() - fg_color_.green()) * r
                      + fg_color_.green());
      fg_color.setBlue((max_color_.blue() - fg_color_.blue()) * r
                       + fg_color_.blue());
    }

    
    QColor fg_color2(fg_color);
    QColor bg_color(bg_color_);
    QColor text_color(text_color_);
    fg_color.setAlpha(fg_alpha_);
    fg_color2.setAlpha(fg_alpha2_);
    bg_color.setAlpha(bg_alpha_);
    text_color.setAlpha(text_alpha_);
    int width = overlay_->getTextureWidth();
    int height = overlay_->getTextureHeight();
    {
      ScopedPixelBuffer buffer = overlay_->getBuffer();
      QImage Hud = buffer.getQImage(*overlay_, bg_color);
      QPainter painter( &Hud );
      painter.setRenderHint(QPainter::Antialiasing, true);

      const int outer_line_width = 5;
      const int value_line_width = 10;
      const int value_indicator_line_width = 2;
      const int value_padding = 5;

      const int value_aabb_offset
        = outer_line_width + value_padding + value_line_width / 2;
      
      painter.setPen(QPen(fg_color, outer_line_width, Qt::SolidLine));

      painter.drawEllipse(outer_line_width / 2, outer_line_width / 2,
                          width - outer_line_width ,
                          height - outer_line_width - caption_offset_);

      painter.setPen(QPen(fg_color2, value_indicator_line_width, Qt::SolidLine));
      painter.drawEllipse(value_aabb_offset, value_aabb_offset,
                          width - value_aabb_offset * 2,
                          height - value_aabb_offset * 2 - caption_offset_);

      const double ratio = (val - min_value_) / (max_value_ - min_value_);
      const double ratio_angle = ratio * 360.0;
      const double start_angle_offset = -90;
      painter.setPen(QPen(fg_color, value_line_width, Qt::SolidLine));
      painter.drawArc(QRectF(value_aabb_offset, value_aabb_offset,
                             width - value_aabb_offset * 2,
                             height - value_aabb_offset * 2 - caption_offset_),
                      start_angle_offset * 16 ,
                      ratio_angle * 16);
      QFont font = painter.font();
      font.setPointSize(text_size_);
      font.setBold(true);
      painter.setFont(font);
      painter.setPen(QPen(text_color, value_line_width, Qt::SolidLine));
      std::ostringstream s;
      s << std::fixed << std::setprecision(2) << val;
      painter.drawText(0, 0, width, height - caption_offset_,
                       Qt::AlignCenter | Qt::AlignVCenter,
                       s.str().c_str());

      // caption
      if (show_caption_) {
        painter.drawText(0, height - caption_offset_, width, caption_offset_,
                         Qt::AlignCenter | Qt::AlignVCenter,
                         getName());
      }
      
      // done
      painter.end();
      // Unlock the pixel buffer
    }
  }
Example #10
0
void CCalendarWidget::paintCell (QPainter *painter, const QRect &rect, const QDate &date) const
{
  QSize fsize = fontMetrics().size (Qt::TextSingleLine, "A");

  if (moon_mode)
     {
      int moon_day = moon_phase_by_algo (moon_phase_algo, date.year(), date.month(), date.day());

      bool has_image = true;

      if (moon_day == 0 || moon_day == 30 || moon_day == 1)
         has_image = false;

      //вычисляем ряд и колонку

      //правильно
      //int row = moon_day / 8;

      int cursorOffset = moon_day;

      int off = 0;
      int row = 0;

      while (cursorOffset >= (off + 8))
            {
             off += 7;
             row++;
            }

      int col = cursorOffset - off;

 //    qDebug() << "moon day: " << moon_day << "| date:" << date.toString("dd") << " | row = " << row << " col = " << col;

    //вычисляем, откуда копировать

      int pad = 3;

      int x = (col - 1) * 73 + (pad * col) - pad;
      int y = row * 73 + (pad * row);

      QRect r (x, y, 66, 73);

      QImage tile = moon_tiles.copy (r);

      QColor bg_color (Qt::black);

      painter->fillRect (rect, bg_color);


      if (has_image)
         {
          if (northern_hemisphere)
             painter->drawImage (rect.x(), rect.y(), tile);
          else
              painter->drawImage (rect.x(), rect.y(), tile.mirrored (true, false));
         }

      painter->setPen (QPen (Qt::yellow));

      QTextCharFormat tcf = dateTextFormat (date);
      if (tcf.fontStrikeOut())
          painter->setPen (QPen (Qt::magenta));
      else
      if (tcf.fontUnderline())
          painter->setPen (QPen (Qt::red));

      painter->drawText (QPoint (rect.x() + 5, rect.y() + fsize.height()), date.toString("dd") + " / " + QString::number (moon_day));

      if (selectedDate() == date)
         {
          QPen dpen (Qt::yellow);
          dpen.setWidth (5);
          painter->setPen (dpen);
          painter->drawRect (rect);
         }
    }
 else
     QCalendarWidget::paintCell (painter, rect, date);
}
Example #11
0
////////////////////////////////////////////////////////////////////////////////
// Project  Remaining  Avg Age  Complete  0%                  100%
// A               12      13d       55%  XXXXXXXXXXXXX-----------
// B              109   3d 12h       10%  XXX---------------------
int CmdSummary::execute (std::string& output)
{
  int rc = 0;

  // Scan the pending tasks.
  handleRecurrence ();

  // Apply filter.
  std::vector <Task> filtered;
  filter (filtered);
  context.tdb2.commit ();

  // Generate unique list of project names from all pending tasks.
  std::map <std::string, bool> allProjects;
  std::vector <Task>::iterator task;
  for (task = filtered.begin (); task != filtered.end (); ++task)
    if (task->getStatus () == Task::pending)
      allProjects[task->get ("project")] = false;

  // Initialize counts, sum.
  std::map <std::string, int> countPending;
  std::map <std::string, int> countCompleted;
  std::map <std::string, double> sumEntry;
  std::map <std::string, int> counter;
  time_t now = time (NULL);

  // Initialize counters.
  std::map <std::string, bool>::iterator project;
  for (project = allProjects.begin (); project != allProjects.end (); ++project)
  {
    countPending   [project->first] = 0;
    countCompleted [project->first] = 0;
    sumEntry       [project->first] = 0.0;
    counter        [project->first] = 0;
  }

  // Count the various tasks.
  for (task = filtered.begin (); task != filtered.end (); ++task)
  {
    std::string project = task->get ("project");
    ++counter[project];

    if (task->getStatus () == Task::pending ||
        task->getStatus () == Task::waiting)
    {
      ++countPending[project];

      time_t entry = strtol (task->get ("entry").c_str (), NULL, 10);
      if (entry)
        sumEntry[project] = sumEntry[project] + (double) (now - entry);
    }

    else if (task->getStatus () == Task::completed)
    {
      ++countCompleted[project];

      time_t entry = strtol (task->get ("entry").c_str (), NULL, 10);
      time_t end   = strtol (task->get ("end").c_str (), NULL, 10);
      if (entry && end)
        sumEntry[project] = sumEntry[project] + (double) (end - entry);
    }
  }

  // Create a table for output.
  ViewText view;
  view.width (context.getWidth ());
  view.add (Column::factory ("string",            STRING_CMD_SUMMARY_PROJECT));
  view.add (Column::factory ("string.right",      STRING_CMD_SUMMARY_REMAINING));
  view.add (Column::factory ("string.right",      STRING_CMD_SUMMARY_AVG_AGE));
  view.add (Column::factory ("string.right",      STRING_CMD_SUMMARY_COMPLETE));
  view.add (Column::factory ("string.left_fixed", "0%                        100%"));

  Color bar_color (context.config.get ("color.summary.bar"));
  Color bg_color  (context.config.get ("color.summary.background"));

  int barWidth = 30;
  std::vector <std::string> processed;
  std::map <std::string, bool>::iterator i;
  for (i = allProjects.begin (); i != allProjects.end (); ++i)
  {
    if (countPending[i->first] > 0)
    {
      const std::vector <std::string> parents = extractParents (i->first);
      std::vector <std::string>::const_iterator parent;
      for (parent = parents.begin (); parent != parents.end (); parent++)
      {
        if (std::find (processed.begin (), processed.end (), *parent)
           == processed.end ())
        {
          int row = view.addRow ();
          view.set (row, 0, indentProject (*parent));
          processed.push_back (*parent);
        }
      }

      int row = view.addRow ();
      view.set (row, 0, (i->first == ""
                          ? STRING_CMD_SUMMARY_NONE
                          : indentProject (i->first, "  ", '.')));

      view.set (row, 1, countPending[i->first]);
      if (counter[i->first])
        view.set (row, 2, Duration ((int) (sumEntry[i->first] / (double)counter[i->first])).format ());

      int c = countCompleted[i->first];
      int p = countPending[i->first];
      int completedBar = (c * barWidth) / (c + p);

      std::string bar;
      std::string subbar;
      if (context.color ())
      {
        bar += bar_color.colorize (std::string (           completedBar, ' '));
        bar += bg_color.colorize  (std::string (barWidth - completedBar, ' '));
      }
      else
      {
        bar += std::string (           completedBar, '=')
            +  std::string (barWidth - completedBar, ' ');
      }
      view.set (row, 4, bar);

      char percent[12];
      sprintf (percent, "%d%%", 100 * c / (c + p));
      view.set (row, 3, percent);
      processed.push_back (i->first);
    }
  }

  std::stringstream out;
  if (view.rows ())
  {
    out << optionalBlankLine ()
        << view.render ()
        << optionalBlankLine ();

    if (view.rows ())
      out << format (STRING_CMD_PROJECTS_SUMMARY2, view.rows ());
    else
      out << STRING_CMD_PROJECTS_SUMMARY;

    out << "\n";
  }
  else {
    out << STRING_CMD_PROJECTS_NO << "\n";
    rc = 1;
  }

  output = out.str ();
  return rc;
}
Ref<Texture> CurvePreviewGenerator::generate(const Ref<Resource> &p_from) {

	Ref<Curve> curve_ref = p_from;
	ERR_FAIL_COND_V(curve_ref.is_null(), Ref<Texture>());
	Curve &curve = **curve_ref;

	int thumbnail_size = EditorSettings::get_singleton()->get("filesystem/file_dialog/thumbnail_size");
	thumbnail_size *= EDSCALE;
	Ref<Image> img_ref;
	img_ref.instance();
	Image &im = **img_ref;

	im.create(thumbnail_size, thumbnail_size / 2, 0, Image::FORMAT_RGBA8);

	im.lock();

	Color bg_color(0.1, 0.1, 0.1, 1.0);
	for (int i = 0; i < thumbnail_size; i++) {
		for (int j = 0; j < thumbnail_size / 2; j++) {
			im.set_pixel(i, j, bg_color);
		}
	}

	Color line_color(0.8, 0.8, 0.8, 1.0);
	float range_y = curve.get_max_value() - curve.get_min_value();

	int prev_y = 0;
	for (int x = 0; x < im.get_width(); ++x) {

		float t = static_cast<float>(x) / im.get_width();
		float v = (curve.interpolate_baked(t) - curve.get_min_value()) / range_y;
		int y = CLAMP(im.get_height() - v * im.get_height(), 0, im.get_height());

		// Plot point
		if (y >= 0 && y < im.get_height()) {
			im.set_pixel(x, y, line_color);
		}

		// Plot vertical line to fix discontinuity (not 100% correct but enough for a preview)
		if (x != 0 && Math::abs(y - prev_y) > 1) {
			int y0, y1;
			if (y < prev_y) {
				y0 = y;
				y1 = prev_y;
			} else {
				y0 = prev_y;
				y1 = y;
			}
			for (int ly = y0; ly < y1; ++ly) {
				im.set_pixel(x, ly, line_color);
			}
		}

		prev_y = y;
	}

	im.unlock();

	Ref<ImageTexture> ptex = Ref<ImageTexture>(memnew(ImageTexture));

	ptex->create_from_image(img_ref, 0);
	return ptex;
}
  void Plotter2DDisplay::drawPlot()
  {
    QColor fg_color(fg_color_);
    QColor bg_color(bg_color_);
    
    fg_color.setAlpha(fg_alpha_);
    bg_color.setAlpha(bg_alpha_);

    if (auto_color_change_) {
      double r
        = std::min(std::max((buffer_[buffer_.size() - 1] - min_value_) / (max_value_ - min_value_),
                            0.0), 1.0);
      if (r > 0.3) {
        double r2 = (r - 0.3) / 0.7;
        fg_color.setRed((max_color_.red() - fg_color_.red()) * r2
                        + fg_color_.red());
        fg_color.setGreen((max_color_.green() - fg_color_.green()) * r2
                          + fg_color_.green());
        fg_color.setBlue((max_color_.blue() - fg_color_.blue()) * r2
                         + fg_color_.blue());
      }
    }
    
    {
      ScopedPixelBuffer buffer = overlay_->getBuffer();
      QImage Hud = buffer.getQImage(*overlay_);
      // initilize by the background color
      for (int i = 0; i < overlay_->getTextureWidth(); i++) {
        for (int j = 0; j < overlay_->getTextureHeight(); j++) {
          Hud.setPixel(i, j, bg_color.rgba());
        }
      }
      // paste in HUD speedometer. I resize the image and offset it by 8 pixels from
      // the bottom left edge of the render window
      QPainter painter( &Hud );
      painter.setRenderHint(QPainter::Antialiasing, true);
      painter.setPen(QPen(fg_color, line_width_, Qt::SolidLine));
      
      uint16_t w = overlay_->getTextureWidth();
      uint16_t h = overlay_->getTextureHeight() - caption_offset_;

      double margined_max_value = max_value_ + (max_value_ - min_value_) / 2;
      double margined_min_value = min_value_ - (max_value_ - min_value_) / 2;
      
      for (size_t i = 1; i < buffer_length_; i++) {
        double v_prev = (margined_max_value - buffer_[i - 1]) / (margined_max_value - margined_min_value);
        double v = (margined_max_value - buffer_[i]) / (margined_max_value - margined_min_value);
        double u_prev = (i - 1) / (float)buffer_length_;
        double u = i / (float)buffer_length_;

        // chop within 0 ~ 1
        v_prev = std::max(std::min(v_prev, 1.0), 0.0);
        u_prev = std::max(std::min(u_prev, 1.0), 0.0);
        v = std::max(std::min(v, 1.0), 0.0);
        u = std::max(std::min(u, 1.0), 0.0);
        
        uint16_t x_prev = (int)(u_prev * w);
        uint16_t x = (int)(u * w);
        uint16_t y_prev = (int)(v_prev * h);
        uint16_t y = (int)(v * h);
        painter.drawLine(x_prev, y_prev, x, y);
      }
      // draw border
      if (show_border_) {
        painter.drawLine(0, 0, 0, h);
        painter.drawLine(0, h, w, h);
        painter.drawLine(w, h, w, 0);
        painter.drawLine(w, 0, 0, 0);
      }
      // draw caption
      if (show_caption_) {
        QFont font = painter.font();
        font.setPointSize(text_size_);
        font.setBold(true);
        painter.setFont(font);
        painter.drawText(0, h, w, caption_offset_,
                         Qt::AlignCenter | Qt::AlignVCenter,
                         getName());
      }
      if (show_value_) {
        QFont font = painter.font();
        font.setPointSize(w / 4);
        font.setBold(true);
        painter.setFont(font);
        std::ostringstream ss;
        ss << std::fixed << std::setprecision(2) << buffer_[buffer_.size() - 1];
        painter.drawText(0, 0, w, h,
                         Qt::AlignCenter | Qt::AlignVCenter,
                         ss.str().c_str());
      }
      
      // done
      painter.end();
    }
  }