Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. //-----------------------------------------------------------------------------
  2. // Debug Tools                                                          // [NS]
  3. //-----------------------------------------------------------------------------
  4.  
  5. #include "std.h"                        // <windows.h> LRESULT
  6. #include "emul.h"
  7. #include "vars.h"                       // comp.****
  8.  
  9.  
  10.  
  11. #include "debug_tools.h"
  12.  
  13. #include "draw.h"       // PALETTEENTRY pal0[0x100];    // unreal palette
  14.  
  15.  
  16.  
  17. //TEST 2 del!!!!!!!!!!
  18. //#include "sndrender/sndrender.h"
  19.  
  20.  
  21. // АААГХТУНГХЪ!!!!
  22. // венда шлет сообщения обработчику сообщений
  23. // еще до того как проихойдет присвоение hwnd !!!!
  24. // hwnd = CreateWindow(xxx);
  25.  
  26. //before CreateWindow()
  27. //        WM_GETMINMAXINFO
  28. //        WM_NCCREATE
  29. //        WM_NCCALCSIZE
  30. //        WM_CREATE
  31. //after CreateWindow()
  32.  
  33. // на момент WM_CREATE
  34. // debug_tool_hwnd[n] содержит левый мусор!!!!
  35.  
  36.  
  37.  
  38. // должны быть в той же последовательности что и enum !!!!
  39.  
  40.  
  41.  
  42. // компактный вариант
  43. // но сыпет варнинги про бидабида с++ исаиса низянизя так
  44. char *debug_tool_window_names_array[] =
  45. {
  46.     "Wrong Debug Tool",          
  47.     "comp_pal - Ula Plus Palette",
  48.     "atm3_pal - ATM//DDp Palette",
  49.     "pal0 - Unreal Palette",      
  50.     "Test Debug Tool"            
  51. };
  52.  
  53. /*
  54. // каждая строка занимает 40 блджд байт!
  55. // но не сыпет варнинги
  56. char debug_tool_window_names_array[][40] =     
  57. {
  58.  
  59.     { "Wrong Debug Tool",               },
  60.     { "comp_pal - Ula Plus Palette",    },
  61.     { "atm3_pal - ATM//DDp Palette",    },
  62.     { "pal0 - Unreal Palette",          },
  63.     { "Test Debug Tool"                 }
  64.  
  65. };
  66. */
  67. //=============================================================================
  68.  
  69.  
  70.  
  71.  
  72. //    bool debug_tool_create;   // костыль
  73.  
  74.  
  75.     int debug_tool_create_nmb;  // номер создаваемого окна
  76.                                 // если за каким то хреном
  77.                                 // какаянибудь вин15 начнет слать сообщения
  78.                                 // паралельна со следующим CreateWindow
  79.                                 // то наступит кирдык...
  80.                                 // нужно придумывать другие способы
  81.                                 // передачи параметров WM_CREATE-у
  82.                                 // и чего сразу нельзя было сделать оно нормалльно?
  83.                                 //      вангую что если передать
  84.                                 //      ту ссылку на структуру в структуре
  85.                                 //      в которую закидывать параметры то...
  86.                                 //      это будет равносильно такой же передаче..
  87.                                 //      разве что завести 256 структур
  88.                                
  89. #define DEBUG_TOOLS_MAX_COUNT   256
  90.  
  91.     HWND debug_tool_hwnd[ DEBUG_TOOLS_MAX_COUNT];
  92.     int debug_tool_type[ DEBUG_TOOLS_MAX_COUNT];
  93.     bool debug_tool_exist[ DEBUG_TOOLS_MAX_COUNT];      // 1 - флаг включенности
  94.     bool debug_tool_delete[ DEBUG_TOOLS_MAX_COUNT];     // 1 - на удаление
  95.    
  96.    
  97.     int debug_tool_x[ DEBUG_TOOLS_MAX_COUNT];
  98.     int debug_tool_y[ DEBUG_TOOLS_MAX_COUNT];
  99.     int debug_tool_Mode[ DEBUG_TOOLS_MAX_COUNT];
  100.     bool debug_tool_Captured[ DEBUG_TOOLS_MAX_COUNT];
  101.  
  102.        
  103.        
  104.        
  105.          // [NS] test
  106. //HWND hwnd_debug_tool;
  107. //HWND hwnd_debug_tool_2;
  108.  
  109.  
  110.  
  111.  
  112.  
  113.     HBITMAP hbitmap_buffer[ DEBUG_TOOLS_MAX_COUNT];
  114.     int *buffer_addr[ DEBUG_TOOLS_MAX_COUNT];
  115.     BITMAPINFO bmi[ DEBUG_TOOLS_MAX_COUNT];
  116.  
  117.  
  118.  
  119.  
  120.  
  121. //=============================================================================
  122. void run_debug_tool( int tool_type)
  123. {
  124.         // перед созданием окна нужно
  125.         // удалить hwnd-ы закрытых окон
  126.         // найти пустой "слот"
  127.         // и туда создать новый hwnd
  128.        
  129.     printf("tool_type %d\n",tool_type);
  130.    
  131.     int cnt = 0;
  132.     //-------------------------------------------------------------------------
  133.     // удаление завершенных слотов
  134.     for (cnt = 0;    cnt < DEBUG_TOOLS_MAX_COUNT;    cnt++)
  135.     {
  136.         //---------------------------------------------------------------------
  137.         if (debug_tool_delete[ cnt])
  138.         {
  139.             debug_tool_exist[ cnt] = FALSE;     // удаляем
  140.             debug_tool_delete[ cnt] = FALSE;    // можно снова удалять
  141.         }
  142.         //---------------------------------------------------------------------
  143.     }
  144.     //-------------------------------------------------------------------------
  145.     cnt = 0;
  146.     //-------------------------------------------------------------------------
  147.     // ищем пустой слот
  148.     while (cnt < DEBUG_TOOLS_MAX_COUNT)
  149.     {
  150.         //-------------------------------------------------------------------------
  151.         if (!(debug_tool_exist[ cnt]))
  152.         {
  153.             debug_tool_exist[ cnt] = TRUE;      // забиваем пустой слот
  154.             goto free_slot_found;
  155.         }
  156.         //---------------------------------------------------------------------
  157.     cnt++;
  158.     }
  159. //-----------------------------------------------------------------------------
  160. free_slot_not_found:
  161.     printf("free debug tool slots not found\n");
  162.     return;
  163. //-----------------------------------------------------------------------------
  164. free_slot_found:
  165.     printf("free slot %d\n",cnt);
  166.     //-------------------------------------------------------------------------
  167.     debug_tool_create_nmb = cnt;
  168.     debug_tool_type[ cnt] = tool_type;  //1;
  169.     debug_tool_hwnd[ cnt] = CreateWindowEx(     WS_EX_NOPARENTNOTIFY,
  170.                                                 //WS_EX_NOPARENTNOTIFY,// |
  171.                                                 //  WS_EX_PALETTEWINDOW,
  172.                                                 "Debug_Tool",                           // window class name
  173.                                                 debug_tool_window_names_array[ tool_type],      // "Debug_Tool_Window", // window caption
  174.                                                 WS_OVERLAPPEDWINDOW,                    // window style
  175.                                                 CW_USEDEFAULT,                          // initial x position
  176.                                                 CW_USEDEFAULT,                          // initial y position
  177.                                                 320,                                    // initial x size
  178.                                                 320,                                    // initial y size
  179.                                                 NULL,                                   // parent window handle
  180.                                                 NULL,                                   // window menu handle
  181.                                                 GetModuleHandle(nullptr),               // program instance handle
  182.                                                 NULL                                    // creation parameters
  183.                                        );
  184.     ShowWindow( debug_tool_hwnd[cnt], SW_SHOWNORMAL);   //SW_SHOWMINNOACTIVE
  185.     UpdateWindow( debug_tool_hwnd[cnt]);
  186.        
  187.     return;
  188. }
  189. //=============================================================================
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206. //=============================================================================
  207. void test_viewer_init( HWND dbg_hwnd, int current_wind)
  208. {
  209.     buffer_addr[ current_wind] = (int*)malloc( 256 * 256 * 4 * sizeof(char));
  210.     ZeroMemory( &bmi[ current_wind], sizeof( BITMAPINFO));
  211.     bmi[ current_wind].bmiHeader.biSize = sizeof( BITMAPINFOHEADER);
  212.     bmi[ current_wind].bmiHeader.biPlanes = 1;
  213.     bmi[ current_wind].bmiHeader.biBitCount = 32;
  214.     bmi[ current_wind].bmiHeader.biCompression = BI_RGB;
  215.     bmi[ current_wind].bmiHeader.biWidth = 256;
  216.     bmi[ current_wind].bmiHeader.biHeight = -256;       //переварачиваем в нормальный людской вид где верх слева сверху   
  217.  
  218.     return;
  219. }
  220. //=============================================================================
  221. void test_viewer_destroy( HWND dbg_hwnd, int current_wind)
  222. {
  223.     // освобождение hwnd на всякий случай
  224.     // идет при создание нового окна
  225.    
  226.     free( buffer_addr[ current_wind]);          // освобождаем память
  227.     debug_tool_exist[ current_wind] = FALSE;    // отключаем отрисовку итд
  228.     debug_tool_delete[ current_wind] = TRUE;    // 1 - на удаление
  229.  
  230.     return;
  231. }
  232. //=============================================================================
  233. void test_viewer( HWND dbg_hwnd, int current_wind)
  234. {
  235.  
  236.     PAINTSTRUCT ps;
  237.     HDC hdc = BeginPaint( dbg_hwnd, &ps);  
  238.  
  239.  
  240.  
  241. //          #ifdef SND_EXTERNAL_BUFFER
  242. //              SND_EXTERNAL_BUFFER[ dstpos].sample += sample_value;
  243. //              dstpos = (dstpos + 1) & (SND_EXTERNAL_BUFFER_SIZE - 1);
  244. //          //-----------------------------------------------------------------
  245. //          #else
  246.            
  247.            
  248.     int *current_buffer_addr = buffer_addr[ current_wind];
  249.  
  250. //SNDBUFSIZE
  251.     unsigned *current_snd_addr = (unsigned*)sndplaybuf; //works
  252. //  int *current_snd_addr = (int*)sndbuf;       // очищаетсо во время перекидывания
  253.                                                 // в sndplaybuf
  254.     // printf("\r sndplaybuf %x", sndplaybuf[0]);
  255.     //-----------------------------------------------------------------
  256.     int cnt = 0;
  257.     while ((cnt < (PLAYBUFSIZE)) && (cnt < 256))
  258.     {
  259.         int ch1 = ((*current_snd_addr & 0x0000FFFF));
  260.         int ch2 = ((*current_snd_addr & 0xFFFF0000) >> 16);
  261.         //---------------------------------------------------------------------
  262.         ch1 = 0xFFFF & (ch1 + 0x8000);
  263.         ch2 = 0xFFFF & (ch2 + 0x8000);  
  264.         //---------------------------------------------------------------------
  265.         int black_cnt = (0xFFFF - ch1) / 256;
  266.         int white_cnt = (ch1) / 256;
  267.         int *draw_buffer_addr = current_buffer_addr;
  268.  
  269. //      *draw_buffer_addr = 0xFF;
  270. //      *(draw_buffer_addr+1) = 0xFF;
  271. //      *(draw_buffer_addr+2) = 0xFF;
  272.        
  273.         while (black_cnt > 0)
  274.         {
  275.             *draw_buffer_addr = 0x00FFC080;
  276.             draw_buffer_addr++;
  277.             black_cnt--;
  278.         }
  279.         while (white_cnt > 0)
  280.         {
  281.             *draw_buffer_addr = 0x00003010;
  282.             draw_buffer_addr++;
  283.             white_cnt--;
  284.         }
  285.  
  286.        
  287.  
  288.         //*current_buffer_addr = (R << 16) | (G << 8) | (B);
  289.         current_snd_addr++;
  290.         current_buffer_addr += 256;
  291.         cnt++;
  292.     }
  293.             //-----------------------------------------------------------------
  294.  
  295.             //-----------------------------------------------------------------
  296.             StretchDIBits(      hdc,    //с масштабированием
  297.                                 0,
  298.                                 0,
  299.                                 256,
  300.                                 256,
  301.                                 0,
  302.                                 0,
  303.                                 256,
  304.                                 256,
  305.                                 buffer_addr[ current_wind],
  306.                                 &bmi[ current_wind],
  307.                                 DIB_RGB_COLORS,
  308.                                 SRCCOPY
  309.                                 );
  310.             //-----------------------------------------------------------------
  311.             // защита от стирания
  312.             ExcludeClipRect(    hdc,
  313.                                 0,
  314.                                 0,
  315.                                 256,
  316.                                 256
  317.                            );
  318.             //-----------------------------------------------------------------
  319.             RECT rect;
  320.             GetClientRect( dbg_hwnd, &rect);
  321.             HBRUSH hbrush = CreateSolidBrush( RGB( 0x00, 0x00, 0x00));
  322.  
  323.             FillRect(   hdc,
  324.                         &rect,
  325.                         hbrush
  326.                      );
  327.             //-----------------------------------------------------------------
  328.  
  329.             EndPaint( dbg_hwnd, &ps);    
  330.        
  331.             DeleteObject( hbrush);
  332.     return;
  333. }
  334. //=============================================================================
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358. //=============================================================================
  359. // comp_pal viewer (ula plus подобная поллитра)
  360. //=============================================================================
  361. void comp_pal_viewer_init( HWND dbg_hwnd, int current_wind)
  362. {
  363.  
  364.     buffer_addr[ current_wind] = (int*)malloc( 16 * 16 * 4 * sizeof(char));
  365.     //-------------------------------------------------------------
  366. //    int *current_buffer_addr = buffer_addr[ current_wind];
  367. //    int cnt = 0;
  368. //    //-------------------------------------------------------------
  369. //    // заливка
  370. //    while (cnt < (16 * 16))
  371. //    {
  372. //      *current_buffer_addr = ((cnt) & 0x000000FF);
  373. //      current_buffer_addr++;
  374. //      cnt++;
  375. //    }
  376. //    //-------------------------------------------------------------
  377. //    current_buffer_addr = buffer_addr[ current_wind];
  378. //    *current_buffer_addr++ = 0x000000FF; //B
  379. //    *current_buffer_addr++ = 0x0000FF00; //G
  380. //    *current_buffer_addr++ = 0x00FF0000; //R
  381. //    *current_buffer_addr++ = 0xFF000000;
  382.  
  383. //    hbitmap_buffer[ current_wind] = CreateBitmap( 16, 16, 1, 32, buffer_addr[ current_wind]);
  384.                
  385.     ZeroMemory( &bmi[ current_wind], sizeof( BITMAPINFO));
  386.     bmi[ current_wind].bmiHeader.biSize = sizeof( BITMAPINFOHEADER);
  387.     bmi[ current_wind].bmiHeader.biPlanes = 1;
  388.     bmi[ current_wind].bmiHeader.biBitCount = 32;
  389.     bmi[ current_wind].bmiHeader.biCompression = BI_RGB;
  390.     bmi[ current_wind].bmiHeader.biWidth = 16;
  391.     bmi[ current_wind].bmiHeader.biHeight = -16;        //переварачиваем в нормальный людской вид где верх слева сверху   
  392.  
  393.     return;
  394. }
  395. //=============================================================================
  396. void comp_pal_viewer_destroy( HWND dbg_hwnd, int current_wind)
  397. {
  398.     // освобождение hwnd на всякий случай
  399.     // идет при создание нового окна
  400.    
  401.     free( buffer_addr[ current_wind]);          // освобождаем память
  402.     debug_tool_exist[ current_wind] = FALSE;    // отключаем отрисовку итд
  403.     debug_tool_delete[ current_wind] = TRUE;    // 1 - на удаление
  404.  
  405.     return;
  406. }
  407. //=============================================================================
  408. //void comp_pal_viewer( HWND dbg_hwnd, HDC hdc, int current_wind)
  409. void comp_pal_viewer( HWND dbg_hwnd, int current_wind)
  410. {
  411.  
  412. //unsigned char comp_pal[0x40]; // Формат палитры GggRrrBb (формат ULA+)
  413.  
  414.     PAINTSTRUCT ps;
  415.     HDC hdc = BeginPaint( dbg_hwnd, &ps);  
  416.          
  417. // как юзоть reinterpret_cast
  418. //frame_nmb = 0x01&(*(reinterpret_cast<unsigned char*>(0x00B9D908)));
  419.  
  420.  
  421.     int *current_buffer_addr = buffer_addr[ current_wind];
  422.  
  423.     //int *current_pal0_addr = ((reinterpret_cast<unsigned char>(pal0)));//pal0;
  424.     //-----------------------------------------------------------------
  425.     int cnt = 0;
  426.     while (cnt < (256))
  427.     {
  428.         //printf(" %d",cnt);
  429.         //GggRrrBb (формат ULA+)
  430.         int R = ((comp.comp_pal[cnt] & 0b00011100) << 3);
  431.         int G = ((comp.comp_pal[cnt] & 0b11100000));
  432.         int B = ((comp.comp_pal[cnt] & 0b00000011) << 6);
  433.        
  434.         //*current_buffer_addr = *current_pal0_addr;
  435.         *current_buffer_addr = (R << 16) | (G << 8) | (B);
  436.         //current_pal0_addr++;
  437.         current_buffer_addr++;
  438.         cnt++;
  439.     }
  440.             //printf("cnt %d\n",cnt);
  441.             //-----------------------------------------------------------------
  442.  
  443.             //-----------------------------------------------------------------
  444.             StretchDIBits(      hdc,    //с масштабированием
  445.                                 0,
  446.                                 0,
  447.                                 256,
  448.                                 256,
  449.                                 0,
  450.                                 0,
  451.                                 16,
  452.                                 16,
  453.                                 buffer_addr[ current_wind],
  454.                                 &bmi[ current_wind],
  455.                                 DIB_RGB_COLORS,
  456.                                 SRCCOPY
  457.                                 );
  458.             //-----------------------------------------------------------------
  459.             // защита от стирания
  460.             ExcludeClipRect(    hdc,
  461.                                 0,
  462.                                 0,
  463.                                 256,
  464.                                 256
  465.                            );
  466.             //-----------------------------------------------------------------
  467.             RECT rect;
  468.             GetClientRect( dbg_hwnd, &rect);
  469.             HBRUSH hbrush = CreateSolidBrush( RGB( 0x00, 0x00, 0x00));
  470.  
  471.             FillRect(   hdc,
  472.                         &rect,
  473.                         hbrush
  474.                      );
  475.             //-----------------------------------------------------------------
  476.             // DrawText - выводит на экран строку текста.
  477.  
  478. //          DrawText(   hdc,
  479. //                      "Hello, Windows 95!",
  480. //                      -1,
  481. //                      &rect,
  482. //                      DT_SINGLELINE   |
  483. //                        DT_CENTER     |
  484. //                          DT_VCENTER
  485. //                  );
  486.          
  487.  
  488.             //-----------------------------------------------------------------
  489.  
  490.             EndPaint( dbg_hwnd, &ps);    
  491.        
  492.             DeleteObject( hbrush);
  493.     return;
  494. }
  495. //=============================================================================
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502. //=============================================================================
  503. // atm3_pal viewer (ATM/DDp палитра)
  504. //=============================================================================
  505. void atm3_pal_viewer_init( HWND dbg_hwnd, int current_wind)
  506. {
  507.     buffer_addr[ current_wind] = (int*)malloc( 16 * 16 * 4 * sizeof(char));    
  508.     ZeroMemory( &bmi[ current_wind], sizeof( BITMAPINFO));
  509.     bmi[ current_wind].bmiHeader.biSize = sizeof( BITMAPINFOHEADER);
  510.     bmi[ current_wind].bmiHeader.biPlanes = 1;
  511.     bmi[ current_wind].bmiHeader.biBitCount = 32;
  512.     bmi[ current_wind].bmiHeader.biCompression = BI_RGB;
  513.     bmi[ current_wind].bmiHeader.biWidth = 16;
  514.     bmi[ current_wind].bmiHeader.biHeight = -16;        //переварачиваем в нормальный людской вид где верх слева сверху   
  515.  
  516.     return;
  517. }
  518. //=============================================================================
  519. void atm3_pal_viewer_destroy( HWND dbg_hwnd, int current_wind)
  520. {
  521.     // освобождение hwnd на всякий случай
  522.     // идет при создание нового окна
  523.    
  524.     free( buffer_addr[ current_wind]);          // освобождаем память
  525.     debug_tool_exist[ current_wind] = FALSE;    // отключаем отрисовку итд
  526.     debug_tool_delete[ current_wind] = TRUE;    // 1 - на удаление
  527.  
  528.     return;
  529. }
  530. //=============================================================================
  531. void atm3_pal_viewer( HWND dbg_hwnd, int current_wind)
  532. {
  533. //    u16 atm3_pal[0x40];       // Формат палитры %grbG11RB(low in HSB), %grbG11RB(high in LSB), inverted
  534.  
  535.  
  536.  
  537.     PAINTSTRUCT ps;
  538.     HDC hdc = BeginPaint( dbg_hwnd, &ps);  
  539.  
  540.     int *current_buffer_addr = buffer_addr[ current_wind];
  541.     //-----------------------------------------------------------------
  542.     int cnt = 0;
  543.     while (cnt < (0x40))
  544.     {
  545.    
  546. // 0x000000FF; //B
  547. // 0x0000FF00; //G
  548. // 0x00FF0000; //R
  549.  
  550.         //printf(" %d",cnt);
  551.         // Формат палитры %grbG11RB(low in HSB),
  552.         //                %grbG11RB(high in LSB), inverted
  553.         int data = comp.atm3_pal[cnt];
  554.        
  555.         //                 low     high
  556.         //                 grbG11RBgrbG11RB
  557.         int R = ((data & 0b0000000000000010) << 6) | //high
  558.         //                         *
  559.                 ((data & 0b0000000001000000)     ) |
  560.         //                          *
  561.                 ((data & 0b0000001000000000) >> 4) | //low
  562.         //                           *
  563.                 ((data & 0b0100000000000000) >> 10);
  564.         //                            *
  565.         //                 low     high
  566.         //                 grbG11RBgrbG11RB
  567.         int G = ((data & 0b0000000000010000) << 3) | //high
  568.         //                         *
  569.                 ((data & 0b0000000010000000) >> 1) |
  570.         //                          *
  571.                 ((data & 0b0001000000000000) >> 7) | //low
  572.         //                           *
  573.                 ((data & 0b1000000000000000) >> 11);
  574.         //                            *
  575.         //                 low     high
  576.         //                 grbG11RBgrbG11RB
  577.         int B = ((data & 0b0000000000000001) << 7) | //high
  578.         //                         *
  579.                 ((data & 0b0000000000100000) << 1) |
  580.         //                          *
  581.                 ((data & 0b0000000100000000) >> 3) | //low
  582.         //                           *
  583.                 ((data & 0b0010000000000000) >> 9);
  584.         //                            *
  585.  
  586.         // атм полиитра инвертирована
  587.         R ^= 0xF0;
  588.         G ^= 0xF0;
  589.         B ^= 0xF0;
  590.  
  591.  
  592.  
  593.        
  594.         //*current_buffer_addr = *current_pal0_addr;
  595.         *current_buffer_addr = (R << 16) | (G << 8) | (B);
  596.         //current_pal0_addr++;
  597.         current_buffer_addr++;
  598.         cnt++;
  599.     }
  600.  
  601.             //-----------------------------------------------------------------
  602.             StretchDIBits(      hdc,    //с масштабированием
  603.                                 0,
  604.                                 0,
  605.                                 256,
  606.                                 256,
  607.                                 0,
  608.                                 0,
  609.                                 16,
  610.                                 16,
  611.                                 buffer_addr[ current_wind],
  612.                                 &bmi[ current_wind],
  613.                                 DIB_RGB_COLORS,
  614.                                 SRCCOPY
  615.                                 );
  616.             //-----------------------------------------------------------------
  617.             // защита от стирания
  618.             ExcludeClipRect(    hdc,
  619.                                 0,
  620.                                 0,
  621.                                 256,
  622.                                 256
  623.                            );
  624.             //-----------------------------------------------------------------
  625.             RECT rect;
  626.             GetClientRect( dbg_hwnd, &rect);
  627.             HBRUSH hbrush = CreateSolidBrush( RGB( 0x00, 0x00, 0x00));
  628.  
  629.             FillRect(   hdc,
  630.                         &rect,
  631.                         hbrush
  632.                      );
  633.             //-----------------------------------------------------------------
  634.             EndPaint( dbg_hwnd, &ps);    
  635.        
  636.             DeleteObject( hbrush);
  637.     return;
  638. }
  639. //=============================================================================
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646. //=============================================================================
  647. // pal0 viewer (палитра унриала)
  648. //=============================================================================
  649. void pal0_viewer_init( HWND dbg_hwnd, int current_wind)
  650. {
  651.     buffer_addr[ current_wind] = (int*)malloc( 16 * 16 * 4 * sizeof(char));
  652.     ZeroMemory( &bmi[ current_wind], sizeof( BITMAPINFO));
  653.     bmi[ current_wind].bmiHeader.biSize = sizeof( BITMAPINFOHEADER);
  654.     bmi[ current_wind].bmiHeader.biPlanes = 1;
  655.     bmi[ current_wind].bmiHeader.biBitCount = 32;
  656.     bmi[ current_wind].bmiHeader.biCompression = BI_RGB;
  657.     bmi[ current_wind].bmiHeader.biWidth = 16;
  658.     bmi[ current_wind].bmiHeader.biHeight = -16;        //переварачиваем в нормальный людской вид где верх слева сверху   
  659.  
  660.     return;
  661. }
  662. //=============================================================================
  663. void pal0_viewer_destroy( HWND dbg_hwnd, int current_wind)
  664. {
  665.     // освобождение hwnd на всякий случай
  666.     // идет при создание нового окна
  667.    
  668.     free( buffer_addr[ current_wind]);          // освобождаем память
  669.     debug_tool_exist[ current_wind] = FALSE;    // отключаем отрисовку итд
  670.     debug_tool_delete[ current_wind] = TRUE;    // 1 - на удаление
  671.  
  672.     return;
  673. }
  674. //=============================================================================
  675. void pal0_viewer( HWND dbg_hwnd, int current_wind)
  676. {
  677.  
  678.  
  679.     PAINTSTRUCT ps;
  680.     HDC hdc = BeginPaint( dbg_hwnd, &ps);  
  681.  
  682.     int *current_buffer_addr = buffer_addr[ current_wind];
  683.  
  684.     int *current_pal0_addr = (int*)pal0;//pal0;
  685.     //-----------------------------------------------------------------
  686.     int cnt = 0;
  687.     while (cnt < (256))
  688.     {
  689.  
  690.         //int R = ((comp.comp_pal[cnt] & 0b00011100) << 3);
  691.         //int G = ((comp.comp_pal[cnt] & 0b11100000));
  692.         //int B = ((comp.comp_pal[cnt] & 0b00000011) << 6);
  693.        
  694.         *current_buffer_addr = *current_pal0_addr;
  695.         //*current_buffer_addr = (R << 16) | (G << 8) | (B);
  696.         current_pal0_addr++;
  697.         current_buffer_addr++;
  698.         cnt++;
  699.     }
  700.             //-----------------------------------------------------------------
  701.  
  702.             //-----------------------------------------------------------------
  703.             StretchDIBits(      hdc,    //с масштабированием
  704.                                 0,
  705.                                 0,
  706.                                 256,
  707.                                 256,
  708.                                 0,
  709.                                 0,
  710.                                 16,
  711.                                 16,
  712.                                 buffer_addr[ current_wind],
  713.                                 &bmi[ current_wind],
  714.                                 DIB_RGB_COLORS,
  715.                                 SRCCOPY
  716.                                 );
  717.             //-----------------------------------------------------------------
  718.             // защита от стирания
  719.             ExcludeClipRect(    hdc,
  720.                                 0,
  721.                                 0,
  722.                                 256,
  723.                                 256
  724.                            );
  725.             //-----------------------------------------------------------------
  726.             RECT rect;
  727.             GetClientRect( dbg_hwnd, &rect);
  728.             HBRUSH hbrush = CreateSolidBrush( RGB( 0x00, 0x00, 0x00));
  729.  
  730.             FillRect(   hdc,
  731.                         &rect,
  732.                         hbrush
  733.                      );
  734.             //-----------------------------------------------------------------
  735.  
  736.             EndPaint( dbg_hwnd, &ps);    
  737.        
  738.             DeleteObject( hbrush);
  739.     return;
  740. }
  741. //=============================================================================
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759. //=============================================================================
  760. // Обработчик событий сразу всех окно debug tools-ов
  761. //=============================================================================
  762. LRESULT CALLBACK WndProc_debug_tools(           HWND dbg_hwnd,
  763.                                                 UINT iMsg,
  764.                                                 WPARAM wParam,
  765.                                                 LPARAM lParam
  766.             )
  767. //-----------------------------------------------------------------------------
  768. {
  769.  
  770.     // Тут нужно по hwnd найти номер окна
  771.     // а потом загрузить все переменные
  772.     // и создать переменную с номером текущего окна    
  773.  
  774.  
  775. //    HDC hdc;
  776. //    PAINTSTRUCT ps;
  777. //    RECT rect;
  778.  
  779.     //-------------------------------------------------------------------------
  780.     // Ищем номер текущего окна
  781.     int current_wind = 0;
  782.     //-------------------------------------------------------------------------
  783.     while (current_wind < DEBUG_TOOLS_MAX_COUNT)
  784.     {
  785.         //---------------------------------------------------------------------
  786.         if (debug_tool_hwnd[ current_wind] == dbg_hwnd)
  787.         {
  788.             break;
  789.         }
  790.         //---------------------------------------------------------------------
  791.         current_wind++;
  792.     }
  793.         //system ("pause");
  794.     //-------------------------------------------------------------------------
  795.     //printf("%d\n",current_wind);
  796.     //static int x;
  797.     //static int y;
  798.     //static int Mode;
  799.     //static bool Captured;
  800.  
  801.     //-------------------------------------------------------------------------
  802.     // переменные с прямой записью а массив
  803.     // чтобы не сохранять каждую при выходе из обработчика сообщений
  804.     int *x =            &debug_tool_x[ current_wind];
  805.     int *y =            &debug_tool_y[ current_wind];
  806.     int *Mode =         &debug_tool_Mode[ current_wind];
  807.     bool *Captured =    &debug_tool_Captured[ current_wind];
  808.  
  809.     //-------------------------------------------------------------------------
  810.     // переменные которые нужно сохранять ручками
  811.     int current_debug_tool_type = debug_tool_type[ current_wind];
  812.  
  813.  
  814.  
  815.    
  816.     //-------------------------------------------------------------------------
  817.     switch (iMsg)
  818.     {
  819.         //---------------------------------------------------------------------
  820.         // АХТУНГХ!!!!!
  821.         // НА МОМЕНТ WM_CREATE
  822.         // current_wind НЕДЕЙСТВИТЕЛЕН!!!!
  823.         // есть int debug_tool_create_nmb - номер который щас создаетсо
  824.         case WM_CREATE:
  825.         {
  826.             //printf("WM_CREATE ");
  827.             current_debug_tool_type = debug_tool_type[ debug_tool_create_nmb];
  828.             current_wind = debug_tool_create_nmb;
  829.            
  830.    
  831.             //-----------------------------------------------------------------
  832.             switch (current_debug_tool_type)
  833.             {
  834.                 //-------------------------------------------------------------
  835.                 case DT_PALETTE_ATM3_PAL:
  836.                     atm3_pal_viewer_init( dbg_hwnd, current_wind);
  837.                     break;
  838.                 //-------------------------------------------------------------
  839.                 case DT_PALETTE_COMP_PAL:
  840.                     comp_pal_viewer_init( dbg_hwnd, current_wind);
  841.                     break;
  842.                 //-------------------------------------------------------------
  843.                 case DT_PALETTE_PAL0:
  844.                     pal0_viewer_init( dbg_hwnd, current_wind);
  845.                     break;
  846.                 //-------------------------------------------------------------
  847.                 case DT_TEST:
  848.                     test_viewer_init( dbg_hwnd, current_wind);
  849.                     break;
  850.                 //-------------------------------------------------------------
  851.                 default:
  852.                     printf("wrong current_debug_tool_type\n");
  853.                     test_viewer_init( dbg_hwnd, current_wind);
  854.                     break;
  855.                 //-------------------------------------------------------------
  856.             }
  857.             //-----------------------------------------------------------------
  858.            
  859.         }
  860.         //---------------------------------------------------------------------
  861.         return 0;
  862.         //---------------------------------------------------------------------
  863.         case WM_ERASEBKGND:
  864.         // стандартный обработчик рисует херню поверх
  865.         // при вытягивании окна изза границы экрана
  866.             return 0;
  867.         //---------------------------------------------------------------------
  868.         case WM_PAINT:
  869.         {
  870.             // printf("WM_PAINT ");
  871.             // PAINTSTRUCT ps;
  872.             // HDC hdc = BeginPaint( dbg_hwnd, &ps);  
  873.             // comp_pal_viewer( dbg_hwnd, hdc, current_wind);
  874.             //-----------------------------------------------------------------
  875.             switch (current_debug_tool_type)
  876.             {
  877.                 //-------------------------------------------------------------
  878.                 case DT_PALETTE_ATM3_PAL:
  879.                     atm3_pal_viewer( dbg_hwnd, current_wind);
  880.                     break;
  881.                 //-------------------------------------------------------------
  882.                 case DT_PALETTE_COMP_PAL:
  883.                     comp_pal_viewer( dbg_hwnd, current_wind);
  884.                     break;
  885.                 //-------------------------------------------------------------
  886.                 case DT_PALETTE_PAL0:
  887.                     pal0_viewer( dbg_hwnd, current_wind);
  888.                     break;
  889.                 //-------------------------------------------------------------
  890.                 case DT_TEST:
  891.                     test_viewer( dbg_hwnd, current_wind);
  892.                     break;
  893.                 //-------------------------------------------------------------
  894.                 default:
  895.                     test_viewer( dbg_hwnd, current_wind);
  896.                     break;                         
  897.                 //-------------------------------------------------------------
  898.             }
  899.             //-----------------------------------------------------------------
  900.            
  901.         //    EndPaint( dbg_hwnd, &ps);    
  902.            // printf("end ");
  903.         }
  904.         return 0;
  905.         //---------------------------------------------------------------------
  906. /*
  907.                 // BeginPaint - инициирует начало процесса рисования окна.
  908.                 hdc = BeginPaint(       dbg_hwnd,
  909.                                         &ps
  910.                                  );
  911.                 // GetClientRect - получает размер рабочей области окна
  912.                 GetClientRect(  dbg_hwnd,
  913.                                 &rect
  914.                               );
  915.                 // DrawText - выводит на экран строку текста.
  916.                 DrawText(       hdc,
  917.                                 "Hello, Windows 95!",
  918.                                 -1,
  919.                                 &rect,
  920.                                         DT_SINGLELINE |
  921.                                         DT_CENTER |
  922.                                         DT_VCENTER
  923.                          );
  924.                 // EndPaint - прекращает рисование окна
  925.                 EndPaint(       dbg_hwnd,
  926.                                 &ps
  927.                          );
  928. */
  929.  
  930.        
  931.  
  932.         //---------------------------------------------------------------------
  933.         case WM_CLOSE:
  934.             printf("tool WM_CLOSE\n");
  935.             break;      //return 1;
  936.         //---------------------------------------------------------------------
  937.         case WM_DESTROY:
  938.             printf("tool WM_DESTROY\n");
  939.             // PostQuitMessage - вставляет сообщение "завершить" в очередь сообщений.
  940.             // PostQuitMessage(0);
  941.  
  942.             // Ищем номер текущего окна
  943.             current_wind = 0;
  944.             //-----------------------------------------------------------------
  945.             while (current_wind < DEBUG_TOOLS_MAX_COUNT)
  946.             {
  947.                 //-------------------------------------------------------------
  948.                 if (debug_tool_hwnd[ current_wind] == dbg_hwnd)
  949.                 {
  950.                     break;
  951.                 }
  952.                 //-------------------------------------------------------------
  953.                 current_wind++;
  954.             }
  955.             printf("destroy %d\n", current_wind);
  956.             //-----------------------------------------------------------------
  957.             switch (current_debug_tool_type)
  958.             {
  959.                 //-------------------------------------------------------------
  960.                 case DT_PALETTE_ATM3_PAL:
  961.                     atm3_pal_viewer_destroy( dbg_hwnd, current_wind);
  962.                     break;
  963.                 //-------------------------------------------------------------
  964.                 case DT_PALETTE_COMP_PAL:
  965.                     comp_pal_viewer_destroy( dbg_hwnd, current_wind);
  966.                     break;
  967.                 //-------------------------------------------------------------
  968.                 case DT_PALETTE_PAL0:
  969.                     pal0_viewer_destroy( dbg_hwnd, current_wind);
  970.                     break;
  971.                 //-------------------------------------------------------------
  972.                 case DT_TEST:
  973.                     test_viewer_destroy( dbg_hwnd, current_wind);
  974.                     break;
  975.                 //-------------------------------------------------------------
  976.                 default:
  977.                     test_viewer_destroy( dbg_hwnd, current_wind);
  978.                     break;                         
  979.                 //-------------------------------------------------------------
  980.             }
  981.             //-----------------------------------------------------------------
  982.             break; //return 0;
  983.         //---------------------------------------------------------------------
  984.         case WM_LBUTTONDOWN:   
  985.         {
  986.             //printf("WM_LBUTTONDOWN\n");
  987.             POINT point =
  988.             {
  989.                 GET_X_LPARAM(lParam),
  990.                 GET_Y_LPARAM(lParam)
  991.             };
  992.             ClientToScreen( dbg_hwnd, &point);
  993.             *x = point.x;
  994.             *y = point.y;
  995.             *Mode = SC_MOVE;
  996.             SetCapture( dbg_hwnd);
  997.             *Captured = TRUE;
  998.         }
  999.         return 0;
  1000.         //---------------------------------------------------------------------
  1001.         case WM_MOVE:
  1002.             //printf("WM_MOVE\n");
  1003.             return 0;
  1004.         //---------------------------------------------------------------------
  1005.    
  1006.    
  1007.    
  1008.    
  1009.         //---------------------------------------------------------------------
  1010.         case WM_MOUSEMOVE:
  1011.         case WM_NCMOUSEMOVE:
  1012.         {
  1013.             //printf("WM_MOUSEMOVE\n");
  1014.             //-----------------------------------------------------------------
  1015.             if (*Captured)
  1016.             {
  1017.                 //-------------------------------------------------------------
  1018.                 // кастомная обработка события перемещения
  1019.                 // тк обработчик венды останавливает всё на время cmd == SC_MOVE ?
  1020.                 if (*Mode == SC_MOVE)
  1021.                 {
  1022.                     //printf("moviiiing\n");
  1023.                     POINT p =
  1024.                     {
  1025.                         GET_X_LPARAM( lParam),
  1026.                         GET_Y_LPARAM( lParam)
  1027.                     };
  1028.                     ClientToScreen( dbg_hwnd, &p);
  1029. //                  printf("nx=%d,ny=%d\n", p.x, p.y);
  1030.                     int dx = p.x - *x;
  1031.                     int dy = p.y - *y;
  1032. //                  printf("dx=%d,dy=%d\n", dx, dy);
  1033.                     //---------------------------------------------------------
  1034.                     if ((dx == 0) && (dy == 0))
  1035.                     {
  1036.                         return 0;
  1037.                         //goto window_not_moving;
  1038.                     }
  1039.                     //---------------------------------------------------------
  1040.                     RECT r = {};
  1041.                     GetWindowRect( dbg_hwnd, &r);
  1042.  
  1043.                     // кастомная обработка события перемещения
  1044.                     // дикая мигалка (была)
  1045.                     SetWindowPos(       dbg_hwnd,
  1046.                                         nullptr,
  1047.                                         (r.left + dx),
  1048.                                         (r.top + dy),
  1049.                                         0,
  1050.                                         0,
  1051.                                         SWP_NOOWNERZORDER       |
  1052.                                          SWP_NOZORDER           |
  1053.                                           SWP_NOSIZE            |
  1054.                                            SWP_NOSENDCHANGING
  1055.                             );
  1056.  
  1057.                     *x = p.x;
  1058.                     *y = p.y;
  1059.                     return 0;
  1060.                 }
  1061.                 //-------------------------------------------------------------
  1062.             }
  1063.             //-----------------------------------------------------------------
  1064.         }
  1065.         return 0;
  1066.         //---------------------------------------------------------------------
  1067.         case WM_LBUTTONUP:
  1068.         case WM_NCLBUTTONUP:
  1069.  
  1070.             //printf("WM_LBUTTONUP\n");
  1071.             *Captured = FALSE;
  1072.             ReleaseCapture();
  1073.             return 0;
  1074.         //---------------------------------------------------------------------
  1075.    
  1076.        
  1077.        
  1078.        
  1079.        
  1080.        
  1081.        
  1082.        
  1083.        
  1084.        
  1085.        
  1086.        
  1087.        
  1088.        
  1089.         case WM_SYSCOMMAND:
  1090.         {
  1091. //       printf("WM_SYSCOMMAND(0x%X), w=%X, l=%X\n", uMessage, wparam, lparam);
  1092. // Кодирование сторон рамки окна для SC_SIZE (код угла получается суммированием кодов смежных сторон)
  1093. //     4           5
  1094. //      \ ___3___ /
  1095. //       |       |
  1096. //       1       2
  1097. //       |_______|
  1098. //      /    6    \
  1099. //     7           8
  1100.  
  1101.  
  1102.        
  1103.        ULONG Cmd = (wParam & 0xFFF0);
  1104.        ULONG BrdSide = (wParam & 0xF);
  1105.  
  1106.        if (Cmd == SC_MOVE)
  1107.        {
  1108.            //printf("SC_MOVE\n");
  1109.            *x = GET_X_LPARAM( lParam);
  1110.            *y = GET_Y_LPARAM( lParam);
  1111.            SetCapture( dbg_hwnd);       //hwnd_debug_tool);
  1112.            *Captured = TRUE;
  1113.            *Mode = SC_MOVE;
  1114.            return 0;
  1115.        }
  1116.        
  1117.        }
  1118.        
  1119.        
  1120.  
  1121.        
  1122.        
  1123.        
  1124.        
  1125.  
  1126.        
  1127.        
  1128.        /*
  1129.        else if (Cmd == SC_SIZE)
  1130.        {
  1131.            *Mode = SC_SIZE;
  1132.                 //printf ("(Cmd == SC_SIZE)\n");
  1133.            RECT rcWindow;
  1134.            GetWindowRect(dbg_hwnd, &rcWindow);
  1135.            RECT rcClient;
  1136.            GetClientRect(dbg_hwnd, &rcClient);
  1137.            RECT rcDesktop;
  1138.            GetWindowRect(GetDesktopWindow(), &rcDesktop);
  1139.  
  1140.            Msd.cmd = int(BrdSide);
  1141.            CopyRect(&Msd.rcDragCursor, &rcWindow);
  1142.            LONG cw = rcClient.right - rcClient.left, ch = rcClient.bottom - rcClient.top;
  1143.            LONG ww = rcWindow.right - rcWindow.left, wh = rcWindow.bottom - rcWindow.top;
  1144.            LONG dw = rcDesktop.right - rcDesktop.left, dh = rcDesktop.bottom - rcDesktop.top;
  1145.            Msd.ptMinTrack = { LONG(temp.ox) + (ww - cw), LONG(temp.oy) + (wh - ch) };
  1146.            Msd.ptMaxTrack = { dw, dh };
  1147.  
  1148.            SetCapture(dbg_hwnd);
  1149.            *Captured = true;
  1150.            SizeRect(&Msd, ULONG(lparam));
  1151.            return 0;
  1152.        }
  1153.        */
  1154.                
  1155.                
  1156.                
  1157.                
  1158.                
  1159.     } //switch(iMsg)
  1160.     //-------------------------------------------------------------------------
  1161.    
  1162.    
  1163.     return DefWindowProc(       dbg_hwnd,
  1164.                                 iMsg,
  1165.                                 wParam,
  1166.                                 lParam
  1167.                          );
  1168. }
  1169.  
  1170.