Erros, bugs, perguntas - página 2063

 
Existem dois objectos bmp com canais de transparência. Quando se sobrepõem, são geradas algumas uint-colours. Como posso eu próprio calcular estes valores se conheço as cores uint dos pixels sobrepostos de cada objecto?
 
fxsaber:
Existem dois objectos bmp com canais de transparência. Quando se sobrepõem, são geradas algumas uint-colours. Como posso eu próprio calcular estes valores se conheço as cores uint dos pixels sobrepostos de cada objecto?

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:

Obrigado! Outra questão. Se, por exemplo, cinco objectos se sobrepõem ao mesmo tempo, os pares (top/bottom) devem ser feitos bottom-up ou top-down?

 
fxsaber:

Obrigado!


Melhor desenhar todos os objectos (bmp) na mesma tela de uma só vez, é uma abordagem mais simples a longo prazo.

 
Andrey Barinov:

É melhor desenhar todos os objectos (bmp) de uma só vez numa tela, é uma abordagem mais simples a longo prazo.

É por isso que estou a perguntar. Acima é outra questão.

 
fxsaber:

Obrigado! Outra questão. Se, por exemplo, cinco objectos se sobrepõem, os pares (topo/baixo) devem ser desenhados de baixo para cima ou de cima para baixo?


Tenho de desenhar em camadas, por ordem (zorder), de baixo para cima, porque tenho de assumir que não sei quais os pixéis dos cinco objectos que se irão intersectar. Como se estivesse numa tela real.

Após a mistura, parece assim


 
Andrey Barinov:

Desenho em camadas, de acordo com a ordem (como zorder), de baixo para cima, porque não é imediatamente claro quais os pixels dos cinco objectos que se sobreporão. Como se estivesse numa tela real.

Depois de o misturar, obtém-se algo do género.

Isso é óptimo! Está a utilizar o CCanvas ou é tudo solução sua? Que abordagem é melhor a longo prazo?

 
fxsaber:

Óptimo! Está a usar uma CCanvas refinada ou uma solução completamente sua? Que abordagem é melhor a longo prazo?


Tive de escrever o meu próprio, mas com trechos de código significativos emprestados da biblioteca padrão (algoritmos de desenho primitivo, anti-aliasing, etc.). A incorporação de peças de código no meu conceito de trabalhar com gráficos acabou por ser mais fácil do que envolver o meu conceito em torno da biblioteca padrão.

Não me importaria de usar a biblioteca padrão se fosse "ao vivo", mas até agora não está adaptada à GUI de forma alguma.

 
Andrey Barinov:

Tive de escrever o meu próprio, mas com um empréstimo significativo de peças de código da biblioteca padrão (algoritmos de desenho primitivo, anti-aliasing, etc.). A incorporação de peças de código no meu conceito de trabalhar com gráficos acabou por ser mais fácil do que envolver o meu conceito em torno da biblioteca padrão.

Não me importaria de usar a biblioteca padrão, se fosse "ao vivo", mas até agora não está adaptada à GUI de forma alguma.

Vejo agora, obrigado.

 
Insecto linguístico
#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
}