Making a crowdsourced project on Canvas - page 16

 
Реter Konow:

You are exaggerating a little in the following way:

...

Understand, redrawing is rewriting values in an array, and if you have to rewrite 1000000 values (the approximate number of pixels in the window image and in the bitmap), it won't be "thousandths of a second", but seconds.

I'm not exaggerating and will understand why. Look at my examples, in this thread, there in motion FPS is around 30-40 fps. Frames, Carl!

And each frame differs from the other not by 100 pixels, but by 70-80% of the working area. I'm not saying that with the size of the screen resolution this FPS doesn't decrease. It does. On a 1980x1050 screen when moving large areas to 12-17.

And yes. I'm using caching everywhere, and some optimizations in finding areas with outdated cache (looking for dirty areas). But it's a common practice, don't think you'll open anyone's eyes.

 
Igor Volodin:

I'm not exaggerating and I'll see why. Look at my examples, in this thread, there in motion FPS is around 30-40 fps. Frames, Carl!

And each frame differs from the other not by 100 pixels, but by 70-80% of the working area. I'm not saying that with the size of the screen resolution this FPS doesn't decrease. It does. On a 1980x1050 screen when moving large areas to 12-17.

And yes. I'm using caching everywhere, and some optimizations in finding areas with outdated cache (finding dirty areas). But it's a common practice, don't think you'll open anyone's eyes.

Do you store the digital mask in memory after sending the array with the image to ResoourceCreate()?

If so, it's clear why you don't have lags. I haven't implemented it yet. That is, in my implementation the image mask is not saved. Therefore, to change any part of a window, I have to recreate the whole window in an array. This causes a bottleneck.

The next step is to build a system for saving digital masks and work efficiently with specific areas. After that, element response to interface events will not be slowed down.

 
Реter Konow:

1. the longer it takes (approximately 250 milliseconds to 2 seconds).

wow, what figures.


There shouldn't be any lag at all on full screen.

What are you drawing there?

---

if you're using CCanvas - check the destructor - you probably aren't doing ResourceFree.

This is the main cause of resource braking. Constant creation without releasing.

 
Реter Konow:

Do you store the numeric mask in memory after sending the image array to ResoourceCreate()?

Did you come up with the term "digital mask" yourself? Yandex gives me virtual reality helmets ). Yes, caching in arrays. Personally, I've gone to great lengths to optimize the alpha channel option, as I wanted to get the most out of it. A lot gets eaten up by "manually" blending pixels to make transparent elements. Without the alpha channel calculation, the interface flies even several times faster.

 
Igor Volodin:

Did you come up with the term "digital mask" yourself? Yandex gives me virtual reality helmets ). Yes, caching in arrays. Personally, I've gone to great lengths to optimize the alpha channel option, as I wanted to get the most out of it. A lot gets eaten up by "manually" blending pixels to make transparent elements. Without the alpha channel calculation, the interface flies even several times faster.

Yes, I came up with the term myself, but I can change it to something more convenient if you suggest it. )

What I mean is, the image is converted into numbers representing the colours (already after the alpha channel has been calculated), which are stored in an array. This array is sent to ResourceCreate(), and the image is created.

I haven't tried to optimise the alpha channel, but it's an interesting idea... I have all objects drawn after the alpha channel calculation so there is an idea to make it possible to change the transparency of the interface windows. In the future, I think this could be implemented. The only thing that gets in the way are the input fields, which are created by "normal" objects and therefore don't change the transparency... But this too can be solved.

I see the solution to the stall on interface events, first of all, in storing images in arrays and orienting them in their areas.

 
o_O:

Wow, what numbers.


There shouldn't be any brakes at all on full screen.

What are you drawing there?

---

if you're using CCanvas - check the destructor - you're probably not doing ResourceFree.

This is the main reason for the resource slowdown. Constant creation without release.

I'll definitely try ResourceFree(), but I don't think this is the problem. (I draw settings windows with controls. I don't use Kanvas unfortunately - different approach).

The thing is, if I create small settings window, with few checkboxes, visually they react instantly, however if I create bigger window (~700x500 pixels or more), then overall speed of reaction to interface events drops many times.

Analyzing the problem, I came to the conclusion that it's about re-initializing the array and re-calculating colours of all the pixels on each interface event. After all, the function calculates around 700*500 values and initializes the array. The array initialization itself also takes time. But if you save the image and change only pixel colour values that belong to a certain element, the reaction time will depend on the area of this element...

This seems to me to be the problem.

 
Реter Konow:

Analyzing the problem, I came to the conclusion that it's about re-initializing the array and re-calculating the colours of all the pixels at each interface event. After all, the function calculates around 700*500 values and initializes the array.

show the code.
 
o_O :
show the code.
This block of code is a set of functions directly responsible for creating a digital "snapshot" of the window and its elements.

The "Draw_element()" function creates all the details of the window image. First, it creates an image array (which is kind of like a common drawing canvas) and draws all the components on it (digitally).

To draw each type of component, a special function is called, designed to draw this particular type: "Draw_element_detail()", "Set_text_on_element()", "Create_gradient", "Set_label_on_element()":

I send the code in several parts, because the editor does not accept the whole.

//--------------------------------------------------
void Нарисовать_элемент( int Окно, int Канвас, int смещение_по_x = 0 , int смещение_по_y = 0 )
{ //Alert(__FUNCTION__);
int Номер_рисуемого_полотна = G_CORE[Окно][Канвас][_DROWING_CANVAS],
     Имя_полотна    = G_CORE[Окно][Канвас][_NAME],
     //-----------------------------------------------------------------
     //Тип канваса может быть _STRIP или _LABEL.
     //-----------------------------------------------------------------
     Тип_канваса = G_CORE[Окно][Канвас][_BITMAP_TYPE],
     //-----------------------------------------------------------------
     //Канвас может представлять из себя готовую картинку.
     //В этом случае, индекс этой картинки будет прописан в свойствах канваса.
     //(например картинка ползунка слайдера - самостоятельный канвас).
     //-----------------------------------------------------------------
     Индекс_лейбла_канваса = G_CORE[Окно][Канвас][_OBJECTS_BITMAP_INDEX],
     //-----------------------------------------------------------------
     //Текущее состояние канваса. Берем из свойства _CURRENT_STATE.
     //-----------------------------------------------------------------
     Текущее_состояние_канваса = G_CORE[Окно][Канвас][_CURRENT_SCENE],
     //-----------------------------------------------------------------
    
     //-----------
     Состояние_детали,
     Индекс_лейбла,
     //------------------------------
     Высота_полотна      =   G_CORE[Окно][Канвас][_Y_SIZE],
     Ширина_полотна      =   G_CORE[Окно][Канвас][_X_SIZE],
     //------------------------------
     Массив_пикселей_полотна[],
     //------------------------------
     Размер_массива_пикселей_полотна = Высота_полотна * Ширина_полотна;  
     //----------------------------------------------------------    
//Alert("Имя_элемента  ",Имя_элемента,"  Окно  ",Окно,"  Объект  ",Объект);
   //------------------------------------------------------------
   int w;
//-------------------------------------------------------------
//Устанавливаем размеры массива основания элемента управления.
//Все детали этого элемента будут рисоваться на этом основании.
//Для прорисовки деталей элемента управления, будут вызываться
//функции (установать лейбл, установить текст и т.д...), и в каждую
//из них будет посылаться один и тот же массив пикселей элемента,
//размер которого мы сейчас устанавливаем. Детали будут рисоваться
//в том же массиве, уже поверх прежде нарисованных. На конечном этапе,
//будет вызываться функция "создать ресурс", и картинка элемента
//управления будет создана.
//-------------------------------------------------------------
ArrayResize (Массив_пикселей_полотна,Размер_массива_пикселей_полотна);
//-------------------------------------------------------------
//Создание основания самого элемента.  
//----------------------------------------------------------------------  
Установить_цвет_и_прозрачность_пикселей_изображения(Окно,Канвас,Текущее_состояние_канваса);
//---------------------------------------
switch (Тип_канваса)
   {
     case _STRIP: Нарисовать_деталь_элемента(Окно,Канвас,Канвас,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна); break ;
     //-------------------------------------------------------------------------------------------------------------  
     case _LABEL:   if (Индекс_лейбла_канваса)
                    {
                     Установить_свойства_лейбла(Окно,Канвас,Индекс_лейбла_канваса,Текущее_состояние_канваса);
                     Установить_лейбл_на_Элемент(Окно,Канвас,Канвас,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Индекс_лейбла_канваса);
                    }
                                                                                                                                                                 break ;
     //-------------------------------------------------------------------------------------------------------------  
    
   }

//-------------------------------------------------------------
//Alert("Размер_массива_пикселей_элемента   ",Размер_массива_пикселей_элемента);
//-------------------------------------
//Установить_цвет_и_прозрачность_пикселей_изображения(Состояние_детали);
//--------------------------------------------------------------------------
//Делаем цикл по всем деталям элемента, и даже тем, которые находятся в списке
//объектов выше самого элемента. Поэтому цикл начинаем с начала списка объектов
//окна и идем в цикле до конца списка. Создаем все детали элемента, без относительно
//того, находятся ли они в последовательности или нет. При этом, обходим вторичное создание
//основания элемента с помощью условия.
//--------------------------------------------------------------------------
for ( int Деталь_полотна = 1 ; Деталь_полотна < 500 ; Деталь_полотна++)
   {
     if (!G_CORE[Окно][Деталь_полотна][_NAME]){ break ;}  
     //---------------------------------------
     int     Номер_полотна_которому_принадлежит_деталь   = G_CORE[Окно][Деталь_полотна][_DROWING_CANVAS];
     int     Тип_объекта_детали = G_CORE[Окно][Деталь_полотна][_OBJ_TYPE];
   // Alert("Деталь_полотна   ",Деталь_полотна,"   Номер_элемента_которому_принадлежит_деталь  ",Номер_элемента_которому_принадлежит_деталь);
     //---------------------------------------
     if (Номер_полотна_которому_принадлежит_деталь == Канвас && Деталь_полотна != Канвас && Тип_объекта_детали == Obj_Pixel)
     { //Alert("Окно  ",Окно,"  Канвас  ",Канвас,"  Деталь_полотна  ",Деталь_полотна," _GROUP_MAIN_OBJECT ",G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT],"  Номер_рисуемого_элемента  ",Номер_рисуемого_элемента);
       //---------------------------------------
       int     Тип_детали                       =   G_CORE[Окно][Деталь_полотна][_BITMAP_TYPE];
       int     Деталь_спрятана                  =   G_CORE[Окно][Деталь_полотна][_OBJECT_HIDE];
       int     Реализация_сценария              =   G_CORE[Окно][Деталь_полотна][_OBJECT_ACTIVATED];
       int     Гланый_элемент_детали            =   G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT];        
       int     Состояние_элемента               =   G_CORE[Окно][Гланый_элемент_детали][_CURRENT_STATE];    
       //---------------------------------------
       int     Высота_элемента                  =   G_CORE[Окно][Гланый_элемент_детали][_Y_SIZE];  
       int     Ширина_элемента                  =   G_CORE[Окно][Гланый_элемент_детали][_X_SIZE];    
       //---------------------------------------
       if (!Реализация_сценария)
         {
           //----------------------------------------------------------------------
           //Определение текущего состояния объекта.
           //----------------------------------------------------------------------              
           if (!Состояние_элемента || (Состояние_элемента == _NEUTRAL_STATE || Состояние_элемента == _NEUTRAL_HIGHLIGHTED || Состояние_элемента == _NEUTRAL_BLOCKED))
            {
             if (!Состояние_элемента || Состояние_элемента == _NEUTRAL_STATE) Состояние_детали =  G_CORE[Окно][Деталь_полотна][_NEUTRAL_STATE];
             if (Состояние_элемента)Состояние_детали =  G_CORE[Окно][Деталь_полотна][Состояние_элемента];
             //-------------------------------
             Индекс_лейбла    =  G_CORE[Окно][Деталь_полотна][_OBJECTS_BITMAP_INDEX];
             w = 1 ;
            }
           //----------------------------------------------------------------------  
           if (!w && (Состояние_элемента == _ACTIVATED_STATE || Состояние_элемента == _ACTIVATED_HIGHLIGHTED || Состояние_элемента == _ACTIVATED_BLOCKED))
            {
             Состояние_детали =  G_CORE[Окно][Деталь_полотна][Состояние_элемента];
             Индекс_лейбла    =  G_CORE[Окно][Деталь_полотна][_ACTIVATED_LABEL];
            }
           //----------------------------------------------------------------------
          G_CORE[Окно][Деталь_полотна][_CURRENT_SCENE] = Состояние_детали;
          w = 0 ;
         }
       //---------------------------------------    
       if (Реализация_сценария)Состояние_детали = G_CORE[Окно][Деталь_полотна][_CURRENT_SCENE];
       //---------------------------------------    
       Установить_цвет_и_прозрачность_пикселей_изображения(Окно,Деталь_полотна,Состояние_детали);
       //---------------------------------------
       if (!Деталь_спрятана)
         {
           switch (Тип_детали)  
            {
             case _STRIP:   Нарисовать_деталь_элемента(Окно,Канвас,Деталь_полотна,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна);                       break ;
             //-------------------------------------------------------------------------------------------------------------  
             case _LABEL:   if (Индекс_лейбла)
                             {
                              Установить_свойства_лейбла(Окно,Деталь_полотна,Индекс_лейбла,Состояние_детали);
                              Установить_лейбл_на_Элемент(Окно,Канвас,Деталь_полотна,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Индекс_лейбла);
                             }
                                                                                                                                                                 break ;
             //-------------------------------------------------------------------------------------------------------------  
             case _TEXT_:   Установить_текст_на_Элемент(Окно,Канвас,Деталь_полотна, Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Состояние_детали);     break ;    
             //-------------------------------------------------------------------------------------------------------------
             case _BASE : if (G_CORE[Окно][Деталь_полотна][_GRADIENT])Нарисовать_деталь_элемента(Окно,Канвас,Деталь_полотна,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, 1 ); break ;              
            }      
         }
      }  
   }
//--------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------    
//-------------------------------------------------------------------------------------------------------------    
//Cоздаем ресурс.
//-------------------------------------------------------------------------------------------------------------    
  Создать_ресурс(Имя_полотна,Массив_пикселей_полотна,Ширина_полотна,Высота_полотна);
//-------------------------------------------------------------------------------------------------------------  
//Устанавливаем координаты элемента.
//-------------------------------------------------------------------------------------------------------------  
     if (смещение_по_x != 0 ) ObjectSetInteger ( 0 ,Имя_полотна, OBJPROP_XDISTANCE ,G_CORE[Окно][Канвас][_X] + смещение_по_x);
     if (смещение_по_y != 0 ) ObjectSetInteger ( 0 ,Имя_полотна, OBJPROP_YDISTANCE ,G_CORE[Окно][Канвас][_Y] + смещение_по_y);  
     if (смещение_по_x == 0 ) ObjectSetInteger ( 0 ,Имя_полотна, OBJPROP_XDISTANCE ,G_CORE[Окно][Канвас][_X]);
     if (смещение_по_y == 0 ) ObjectSetInteger ( 0 ,Имя_полотна, OBJPROP_YDISTANCE ,G_CORE[Окно][Канвас][_Y]);  
//-------------------------------------------------------------------------------------------------------------  

}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Нарисовать_деталь_элемента(
                                 int Окно,
                                 int Канвас,
                                 int Деталь_полотна,
                                 int &Массив_пикселей_полотна[],
                                 int Высота_полотна,
                                 int Ширина_полотна,
                                 int Нарисовать_только_градиент = 0
                               )
{
//--------------------------------------------------------------------------
int Высота_детали                 = G_CORE[Окно][Деталь_полотна][_Y_SIZE];
int Длинна_детали                 = G_CORE[Окно][Деталь_полотна][_X_SIZE];
int Отступ_X                      = G_CORE[Окно][Деталь_полотна][_X] - G_CORE[Окно][Канвас][_X];
int Отступ_Y                      = G_CORE[Окно][Деталь_полотна][_Y] - G_CORE[Окно][Канвас][_Y];
int Индекс_пикселя                = G_CORE[Окно][Деталь_полотна][_PIXEL_INDEX];
//--------------------------------------------------------------------------
int Градиент_рамки_детали         = G_CORE[Окно][Деталь_полотна][_GRADIENT];
//--------------------------------------------------------------------------
//Alert("Нарисовать_деталь_элемента - Основание:  Канвас   ",Канвас,"  Деталь_полотна  ",Деталь_полотна,"  [Деталь_полотна][_X]  ",G_CORE[Окно][Деталь_полотна][_X]);
int Номер_пикселя_элемента;
//--------------------------------------------------------------------------
//Цикл по площади основания всего элемента.
//--------------------------------------------------------------------------
if (!Нарисовать_только_градиент)
{
   for ( int Ряд = 0 ; Ряд < Высота_полотна; Ряд++)
   {
     for ( int Пиксель = 0 ; Пиксель < Ширина_полотна; Пиксель++)
      {
       if (
              Ряд >= Отступ_Y
           && Ряд < (Отступ_Y + Высота_детали)
           && Пиксель >= Отступ_X
           && Пиксель <(Отступ_X + Длинна_детали)
          )
          {
           Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB (Данные_пикселя[Индекс_пикселя][Цвет],Данные_пикселя[Индекс_пикселя][Непрозрачность]);
          }
        Номер_пикселя_элемента++;  
       }
    }
  }  
   //-----------------------------  
  Номер_пикселя_элемента = 0 ;
   //-----------------------------  
   if (Градиент_рамки_детали)
    {
     int V_раскладка = 0 ;
     int H_раскладка = 1 ;
     int Тип_градиента_рамки     = STANDART_GROUPS[Градиент_рамки_детали + 1 ];
     int Ширина_градиента_рамки  = STANDART_GROUPS[Градиент_рамки_детали + 2 ];
     int Начало_первой_рамки     =   0 ;
     //----------------------
     int Начало_второй_рамки     =  Ширина_градиента_рамки * 2 ;
     int Начало_третьей_рамки    =  Ширина_градиента_рамки * 4 ;
     int Начало_четвертой_рамки  =  Ширина_градиента_рамки * 6 ;
     int Нижний_блик = Начало_четвертой_рамки + Ширина_градиента_рамки * 2 ;
     int Верхний_блик = Нижний_блик + 2 ;
     //----------------------    
     switch (Тип_градиента_рамки)
       {
         case _4_SIDES_GRADIENT:
         //-----------------------
         //Прототип функции  
         //Создать_градиент(Раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента,Длинна_градиента,Отступ_X,Отступ_Y,Начало_градиента, Отступ_линии_от_края);
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали,Отступ_X,Отступ_Y , Начало_первой_рамки, 1 );
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X,Отступ_Y,Начало_второй_рамки, 1 );
         //Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,4,Длинна_детали - 6,Отступ_X + 4,Отступ_Y + 15, Начало_второй_рамки, -1);
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X  + Длинна_детали - Ширина_градиента_рамки,Отступ_Y,Начало_третьей_рамки,- 1 );
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали - Ширина_градиента_рамки,Отступ_X + Ширина_градиента_рамки,(Отступ_Y + Высота_детали - Ширина_градиента_рамки),Начало_четвертой_рамки,- 1 );
         //-----------------------
         break ;
         //------------------------------------------------------------------------------------------------------------------------------------------------------------------
         //------------------------------------------------------------------------------------------------------------------------------------------------------------------
         //------------------------------------------------------------------------------------------------------------------------------------------------------------------
         case _4_SIDES_GRADIENT_WITH_DOWN_RIGHT_BLICK:
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали,Отступ_X,Отступ_Y , Начало_первой_рамки, 1 );
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X,Отступ_Y,Начало_второй_рамки, 1 );
         //Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,4,Длинна_детали - 6,Отступ_X + 4,Отступ_Y + 15, Начало_второй_рамки, -1);
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X  + Длинна_детали - Ширина_градиента_рамки,Отступ_Y,Начало_третьей_рамки,- 1 );
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали - Ширина_градиента_рамки,Отступ_X + Ширина_градиента_рамки,(Отступ_Y + Высота_детали - Ширина_градиента_рамки),Начало_четвертой_рамки,- 1 );
         //-----------------------
         //-----------------------
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, 1 ,Длинна_детали,Отступ_X,(Отступ_Y + Высота_детали),Нижний_блик, 0 );
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали, 1 ,(Отступ_X  + Длинна_детали + 1 ),Отступ_Y,Нижний_блик, 0 );
         break ;
         //------------------------------------------------------------------------------------------------------------------------------------------------------------------
         //------------------------------------------------------------------------------------------------------------------------------------------------------------------
         //------------------------------------------------------------------------------------------------------------------------------------------------------------------        
         case _4_SIDES_GRADIENT_WITH_TOP_LEFT_BLICK:
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали,Отступ_X,Отступ_Y , Начало_первой_рамки, 1 );
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X,Отступ_Y,Начало_второй_рамки, 1 );
         //Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,4,Длинна_детали - 6,Отступ_X + 4,Отступ_Y + 15, Начало_второй_рамки, -1);
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали,Ширина_градиента_рамки,Отступ_X  + Длинна_детали - Ширина_градиента_рамки,Отступ_Y,Начало_третьей_рамки,- 1 );
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали - Ширина_градиента_рамки,Отступ_X + Ширина_градиента_рамки,(Отступ_Y + Высота_детали - Ширина_градиента_рамки),Начало_четвертой_рамки,- 1 );
         //-----------------------
         //-----------------------
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, 1 ,Длинна_детали + 2 ,Отступ_X,(Отступ_Y + Высота_детали),Нижний_блик, 0 );
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали + 1 , 1 ,(Отступ_X  + Длинна_детали + 1 ),Отступ_Y - 1 ,Нижний_блик, 0 );
         //-----------------------
         //-----------------------
         //-----------------------
        Создать_градиент(H_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна,Ширина_градиента_рамки,Длинна_детали + 4 ,Отступ_X - 2 ,Отступ_Y - 2 , Верхний_блик, 0 );
         //-----------------------
        Создать_градиент(V_раскладка,Градиент_рамки_детали,Массив_пикселей_полотна,Высота_полотна,Ширина_полотна, Высота_детали + 3 ,Ширина_градиента_рамки,Отступ_X - 2 ,Отступ_Y - 2 ,Верхний_блик, 0 );
         break ;
         //------------------------------------------------------------------------------------------------------------------------------------------------------------------
      
       }
    }
   //-----------------------------          
}
//--------------------------------------------------
 
//--------------------------------------------------
void Создать_градиент(
                      int Раскладка,
                      int Градиент_рамки_детали,
                      int &Массив_пикселей_полотна[],
                      int Высота_полотна,
                      int Ширина_полотна,
                      int Высота_градиента,
                      int Длинна_градиента,
                      int Отступ_X,
                      int Отступ_Y,
                      int Начало_градиента = 0,
                      int Отступ_линии_от_края = 0
                     )
{
int Номер_пикселя_элемента;
int Первый_пиксель           = Градиент_рамки_детали + 3 + Начало_градиента;
int V_раскладка = 0;
int H_раскладка = 1;

//--------------------------------------------------
int Ширина_градиента_рамки        = STANDART_GROUPS[Градиент_рамки_детали + 2];
//--------------------------------------------------
int Пиксели[],
     Альфы[],   q,
     Горизонтальная_полоса,
     Отступ_линии,
     Внутри_территории_рамки,
     Внутри_ширины_детали,
     колонка;            
//--------------------------------------------------
//Устанавливаем размеры массивов.
//--------------------------------------------------
ArrayResize(Пиксели,Ширина_градиента_рамки);
ArrayResize(Альфы,  Ширина_градиента_рамки);

if(Раскладка == V_раскладка && !Отступ_линии_от_края)Отступ_линии = Ширина_градиента_рамки;

//------------------------------------------------------------------------------  
//Инициализируем массивы цветами пикселей и значениями их непрозрачности.
//------------------------------------------------------------------------------
for(int a1 = 0; a1 <= Ширина_градиента_рамки * 2; a1 += 2)
   {
    Пиксели[q]   = STANDART_GROUPS[Первый_пиксель + a1];
    Альфы  [q]   = STANDART_GROUPS[Первый_пиксель + a1 + 1];
    q++;
   }
//--------------------------------------------------------------------------
//Цикл по площади всего окна.
//--------------------------------------------------------------------------
for(int _Ряд = 0; _Ряд < Высота_полотна; _Ряд++)
   {
    for(int _Пиксель_ряда = 0; _Пиксель_ряда < Ширина_полотна; _Пиксель_ряда++)
      {
       //----------------------------------------------------------
       //Фиксируем моменты цикла по площади рамок элемента.
       //----------------------------------------------------------
       //1. Находимся на территории верхней рамки.
       //(Между верхом и низом и между левой и правой сторонами верхней рамки.)
       //----------------------------------------------------------
       if(  
            _Ряд >= Отступ_Y && _Ряд < (Отступ_Y + Высота_градиента)
          &&(
               (Раскладка == H_раскладка  && _Пиксель_ряда >= Отступ_X + Отступ_линии && _Пиксель_ряда < (Отступ_X + Длинна_градиента) - Отступ_линии)
             ||(Раскладка == V_раскладка  && Отступ_линии_от_края >= 0 && _Пиксель_ряда >= Отступ_X && _Пиксель_ряда <= Отступ_X + Длинна_градиента - 1 && _Пиксель_ряда <= (Отступ_X + Отступ_линии))
             ||(Раскладка == V_раскладка  && Отступ_линии_от_края <  0 && _Пиксель_ряда >= Отступ_X + Отступ_линии_от_края *-1 && _Пиксель_ряда <= Отступ_X + Ширина_градиента_рамки  && _Пиксель_ряда >= Отступ_X  + Ширина_градиента_рамки + Отступ_линии)
            )
         )
         {
          //-----------------------------------
          Внутри_территории_рамки = 1;
          //-----------------------------------
          if(Раскладка == H_раскладка)Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Пиксели[Горизонтальная_полоса],Альфы[Горизонтальная_полоса]);
          if(Раскладка == V_раскладка)Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Пиксели[колонка],Альфы[колонка]);
          //-----------------------------------
        //  if( _Ряд == Отступ_Y + 20 && Раскладка == V_раскладка  && Отступ_линии_от_края >= 0 && _Пиксель_ряда >= Отступ_X                    && _Пиксель_ряда <= (Отступ_X + Отступ_линии))Alert(12345);
          колонка++;    
         }
       //-------------------------  
       Номер_пикселя_элемента++;  
       //-------------------------
      }
    //------------------------------------------------  
    if(Внутри_территории_рамки)
      {
       Горизонтальная_полоса++;
       колонка = 0;
       //---------------------------------------------------------------------------------
       //Счетчик "Отступ_линии" может иметь максимальное значение равное ширине градиента,
       //так как прибавляется только при спуске по линиям этого градиента на событии переключения ряда.
       //---------------------------------------------------------------------------------
       if(Раскладка == H_раскладка)Отступ_линии += Отступ_линии_от_края;
       //---------------------------------------------------------------------------------
       //
       //---------------------------------------------------------------------------------
       if(Раскладка == V_раскладка && _Ряд < Отступ_Y + Ширина_градиента_рамки)Отступ_линии += Отступ_линии_от_края;
       //---------------------------------------------------------------------------------
       if(Раскладка == V_раскладка && _Ряд >= Отступ_Y + Высота_градиента - Ширина_градиента_рамки - 1)Отступ_линии -= Отступ_линии_от_края;
       //---------------------------------------------------------------------------------
       if(Раскладка == V_раскладка && Отступ_линии_от_края < 0 && Отступ_линии > 0)Отступ_линии *=-1;
      }
    //------------------------------------------------
          
    //------------------------------------------------
   }
     //---------------------
    // Alert("Градиент_рамки_детали  ",Градиент_рамки_детали,"   Ширина_градиента_рамки   ",Ширина_градиента_рамки );
     //---------------------
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_текст_на_Элемент(
                                 int       Окно,
                                 int       Канвас,
                                 int       Деталь_полотна,
                                 int      &Массив_пикселей[],
                                 int       Высота_массива,
                                 int       Длинна_массива,
                                 int       Состояние_детали
                                )
{
//--------------------
//int Головной_объект_группы = G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT];

string Текст  = CONTENT[G_CORE[Окно][Деталь_полотна][_TEXT]];
//--------------------
string    Шрифт           = FONT[STANDART_GROUPS[Состояние_детали + 5]];
int       Цвет_текста     = ColorToARGB(STANDART_GROUPS[Состояние_детали + 3],STANDART_GROUPS[Состояние_детали + 4]);
int       Размер_шрифта   = STANDART_GROUPS[Состояние_детали + 6];                                
int       Угол_наклона    = STANDART_GROUPS[Состояние_детали + 7];
int       Привязка_текста = STANDART_GROUPS[Состояние_детали + 8];
int       Стиль_шрифта    = STANDART_GROUPS[Состояние_детали + 9];
//--------------------
int       Формат_цвета = COLOR_FORMAT_ARGB_NORMALIZE;
//--------------------
int Отступ_X   = G_CORE[Окно][Деталь_полотна][_X] - G_CORE[Окно][Канвас][_X];
int Отступ_Y   = G_CORE[Окно][Деталь_полотна][_Y] - G_CORE[Окно][Канвас][_Y];
//--------------------------------------------------
//Alert("Нарисовать_деталь_элемента - Текст:  Канвас   ",Канвас,"  Деталь_полотна  ",Деталь_полотна,"  [Деталь_полотна][_X]  ",G_CORE[Окно][Деталь_полотна][_X],"  Канвас][_X]   ",G_CORE[Окно][Канвас][_X]);

TextSetFont(Шрифт,Размер_шрифта *-10,Стиль_шрифта,Угол_наклона);  
//--------------------------------------------------
if(!TextOut(Текст,Отступ_X,Отступ_Y,Привязка_текста,Массив_пикселей,Длинна_массива,Высота_массива,Цвет_текста,Формат_цвета))Alert(GetLastError());
//--------------------------------------------------
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_размеры_текста(int Окно, int Объект, int Главный_объект_в_элементе, int Состояние_детали)
{
int Массив_пикселей[];
int Самая_левая_точка = 1000000,
     Самая_правая_точка,
     Самая_верхняя_точка = 1000000,
     Самая_нижняя_точка,
     Номер_пикселя;
//--------------------
string Текст  = CONTENT[G_CORE[Окно][Объект][_TEXT]];
//--------------------
string    Шрифт           = FONT[STANDART_GROUPS[Состояние_детали + 5]];
int       Цвет_текста     = ColorToARGB(STANDART_GROUPS[Состояние_детали + 3],STANDART_GROUPS[Состояние_детали + 4]);
int       Размер_шрифта   = (int)(STANDART_GROUPS[Состояние_детали + 6]);                                
int       Угол_наклона    = STANDART_GROUPS[Состояние_детали + 7];
int       Привязка_текста = STANDART_GROUPS[Состояние_детали + 8];
int       Стиль_шрифта    = STANDART_GROUPS[Состояние_детали + 9];
int       Количество_букв_текста = StringLen(Текст);

//--------------------
int       Формат_цвета = COLOR_FORMAT_ARGB_NORMALIZE;
//--------------------
int Длинна_буквы  =   Размер_шрифта;
int Высота_буквы  =   Размер_шрифта;//Alert("Высота_буквы  ",Высота_буквы,"  Самая_нижняя_точка - Самая_верхняя_точка  ",Самая_нижняя_точка - Самая_верхняя_точка);
//--------------------
int Высота_массива = Высота_буквы * 2;
int Длинна_массива = Длинна_буквы * Количество_букв_текста * 2;
//--------------------
int Размер_массива = Высота_массива * Длинна_массива;
//--------------------
ArrayResize(Массив_пикселей,Размер_массива);//Alert("Размер_массива  ",Размер_массива);
//--------------------------------------------------
// Alert("Шрифт  ",Шрифт ,"  Высота_буквы  ",Высота_буквы,"  Размер_шрифта  ",Размер_шрифта,"  Угол_наклона  ",Угол_наклона);
TextSetFont(Шрифт,Размер_шрифта *-10,Стиль_шрифта,Угол_наклона);  
//--------------------------------------------------
if(!TextOut(Текст,0,0,Привязка_текста,Массив_пикселей,Длинна_массива,Высота_массива,Цвет_текста,Формат_цвета))Alert(GetLastError());
//--------------------------------------------------
for(int Ряд = 0; Ряд < Высота_массива; Ряд++)
   {
    for(int Колонка = 0; Колонка < Длинна_массива; Колонка++)
      {
       if(Массив_пикселей[Номер_пикселя] == Цвет_текста)
         {
          //----------------------------
          if(Самая_левая_точка >= Колонка) Самая_левая_точка = Колонка;
          //----------------------------
          if(Самая_правая_точка <= Колонка)Самая_правая_точка = Колонка;
          //----------------------------
         }
       //-------------------
       Номер_пикселя++;
      }  
   }
  //Alert("Самая_верхняя_точка  ",Самая_верхняя_точка,"  Самая_нижняя_точка  ",Самая_нижняя_точка,"  Самая_левая_точка  ",Самая_левая_точка,"  Самая_правая_точка  ",Самая_правая_точка);
//-----------------------------------------
int Длинна_текста = Самая_правая_точка - Самая_левая_точка;
//-----------------------------------------
//-----------------------------------------
G_CORE[Окно][Объект][_TEXT_X_SIZE] = Длинна_текста;
//-----------------------------------------
G_CORE[Окно][Главный_объект_в_элементе][_TEXT_X_SIZE] = Длинна_текста;
//-----------------------------------------
G_CORE[Окно][Объект][_X_SIZE] = Длинна_текста;
//--------------------------------------------------
Alert("Объект   ",Объект,"  Длинна_текста  ",Длинна_текста);
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_лейбл_на_Элемент(
                                 int       Окно,
                                 int       Канвас,
                                 int       Деталь_полотна,
                                 int      &Массив_пикселей_полотна[],
                                 int       Высота_элемента,
                                 int       Ширина_элемента,
                                 int       Индекс_лейбла,
                                // int       Цвет_фона,
                                // int       Непрозрачность_фона
                                )

{
//-----------------------
// Alert(__FUNCTION__);
int Цвет_пикселя,
     Непрозрачность_пикселя,
     Объект_привязки_лейбла                    =  G_CORE[Окно][Деталь_полотна][_LABEL_BACKGROUND_OBJECT],
     Состояние_объекта_привязки                =  G_CORE[Окно][Объект_привязки_лейбла][_CURRENT_SCENE],
     Номер_пикселя_объекта_привязки            =  G_CORE[Окно][Объект_привязки_лейбла][_PIXEL_INDEX],
     Поправка = Номер_пикселя_объекта_привязки * 2,
     //--------------------------------------------
     Цвет_фона           = STANDART_GROUPS[Состояние_объекта_привязки + 3 + Поправка],
     Непрозрачность_фона = STANDART_GROUPS[Состояние_объекта_привязки + 4 + Поправка];
     //--------------------------------------------
      // Alert("Цвет_фона   ",Цвет_фона,"   Непрозрачность_фона   ",Непрозрачность_фона,"   [_B2_PARAMETER]  ",G_CORE[Окно][Деталь_полотна][_B2_PARAMETER],"  Номер_пикселя_объекта_привязки  ",Номер_пикселя_объекта_привязки);  

//-------------------------    
// int Головной_объект_группы = G_CORE[Окно][Деталь_полотна][_GROUP_MAIN_OBJECT];
//--------------------
int Отступ_X   = G_CORE[Окно][Деталь_полотна][_X] - G_CORE[Окно][Канвас][_X];
int Отступ_Y   = G_CORE[Окно][Деталь_полотна][_Y] - G_CORE[Окно][Канвас][_Y];
//--------------------------------------------------

//-------------------------------------------------------------
int Номер_пикселя_элемента;
int Пиксель_лейбла = Номер_пикселя_лейбла;
//--------------------------------------------------------
for(int Ряд = 0; Ряд < Высота_элемента; Ряд++)
    {
     for(int Пиксель = 0; Пиксель < Ширина_элемента; Пиксель++)
       {
        //------------------------------
        if(Ряд >= Отступ_Y && Ряд < (Отступ_Y + Высота_лейбла))
          {
           if(Пиксель > (Отступ_X - 1) && Пиксель < (Отступ_X) + Ширина_лейбла)
             {
              if(Тип_лейбла == _RESOURCE_LABEL)
                {
                 //---------------------------
                 if(A_CORE_BASE[Пиксель_лейбла] == -1)
                   {
                    Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Цвет_фона,Непрозрачность_фона);
                   // Alert("Цвет_фона  ",Цвет_фона,"  Непрозрачность_фона  ",Непрозрачность_фона);
                   }
                 //---------------------------
                 else Массив_пикселей_полотна[Номер_пикселя_элемента] = A_CORE_BASE[Пиксель_лейбла];
                 //---------------------------
                }
              if(Тип_лейбла == _MY_LABEL)
                {
                 if(A_CORE_BASE[Пиксель_лейбла] == 0){Цвет_пикселя = Данные_пикселя[Пиксель_0][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_0][Непрозрачность];}
                 if(A_CORE_BASE[Пиксель_лейбла] == 1){Цвет_пикселя = Данные_пикселя[Пиксель_1][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_1][Непрозрачность];}
                 if(A_CORE_BASE[Пиксель_лейбла] == 2){Цвет_пикселя = Данные_пикселя[Пиксель_2][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_2][Непрозрачность];}
                 if(A_CORE_BASE[Пиксель_лейбла] == 3){Цвет_пикселя = Данные_пикселя[Пиксель_3][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_3][Непрозрачность];}
                 if(A_CORE_BASE[Пиксель_лейбла] == 4){Цвет_пикселя = Данные_пикселя[Пиксель_4][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_4][Непрозрачность];}
                 if(A_CORE_BASE[Пиксель_лейбла] == 5){Цвет_пикселя = Данные_пикселя[Пиксель_5][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_5][Непрозрачность];}
                 if(A_CORE_BASE[Пиксель_лейбла] == 6){Цвет_пикселя = Данные_пикселя[Пиксель_6][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_6][Непрозрачность];}
                 if(A_CORE_BASE[Пиксель_лейбла] == 7){Цвет_пикселя = Данные_пикселя[Пиксель_7][Цвет];Непрозрачность_пикселя = Данные_пикселя[Пиксель_7][Непрозрачность];}
                 //-----------------------------------------------
                 if(A_CORE_BASE[Пиксель_лейбла] == -1)
                   {
                    Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Цвет_фона,Непрозрачность_фона);
                   }
                 //-----------------------------------------------
                 else Массив_пикселей_полотна[Номер_пикселя_элемента] = ColorToARGB(Цвет_пикселя,Непрозрачность_пикселя);
                }/**/
              //---------------------------                    
              Пиксель_лейбла++;
              //---------------------------
             }
          }  
         //------------------------------
         Номер_пикселя_элемента++;  
       }
     }      
}
//--------------------------------------------------
//--------------------------------------------------
void Установить_свойства_лейбла(int Окно, int Объект, int Индекс_лейбла, int Состояние_детали)
{
//-------------------------------------------------------------
//Цикл по A_CORE_BASE[] и нахождение нужного лейбла по индексу.
//-------------------------------------------------------------
for(int a1 = 0; a1 < 250000; a1++)
   {
    if(A_CORE_BASE[a1] == _DATA_SEPARATOR && A_CORE_BASE[a1 + 1] == Индекс_лейбла)
      {
       //---------------------------------------------------
       //Инициализируем основные параметры лейбла.
       //---------------------------------------------------
       Ширина_лейбла                  = A_CORE_BASE[a1 + 2];
       G_CORE[Окно][Объект][_X_SIZE]  = Ширина_лейбла;
       //--------------
       Высота_лейбла                  = A_CORE_BASE[a1 + 3];
       G_CORE[Окно][Объект][_Y_SIZE]  = Высота_лейбла;
       //--------------
       Тип_лейбла                     = A_CORE_BASE[a1 + 4];
       //---------------------------------------------------
       //Утанавливаем размер массива изображения.
       //---------------------------------------------------
       //----------------------------------
       Номер_пикселя_лейбла          = a1 + 5;
       //----------------------------------
       if(Тип_лейбла == _MY_LABEL)
         {
          Установить_цвет_и_прозрачность_пикселей_изображения(Окно,Объект,Состояние_детали);
         }
       //----------------------------------  
       break;
      }
   }  

}
//--------------------------------------------------
void Создать_ресурс(string Наименование_ресурса, int &Массив_пикселей[],int Ширина_массива, int Высота_массива, int Формат_цвета = COLOR_FORMAT_ARGB_NORMALIZE)
{

  //-------------------------------------
  Имя_ресурса = "::"+"bitmap"+ Наименование_ресурса;
  //-------------------------------------
  ObjectCreate(0,Наименование_ресурса,OBJ_BITMAP_LABEL,0,0,0);
  ObjectSetString(0,Наименование_ресурса,OBJPROP_BMPFILE,Имя_ресурса);
//-------------------------------------
if(!ResourceCreate(Имя_ресурса,Массив_пикселей,Ширина_массива,Высота_массива,0,0,0,Формат_цвета))Alert("!ResourceCreate 2  Наименование_ресурса   ",Наименование_ресурса,"  Ошибка  ",GetLastError());
//-------------------------------------                    
}
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------
void Установить_цвет_и_прозрачность_пикселей_изображения(int Окно, int Объект, int Состояние_детали)
{
//if(!G_CORE[Окно][Объект][_OBJECT_ACTIVATED])
// Alert(__FUNCTION__);
//----------------------------------------------------------
Данные_пикселя[Пиксель_0][Цвет]           = STANDART_GROUPS[Состояние_детали + 3];
Данные_пикселя[Пиксель_0][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 4];
//----------------------------------------------------------
Данные_пикселя[Пиксель_1][Цвет]           = STANDART_GROUPS[Состояние_детали + 5];
Данные_пикселя[Пиксель_1][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 6];
//----------------------------------------------------------
Данные_пикселя[Пиксель_2][Цвет]           = STANDART_GROUPS[Состояние_детали + 7];
Данные_пикселя[Пиксель_2][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 8];
//----------------------------------------------------------
Данные_пикселя[Пиксель_3][Цвет]           = STANDART_GROUPS[Состояние_детали + 9];
Данные_пикселя[Пиксель_3][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 10];
//----------------------------------------------------------
Данные_пикселя[Пиксель_4][Цвет]           = STANDART_GROUPS[Состояние_детали + 11];
Данные_пикселя[Пиксель_4][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 12];
//----------------------------------------------------------
Данные_пикселя[Пиксель_5][Цвет]           = STANDART_GROUPS[Состояние_детали + 13];
Данные_пикселя[Пиксель_5][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 14];
//----------------------------------------------------------
Данные_пикселя[Пиксель_6][Цвет]           = STANDART_GROUPS[Состояние_детали + 15];
Данные_пикселя[Пиксель_6][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 16];
//----------------------------------------------------------
Данные_пикселя[Пиксель_7][Цвет]           = STANDART_GROUPS[Состояние_детали + 17];
Данные_пикселя[Пиксель_7][Непрозрачность] = STANDART_GROUPS[Состояние_детали + 18];
//----------------------------------------------------------
 

Create_resource(string Resource_name

Resource_name - how often does it change? how many resources are in memory?

Reason: