Ошибки, баги, вопросы - страница 2063

 
Есть два bmp-объекта с каналами прозрачности. При наложении друг на друга возникают какие-то uint-цвета. Как самому посчитать эти значения, если известны uint-цвета наложенных пикселей каждого объекта?
 
fxsaber:
Есть два bmp-объекта с каналами прозрачности. При наложении друг на друга возникают какие-то uint-цвета. Как самому посчитать эти значения, если известны uint-цвета наложенных пикселей каждого объекта?

static uchar      GetA(const uint fromcolor){return(uchar((fromcolor)>>24));}
   static uchar      GetR(const uint fromcolor){return(uchar((fromcolor)>>16));}
   static uchar      GetG(const uint fromcolor){return(uchar((fromcolor)>>8));}
   static uchar      GetB(const uint fromcolor){return(uchar(fromcolor));}
static uint       ARGBToColor(const uchar a,const uchar r,const uchar g,const uchar b){return((a<<24)|(r<<16)|(g<<8)|(b));}

static uint cColor::Mix(const uint bottom,const uint top)
  {
//===============
// if top color is not transparent => no mixing required
//===============
   if(cColor::GetA(top)==UCHAR_MAX)return(top);
//===============

//===============
   static uint bottomprev=0;
   static uint topprev=0;
   static uint resultprev=0;
//===============

//===============
   if(bottomprev==bottom && topprev==top)return(resultprev);
//===============

//===============
   bottomprev=bottom;
   topprev=top;
//===============

//===============
// Get Params of Colors
//===============
   double topA=(double)cColor::GetA(top);   double bottomA=(double)cColor::GetA(bottom);
   double topR=(double)cColor::GetR(top);   double bottomR=(double)cColor::GetR(bottom);
   double topG=(double)cColor::GetG(top);   double bottomG=(double)cColor::GetG(bottom);
   double topB=(double)cColor::GetB(top);   double bottomB=(double)cColor::GetB(bottom);
//===============

//===============
// Blend components
//===============
   uchar newA=uchar(topA+(bottomA*(255.0-topA)/255.0));
   uchar newR=uchar((topR*topA/255.0)+(bottomR*bottomA *(255.0-topA)/(255.0*255.0)));
   uchar newG=uchar((topG*topA/255.0)+(bottomG*bottomA *(255.0-topA)/(255.0*255.0)));
   uchar newB=uchar((topB*topA/255.0)+(bottomB*bottomA *(255.0-topA)/(255.0*255.0)));
//===============

//===============
   resultprev=cColor::ARGBToColor(newA,newR,newG,newB);
//===============

//===============
// New Color
//===============
   return(resultprev);
//===============
  }
 
Andrey Barinov:

Спасибо! Еще вопрос. Если, например, пять объектов одновременно накладываются друг на друга, то надо пары (top/bottom) составлять снизу-вверх или сверху-вниз?

 
fxsaber:

Спасибо!


Лучше сразу все (bmp) объекты на одном канвасе рисуйте, в долгосроке это более простой подход.

 
Andrey Barinov:

Лучше сразу все (bmp) объекты на одном канвасе рисуйте, в долгосроке это более простой подход.

Именно по этой причине и спрашиваю. Выше вопрос еще один оформил.

 
fxsaber:

Спасибо! Еще вопрос. Если, например, пять объектов одновременно накладываются друг на друга, то надо пары (top/bottom) составлять снизу-вверх или сверху-вниз?


я рисую слоями, в соответствии с порядком (типа zorder), снизу вверх, ибо подразумевается что сразу неизвестно какие пиксели у пяти объектов будут пересекаться. Как на настоящем холсте будто-бы.

После микса как-то так получается


 
Andrey Barinov:

я рисую слоями, в соответствии с порядком (типа zorder), снизу вверх, ибо подразумевается что сразу неизвестно какие пиксели у пяти объектов будут пересекаться. Как на настоящем холсте будто-бы.

После микса как-то так получается

Отлично! Используете доработанный CCanvas или полностью свое решение? Какой подход выгоднее в долгосроке?

 
fxsaber:

Отлично! Используете доработанный CCanvas или полностью свое решение? Какой подход выгоднее в долгосроке?


Пришлось писать свое, но со значительными заимствованиями кусков кода из стандартной библиотеки (алгоритмы рисования примитивов, сглаживания и т.д). Впихнуть куски кода в свой концепт работы с графикой оказалось проще чем оборачивать свой концепт вокруг стандартной библиотеки.

Я был бы не против использовать стандартную библиотеку, если бы она была "живая", но пока она для ГУИ не приспособлена никак.

 
Andrey Barinov:

Пришлось писать свое, но со значительными заимствованиями кусков кода из стандартной библиотеки (алгоритмы рисования примитивов, сглаживания и т.д). Впихнуть куски кода в свой концепт работы с графикой оказалось проще чем оборачивать свой концепт вокруг стандартной библиотеки.

Я был бы не против использовать стандартную библиотеку, если бы она была "живая", но пока она для ГУИ не приспособлена никак.

Ясно теперь, спасибо.

 
Баг языка
#include <Expert\ExpertSignal.mqh>

void OnStart()
{
  CIndicator* a = NULL;   
  CExpertSignal b;
       
  b.InitIndicators(a); // 'InitIndicators' - no one of the overloads can be applied to the function call
}