Advertisement
Guest User

Untitled

a guest
Feb 24th, 2015
256
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 24.39 KB | None
  1. /* This file has been generated by the Hex-Rays decompiler.
  2.    Copyright (c) 2007-2012 Hex-Rays <info@hex-rays.com>
  3.  
  4.    Detected compiler: GNU C++
  5. */
  6.  
  7. #include <defs.h>
  8.  
  9.  
  10. //-------------------------------------------------------------------------
  11. // Function declarations
  12.  
  13. int __fastcall scale_nn(int a1, int a2);
  14. int __fastcall grub_video_bitmap_create_scaled(int *a1, int a2, int a3, int a4);
  15. int __fastcall grub_video_bitmap_scale_proportional(int *a1, unsigned int a2, unsigned int a3, int a4, int scale_method, int selection_method, unsigned int v_align, unsigned int h_align);
  16. // int __fastcall _aeabi_uidiv(_DWORD, _DWORD); weak
  17. int __fastcall grub_error(_DWORD); // weak
  18. int __fastcall grub_video_bitmap_create(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  19. int __fastcall grub_video_bitmap_destroy(_DWORD); // weak
  20.  
  21.  
  22. //----- (00000000) --------------------------------------------------------
  23. int __fastcall scale_nn(int a1, int a2)
  24. {
  25.   bool v2; // zf@1
  26.   int v3; // r4@3
  27.   int v4; // r5@3
  28.   int v5; // r7@4
  29.   int v6; // r12@5
  30.   int v7; // r0@6
  31.   int v8; // r2@7
  32.   int v9; // r6@8
  33.   int v10; // lr@9
  34.   int v11; // r1@10
  35.   int v12; // r3@11
  36.   bool v13; // zf@13
  37.   int (__fastcall *v14)(_DWORD); // r3@16
  38.   int result; // r0@16
  39.   int v16; // r9@18
  40.   int v17; // r7@18
  41.   unsigned int v18; // r6@18
  42.   unsigned int v19; // r3@19
  43.   int v20; // r2@19
  44.   int v21; // r3@19
  45.   int v22; // r8@21
  46.   int (__fastcall *v23)(_DWORD, _DWORD); // r0@21
  47.   int v24; // r10@23
  48.   int v25; // r11@23
  49.   unsigned int v26; // r5@23
  50.   int v27; // r2@26
  51.   int v28; // r4@26
  52.   int v29; // r0@26
  53.   int v30; // lr@27
  54.   int v31; // r1@27
  55.   int v32; // r2@28
  56.   int v33; // lr@29
  57.   int v34; // t1@30
  58.   int v35; // r0@36
  59.   int v36; // r12@36
  60.   int v37; // r1@36
  61.   int v38; // r3@37
  62.   int v39; // r0@37
  63.   bool v40; // cf@37
  64.   char v41; // r2@40
  65.   char v42; // r2@43
  66.   int v43; // r2@45
  67.   unsigned int v44; // r2@48
  68.   int v45; // r1@48
  69.   char v46; // t1@49
  70.   int (__fastcall *v47)(_DWORD); // r3@54
  71.   int (__fastcall *v48)(_DWORD); // r3@56
  72.   int (__fastcall *v49)(_DWORD); // r3@57
  73.   bool v50; // zf@58
  74.   bool v51; // zf@62
  75.   int (__fastcall *v52)(_DWORD); // r3@72
  76.   int (__fastcall *v53)(_DWORD); // r3@73
  77.   int v54; // [sp+4h] [bp-84h]@21
  78.   int (__fastcall *v55)(_DWORD, _DWORD); // [sp+8h] [bp-80h]@21
  79.   int v56; // [sp+Ch] [bp-7Ch]@23
  80.   unsigned int ddata; // [sp+10h] [bp-78h]@18
  81.   int sw; // [sp+14h] [bp-74h]@18
  82.   int v59; // [sp+24h] [bp-64h]@21
  83.   int v60; // [sp+28h] [bp-60h]@21
  84.   int v61; // [sp+2Ch] [bp-5Ch]@21
  85.   int comp; // [sp+30h] [bp-58h]@21
  86.   int v63; // [sp+34h] [bp-54h]@21
  87.   int v64; // [sp+38h] [bp-50h]@19
  88.   int v65; // [sp+3Ch] [bp-4Ch]@19
  89.   int v66; // [sp+40h] [bp-48h]@19
  90.   unsigned int v67; // [sp+44h] [bp-44h]@21
  91.   int v68; // [sp+48h] [bp-40h]@19
  92.   unsigned int dh; // [sp+4Ch] [bp-3Ch]@18
  93.   unsigned int dy; // [sp+50h] [bp-38h]@21
  94.   int sh; // [sp+54h] [bp-34h]@18
  95.   int dstride; // [sp+58h] [bp-30h]@18
  96.   int sstride; // [sp+5Ch] [bp-2Ch]@18
  97.  
  98.   v2 = a2 == 0;
  99.   if ( a2 )
  100.     v2 = a1 == 0;
  101.   v3 = a1;
  102.   v4 = a2;
  103.   if ( v2 )
  104.   {
  105.     v49 = (int (__fastcall *)(_DWORD))&grub_error;
  106.     HIWORD(v49) = (unsigned int)&grub_error;
  107.     result = v49(38);
  108.   }
  109.   else
  110.   {
  111.     v5 = *(_DWORD *)(a1 + 40);
  112.     if ( v5 << 29
  113.       || (v6 = *(_DWORD *)(a1 + 48), v6 & 7)
  114.       || (v7 = *(_DWORD *)(a1 + 56), v7 << 29)
  115.       || (v8 = *(_DWORD *)(v3 + 64), v8 << 29) )
  116.     {
  117.       v47 = (int (__fastcall *)(_DWORD))&grub_error;
  118.       HIWORD(v47) = (unsigned int)&grub_error;
  119.       result = v47(38);
  120.     }
  121.     else
  122.     {
  123.       v9 = *(_DWORD *)(a2 + 40);
  124.       if ( v9 << 29
  125.         || (v10 = *(_DWORD *)(a2 + 48), v10 & 7)
  126.         || (v11 = *(_DWORD *)(a2 + 56), v11 << 29)
  127.         || (v12 = *(_DWORD *)(v4 + 64), v12 & 7) )
  128.       {
  129.         v48 = (int (__fastcall *)(_DWORD))&grub_error;
  130.         HIWORD(v48) = (unsigned int)&grub_error;
  131.         result = v48(38);
  132.       }
  133.       else
  134.       {
  135.         if ( v5 != v9 )
  136.           goto LABEL_77;
  137.         v13 = v6 == v10;
  138.         if ( v6 == v10 )
  139.           v13 = *(_DWORD *)(v3 + 36) == *(_DWORD *)(v4 + 36);
  140.         if ( !v13 )
  141.           goto LABEL_77;
  142.         v50 = v7 == v11;
  143.         if ( v7 == v11 )
  144.           v50 = *(_DWORD *)(v3 + 44) == *(_DWORD *)(v4 + 44);
  145.         if ( !v50 )
  146.           goto LABEL_77;
  147.         v51 = v8 == v12;
  148.         if ( v8 == v12 )
  149.           v51 = *(_DWORD *)(v3 + 52) == *(_DWORD *)(v4 + 52);
  150.         if ( v51 && *(_DWORD *)(v3 + 60) == *(_DWORD *)(v4 + 60) )
  151.         {
  152.           v18 = *(_DWORD *)(v3 + 16);
  153.           if ( v18 == *(_DWORD *)(v4 + 16) )
  154.           {
  155.             v17 = *(_DWORD *)v3;
  156.             if ( *(_DWORD *)v3 )
  157.             {
  158.               dh = *(_DWORD *)(v3 + 4);
  159.               if ( dh )
  160.               {
  161.                 sw = *(_DWORD *)v4;
  162.                 if ( *(_DWORD *)v4 )
  163.                 {
  164.                   sh = *(_DWORD *)(v4 + 4);
  165.                   if ( sh )
  166.                   {
  167.                     v16 = *(_DWORD *)(v4 + 76);
  168.                     ddata = *(_DWORD *)(v3 + 76);
  169.                     dstride = *(_DWORD *)(v3 + 20);
  170.                     sstride = *(_DWORD *)(v4 + 20);
  171. LABEL_19:
  172.                     v19 = (v18 - 4) >> 2;
  173.                     v68 = 0;
  174.                     v66 = v19 + 1;
  175.                     v20 = 4 * (v19 + 1);
  176.                     v64 = v19 - 8;
  177.                     v21 = (v19 - 8) & 0xFFFFFFF8;
  178.                     v65 = v20;
  179.                     if ( v18 - 1 <= 2 )
  180.                       v20 = 0;
  181.                     v22 = v21 + 8;
  182.                     v61 = v20 + 1;
  183.                     comp = v20;
  184.                     v54 = v20 + 2;
  185.                     dy = 0;
  186.                     v59 = ddata + v20 + 1;
  187.                     v60 = ddata + v20 + 2;
  188.                     LOWORD(v23) = (unsigned int)&_aeabi_uidiv;
  189.                     HIWORD(v23) = (unsigned int)&_aeabi_uidiv;
  190.                     v63 = ddata + v20;
  191.                     v55 = v23;
  192.                     v67 = ddata;
  193.                     while ( !v17 )
  194.                     {
  195. LABEL_51:
  196.                       v67 += dstride;
  197.                       ++dy;
  198.                       v68 += sh;
  199.                       if ( dy >= dh )
  200.                         goto LABEL_52;
  201.                     }
  202.                     v24 = 0;
  203.                     v25 = 0;
  204.                     v26 = v67;
  205.                     v56 = sstride * v55(v68, dh);
  206.                     while ( 1 )
  207.                     {
  208.                       while ( 1 )
  209.                       {
  210.                         v35 = v18 * v55(v24, v17);
  211.                         v36 = v26 - ddata;
  212.                         v37 = v35 + v56;
  213.                         if ( v18 )
  214.                           break;
  215. LABEL_35:
  216.                         ++v25;
  217.                         v26 += v18;
  218.                         v24 += sw;
  219.                         if ( v25 == v17 )
  220.                           goto LABEL_51;
  221.                       }
  222.                       v38 = v16 + v37;
  223.                       v39 = v16 + v56 + 4 + v35;
  224.                       v40 = v16 + v37 >= v26 + 4;
  225.                       if ( v16 + v37 < v26 + 4 )
  226.                         v40 = v26 >= v39;
  227.                       v41 = v40 != 0;
  228.                       if ( v18 > 9 )
  229.                         v42 = v41 & 1;
  230.                       else
  231.                         v42 = 0;
  232.                       v43 = v42 & 1;
  233.                       if ( ((unsigned __int8)v38 | (unsigned __int8)v26) & 3 )
  234.                         v43 = 0;
  235.                       v30 = v16 + v37;
  236.                       if ( v43 )
  237.                       {
  238.                         if ( v18 - 1 <= 2 )
  239.                           goto LABEL_78;
  240.                         if ( (unsigned int)v64 > 0xFFFFFFF6 )
  241.                         {
  242.                           v31 = v26;
  243.                           v32 = 0;
  244.                         }
  245.                         else
  246.                         {
  247.                           v27 = v38 + 32;
  248.                           v28 = v26 + 32;
  249.                           v29 = 0;
  250.                           do
  251.                           {
  252.                             v29 += 8;
  253.                             __pld((void *)(v27 + 84));
  254.                             v30 = v27;
  255.                             v31 = v28;
  256.                             *(_DWORD *)(v28 - 32) = *(_DWORD *)(v27 - 32);
  257.                             v27 += 32;
  258.                             v28 += 32;
  259.                             *(_DWORD *)(v28 - 60) = *(_DWORD *)(v27 - 60);
  260.                             *(_DWORD *)(v28 - 56) = *(_DWORD *)(v27 - 56);
  261.                             *(_DWORD *)(v28 - 52) = *(_DWORD *)(v27 - 52);
  262.                             *(_DWORD *)(v28 - 48) = *(_DWORD *)(v27 - 48);
  263.                             *(_DWORD *)(v28 - 44) = *(_DWORD *)(v27 - 44);
  264.                             *(_DWORD *)(v28 - 40) = *(_DWORD *)(v27 - 40);
  265.                             *(_DWORD *)(v28 - 36) = *(_DWORD *)(v27 - 36);
  266.                           }
  267.                           while ( v29 != v22 );
  268.                           v32 = v22;
  269.                         }
  270.                         v33 = v30 - 4;
  271.                         do
  272.                         {
  273.                           v34 = *(_DWORD *)(v33 + 4);
  274.                           v33 += 4;
  275.                           ++v32;
  276.                           *(_DWORD *)v31 = v34;
  277.                           v31 += 4;
  278.                         }
  279.                         while ( v32 < (unsigned int)v66 );
  280.                         if ( v18 != v65 )
  281.                         {
  282. LABEL_78:
  283.                           *(_BYTE *)(v63 + v36) = *(_BYTE *)(v38 + comp);
  284.                           if ( v61 < v18 )
  285.                           {
  286.                             *(_BYTE *)(v59 + v36) = *(_BYTE *)(v38 + v61);
  287.                             if ( v18 > v54 )
  288.                               *(_BYTE *)(v60 + v36) = *(_BYTE *)(v38 + v54);
  289.                           }
  290.                         }
  291.                         goto LABEL_35;
  292.                       }
  293.                       v44 = v26;
  294.                       v45 = v37 + v18 + v16;
  295.                       do
  296.                       {
  297.                         v46 = *(_BYTE *)v38++;
  298.                         *(_BYTE *)v44++ = v46;
  299.                       }
  300.                       while ( v38 != v45 );
  301.                       ++v25;
  302.                       v26 += v18;
  303.                       v24 += sw;
  304.                       if ( v25 == v17 )
  305.                         goto LABEL_51;
  306.                     }
  307.                   }
  308.                 }
  309.               }
  310.             }
  311.             v52 = (int (__fastcall *)(_DWORD))&grub_error;
  312.             HIWORD(v52) = (unsigned int)&grub_error;
  313.             result = v52(38);
  314.           }
  315.           else
  316.           {
  317.             v53 = (int (__fastcall *)(_DWORD))&grub_error;
  318.             HIWORD(v53) = (unsigned int)&grub_error;
  319.             result = v53(24);
  320.           }
  321.         }
  322.         else
  323.         {
  324. LABEL_77:
  325.           v14 = (int (__fastcall *)(_DWORD))&grub_error;
  326.           HIWORD(v14) = (unsigned int)&grub_error;
  327.           result = v14(38);
  328.         }
  329.       }
  330.     }
  331.   }
  332.   if ( !result )
  333.   {
  334.     v16 = *(_DWORD *)(v4 + 76);
  335.     ddata = *(_DWORD *)(v3 + 76);
  336.     dh = *(_DWORD *)(v3 + 4);
  337.     v17 = *(_DWORD *)v3;
  338.     sw = *(_DWORD *)v4;
  339.     v18 = *(_DWORD *)(v3 + 16);
  340.     sh = *(_DWORD *)(v4 + 4);
  341.     sstride = *(_DWORD *)(v4 + 20);
  342.     dstride = *(_DWORD *)(v3 + 20);
  343.     if ( dh )
  344.       goto LABEL_19;
  345. LABEL_52:
  346.     result = 0;
  347.   }
  348.   return result;
  349. }
  350. // 9F0: using guessed type int __fastcall grub_error(_DWORD);
  351.  
  352. //----- (0000035C) --------------------------------------------------------
  353. int __fastcall grub_video_bitmap_create_scaled(int *a1, int a2, int a3, int a4)
  354. {
  355.   int *v4; // r6@1
  356.   int v5; // r7@1
  357.   int v6; // r8@1
  358.   int v7; // r4@1
  359.   int (__fastcall *v8)(_DWORD); // r3@9
  360.   int v9; // r5@9
  361.   bool v10; // zf@11
  362.   bool v11; // nf@11
  363.   char v12; // vf@11
  364.   int (__fastcall *v13)(_DWORD, _DWORD, _DWORD, _DWORD); // r5@14
  365.   int (__fastcall *v15)(_DWORD); // r3@16
  366.   int (__fastcall *v16)(_DWORD); // r3@17
  367.   void (__fastcall *v17)(_DWORD); // r3@19
  368.   int (__fastcall *v18)(_DWORD); // r3@20
  369.   int (__fastcall *v19)(_DWORD); // r3@21
  370.  
  371.   v4 = a1;
  372.   v5 = a2;
  373.   v6 = a3;
  374.   v7 = a4;
  375.   *a1 = 0;
  376.   if ( a4 )
  377.   {
  378.     if ( *(_DWORD *)(a4 + 40) << 29
  379.       || *(_DWORD *)(a4 + 48) << 29
  380.       || *(_DWORD *)(a4 + 56) << 29
  381.       || *(_DWORD *)(a4 + 64) << 29 )
  382.     {
  383.       v15 = (int (__fastcall *)(_DWORD))&grub_error;
  384.       HIWORD(v15) = (unsigned int)&grub_error;
  385.       v9 = v15(38);
  386.     }
  387.     else if ( *(_DWORD *)a4 && *(_DWORD *)(a4 + 4) )
  388.     {
  389.       if ( *(_DWORD *)(a4 + 12) == 8 * *(_DWORD *)(a4 + 16) )
  390.         goto LABEL_11;
  391.       v8 = (int (__fastcall *)(_DWORD))&grub_error;
  392.       HIWORD(v8) = (unsigned int)&grub_error;
  393.       v9 = v8(38);
  394.     }
  395.     else
  396.     {
  397.       v18 = (int (__fastcall *)(_DWORD))&grub_error;
  398.       HIWORD(v18) = (unsigned int)&grub_error;
  399.       v9 = v18(38);
  400.     }
  401.   }
  402.   else
  403.   {
  404.     v19 = (int (__fastcall *)(_DWORD))&grub_error;
  405.     HIWORD(v19) = (unsigned int)&grub_error;
  406.     v9 = v19(38);
  407.   }
  408.   if ( v9 )
  409.     return v9;
  410. LABEL_11:
  411.   v12 = 0;
  412.   v10 = v6 == 0;
  413.   v11 = v6 < 0;
  414.   if ( v6 > 0 )
  415.   {
  416.     v12 = 0;
  417.     v10 = v5 == 0;
  418.     v11 = v5 < 0;
  419.   }
  420.   if ( !((unsigned __int8)(v11 ^ v12) | v10) )
  421.   {
  422.     v13 = (int (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD))&grub_video_bitmap_create;
  423.     HIWORD(v13) = (unsigned int)&grub_video_bitmap_create;
  424.     v9 = v13(v4, v5, v6, *(_DWORD *)(v7 + 32));
  425.     if ( !v9 )
  426.     {
  427.       v9 = scale_nn(*v4, v7);
  428.       if ( v9 )
  429.       {
  430.         v17 = (void (__fastcall *)(_DWORD))&grub_video_bitmap_destroy;
  431.         HIWORD(v17) = (unsigned int)&grub_video_bitmap_destroy;
  432.         v17(*v4);
  433.         *v4 = 0;
  434.       }
  435.     }
  436.     return v9;
  437.   }
  438.   v16 = (int (__fastcall *)(_DWORD))&grub_error;
  439.   HIWORD(v16) = (unsigned int)&grub_error;
  440.   return v16(38);
  441. }
  442. // 9F0: using guessed type int __fastcall grub_error(_DWORD);
  443. // 9F4: using guessed type int __fastcall grub_video_bitmap_create(_DWORD, _DWORD, _DWORD, _DWORD);
  444. // 9F8: using guessed type int __fastcall grub_video_bitmap_destroy(_DWORD);
  445.  
  446. //----- (0000045C) --------------------------------------------------------
  447. int __fastcall grub_video_bitmap_scale_proportional(int *a1, unsigned int a2, unsigned int a3, int a4, int scale_method, int selection_method, unsigned int v_align, unsigned int h_align)
  448. {
  449.   int *v8; // r6@1
  450.   unsigned int v9; // r5@1
  451.   unsigned int v10; // r7@1
  452.   int v11; // r4@1
  453.   int (__fastcall *v12)(_DWORD); // r3@9
  454.   int result; // r0@9
  455.   bool v14; // zf@11
  456.   bool v15; // nf@11
  457.   char v16; // vf@11
  458.   int (__fastcall *v17)(_DWORD, _DWORD, _DWORD, _DWORD); // r12@14
  459.   unsigned int v18; // r11@15
  460.   unsigned int v19; // r8@15
  461.   int (__fastcall *v20)(_DWORD); // r3@17
  462.   int (__fastcall *v21)(_DWORD); // r3@19
  463.   int (__fastcall *v22)(_DWORD); // r3@20
  464.   int v23; // r0@21
  465.   int (__fastcall *v24)(_DWORD, _DWORD); // r3@22
  466.   int v25; // r0@22
  467.   int v26; // r0@23
  468.   unsigned int v27; // lr@27
  469.   unsigned int v28; // r9@27
  470.   unsigned int v29; // r12@28
  471.   unsigned int v30; // r3@28
  472.   int v31; // r5@28
  473.   int v32; // r10@28
  474.   unsigned int v33; // r7@29
  475.   int v34; // r2@30
  476.   int v35; // r8@30
  477.   int v36; // r12@30
  478.   int v37; // r11@30
  479.   int v38; // r2@30
  480.   int v39; // r9@30
  481.   int v40; // ST14_4@30
  482.   int v41; // r12@30
  483.   int v42; // r2@30
  484.   int v43; // lr@30
  485.   int v44; // ST10_4@30
  486.   int v45; // lr@30
  487.   int v46; // r3@30
  488.   int v47; // r0@30
  489.   int v48; // r0@30
  490.   int v49; // r5@30
  491.   int v50; // r3@30
  492.   void (__fastcall *v51)(_DWORD); // r3@31
  493.   int v52; // lr@32
  494.   int (__fastcall *v53)(_DWORD, _DWORD); // r7@33
  495.   unsigned int v54; // r1@33
  496.   int v55; // r0@33
  497.   int v56; // r0@34
  498.   int v57; // r1@39
  499.   int (__fastcall *v58)(_DWORD, _DWORD); // r2@41
  500.   int v59; // r0@41
  501.   int (__fastcall *v60)(_DWORD, _DWORD); // r5@52
  502.   int v61; // r0@52
  503.   int (__fastcall *v62)(_DWORD); // r3@57
  504.   int (__fastcall *v63)(_DWORD); // r7@69
  505.   int dw; // [sp+4h] [bp-3Ch]@14
  506.   int dh; // [sp+8h] [bp-38h]@14
  507.   unsigned int src_height_orig; // [sp+Ch] [bp-34h]@29
  508.  
  509.   v8 = a1;
  510.   v9 = a2;
  511.   v10 = a3;
  512.   *a1 = 0;
  513.   v11 = a4;
  514.   if ( !a4 )
  515.   {
  516.     v62 = (int (__fastcall *)(_DWORD))&grub_error;
  517.     HIWORD(v62) = (unsigned int)&grub_error;
  518.     result = v62(38);
  519. LABEL_10:
  520.     if ( result )
  521.       return result;
  522.     goto LABEL_11;
  523.   }
  524.   if ( !(*(_DWORD *)(a4 + 40) << 29)
  525.     && !(*(_DWORD *)(a4 + 48) << 29)
  526.     && !(*(_DWORD *)(a4 + 56) << 29)
  527.     && !(*(_DWORD *)(a4 + 64) << 29) )
  528.   {
  529.     if ( *(_DWORD *)a4 && *(_DWORD *)(a4 + 4) )
  530.     {
  531.       if ( *(_DWORD *)(a4 + 12) == 8 * *(_DWORD *)(a4 + 16) )
  532.         goto LABEL_11;
  533.       v12 = (int (__fastcall *)(_DWORD))&grub_error;
  534.       HIWORD(v12) = (unsigned int)&grub_error;
  535.       result = v12(38);
  536.     }
  537.     else
  538.     {
  539.       v22 = (int (__fastcall *)(_DWORD))&grub_error;
  540.       HIWORD(v22) = (unsigned int)&grub_error;
  541.       result = v22(38);
  542.     }
  543.     goto LABEL_10;
  544.   }
  545.   v20 = (int (__fastcall *)(_DWORD))&grub_error;
  546.   HIWORD(v20) = (unsigned int)&grub_error;
  547.   result = v20(38);
  548.   if ( result )
  549.     return result;
  550. LABEL_11:
  551.   v16 = 0;
  552.   v14 = v10 == 0;
  553.   v15 = (v10 & 0x80000000u) != 0;
  554.   if ( (signed int)v10 > 0 )
  555.   {
  556.     v16 = 0;
  557.     v14 = v9 == 0;
  558.     v15 = (v9 & 0x80000000u) != 0;
  559.   }
  560.   if ( (unsigned __int8)(v15 ^ v16) | v14 )
  561.   {
  562.     v21 = (int (__fastcall *)(_DWORD))&grub_error;
  563.     HIWORD(v21) = (unsigned int)&grub_error;
  564.     return v21(38);
  565.   }
  566.   v17 = (int (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD))&grub_video_bitmap_create;
  567.   HIWORD(v17) = (unsigned int)&grub_video_bitmap_create;
  568.   result = v17(v8, v9, v10, *(_DWORD *)(v11 + 32));
  569.   dw = v9;
  570.   dh = v10;
  571.   if ( !result )
  572.   {
  573.     v18 = *(_DWORD *)v11;
  574.     v19 = *(_DWORD *)(v11 + 4);
  575.     if ( (unsigned int)(selection_method - 1) > 3 )
  576.     {
  577. LABEL_49:
  578.       v49 = grub_error(38);
  579.     }
  580.     else
  581.     {
  582.       switch ( selection_method )
  583.       {
  584.         case 4:
  585.           v23 = v19 * v9;
  586.           if ( v18 * v10 >= v19 * v9 )
  587.             goto LABEL_52;
  588.           v24 = (int (__fastcall *)(_DWORD, _DWORD))&_aeabi_uidiv;
  589.           v25 = v18 * v10;
  590.           goto LABEL_23;
  591.         case 1:
  592.           v52 = v18 * v10;
  593.           v23 = v19 * v9;
  594.           if ( v18 * v10 < v19 * v9 )
  595.           {
  596.             v53 = (int (__fastcall *)(_DWORD, _DWORD))&_aeabi_uidiv;
  597.             v54 = v9;
  598.             v55 = v52;
  599.             goto LABEL_34;
  600.           }
  601. LABEL_52:
  602.           v60 = (int (__fastcall *)(_DWORD, _DWORD))&_aeabi_uidiv;
  603.           HIWORD(v60) = (unsigned int)&_aeabi_uidiv;
  604.           v61 = v60(v23, v10);
  605.           v32 = v61;
  606.           if ( v18 <= v61 )
  607.             goto LABEL_62;
  608.           if ( h_align == 1 )
  609.           {
  610.             v27 = 0;
  611.             v29 = (v18 - v61) >> 1;
  612.             v30 = 0;
  613.             v28 = 0;
  614.             v31 = v19;
  615.             goto LABEL_29;
  616.           }
  617.           if ( h_align < 1 )
  618.           {
  619. LABEL_62:
  620.             v27 = 0;
  621.             v31 = v19;
  622.             v29 = 0;
  623.             v30 = 0;
  624.             v28 = 0;
  625.             goto LABEL_29;
  626.           }
  627.           if ( h_align == 2 )
  628.           {
  629.             v27 = 0;
  630.             v29 = v18 - v61;
  631.             v30 = 0;
  632.             v28 = 0;
  633.             v31 = v19;
  634.             goto LABEL_29;
  635.           }
  636.           v18 = v61;
  637.           v49 = grub_error(38);
  638.           break;
  639.         case 2:
  640.           v25 = v18 * v10;
  641.           v57 = v19 * v9;
  642.           if ( v18 * v10 >= v19 * v9 )
  643.             goto LABEL_41;
  644.           v24 = (int (__fastcall *)(_DWORD, _DWORD))&_aeabi_uidiv;
  645. LABEL_23:
  646.           HIWORD(v24) = (unsigned int)&_aeabi_uidiv;
  647.           v26 = v24(v25, *(_DWORD *)(v11 + 4));
  648.           if ( v9 <= v26 )
  649.             goto LABEL_61;
  650.           if ( h_align == 1 )
  651.           {
  652.             v27 = 0;
  653.             v28 = (v9 - v26) >> 1;
  654.             goto LABEL_28;
  655.           }
  656.           if ( h_align < 1 )
  657.           {
  658. LABEL_61:
  659.             v27 = 0;
  660.             dw = v26;
  661.             goto LABEL_60;
  662.           }
  663.           if ( h_align == 2 )
  664.           {
  665.             v27 = 0;
  666.             v28 = v9 - v26;
  667. LABEL_28:
  668.             dw = v26;
  669.             v29 = v27;
  670.             v30 = v27;
  671.             v31 = v19;
  672.             v32 = v18;
  673.             goto LABEL_29;
  674.           }
  675.           dw = v26;
  676.           v49 = grub_error(38);
  677.           break;
  678.         case 3:
  679.           v55 = v18 * v10;
  680.           v57 = v19 * v9;
  681.           if ( v18 * v10 < v19 * v9 )
  682.           {
  683.             v53 = (int (__fastcall *)(_DWORD, _DWORD))&_aeabi_uidiv;
  684.             v54 = v9;
  685. LABEL_34:
  686.             HIWORD(v53) = (unsigned int)&_aeabi_uidiv;
  687.             v56 = v53(v55, v54);
  688.             v31 = v56;
  689.             if ( v19 > v56 )
  690.             {
  691.               if ( v_align == 1 )
  692.               {
  693.                 v29 = 0;
  694.                 v27 = (v19 - v56) >> 1;
  695.                 v30 = 0;
  696.                 v28 = 0;
  697.                 v32 = v18;
  698.                 goto LABEL_29;
  699.               }
  700.               if ( v_align >= 1 )
  701.               {
  702.                 if ( v_align == 2 )
  703.                 {
  704.                   v29 = 0;
  705.                   v27 = v19 - v56;
  706.                   v30 = 0;
  707.                   v28 = 0;
  708.                   v32 = v18;
  709.                   goto LABEL_29;
  710.                 }
  711.                 v63 = (int (__fastcall *)(_DWORD))&grub_error;
  712.                 HIWORD(v63) = (unsigned int)&grub_error;
  713.                 v19 = v56;
  714.                 v49 = v63(38);
  715.                 break;
  716.               }
  717.             }
  718.             v27 = 0;
  719.             v32 = v18;
  720.             v29 = 0;
  721.             v30 = 0;
  722.             v28 = 0;
  723. LABEL_29:
  724.             v33 = v18;
  725.             src_height_orig = v19;
  726.             goto LABEL_30;
  727.           }
  728. LABEL_41:
  729.           v58 = (int (__fastcall *)(_DWORD, _DWORD))&_aeabi_uidiv;
  730.           HIWORD(v58) = (unsigned int)&_aeabi_uidiv;
  731.           v59 = v58(v57, *(_DWORD *)v11);
  732.           if ( v10 <= v59 )
  733.             goto LABEL_59;
  734.           if ( v_align == 1 )
  735.           {
  736.             v27 = 0;
  737.             v30 = (v10 - v59) >> 1;
  738.             goto LABEL_46;
  739.           }
  740.           if ( v_align < 1 )
  741.           {
  742. LABEL_59:
  743.             v27 = 0;
  744.             dh = v59;
  745. LABEL_60:
  746.             v29 = v27;
  747.             v30 = v27;
  748.             v28 = v27;
  749.             v31 = v19;
  750.             v32 = v18;
  751.             goto LABEL_29;
  752.           }
  753.           if ( v_align == 2 )
  754.           {
  755.             v27 = 0;
  756.             v30 = v10 - v59;
  757. LABEL_46:
  758.             dh = v59;
  759.             v29 = v27;
  760.             v28 = v27;
  761.             v31 = v19;
  762.             v32 = v18;
  763.             goto LABEL_29;
  764.           }
  765.           dh = v59;
  766.           v49 = grub_error(38);
  767.           break;
  768.         default:
  769.           goto LABEL_49;
  770.       }
  771.     }
  772.     if ( v49 )
  773.     {
  774. LABEL_31:
  775.       v51 = (void (__fastcall *)(_DWORD))&grub_video_bitmap_destroy;
  776.       HIWORD(v51) = (unsigned int)&grub_video_bitmap_destroy;
  777.       v51(*v8);
  778.       result = v49;
  779.       *v8 = 0;
  780.       return result;
  781.     }
  782.     v30 = 0;
  783.     v33 = *(_DWORD *)v11;
  784.     v32 = v18;
  785.     v31 = v19;
  786.     v29 = 0;
  787.     src_height_orig = *(_DWORD *)(v11 + 4);
  788.     v27 = 0;
  789.     v28 = 0;
  790. LABEL_30:
  791.     v34 = *(_DWORD *)(v11 + 16);
  792.     v35 = *(_DWORD *)(v11 + 76);
  793.     v36 = v34 * v29;
  794.     v37 = *(_DWORD *)*v8;
  795.     v38 = v34 * v28;
  796.     v39 = *(_DWORD *)(*v8 + 76);
  797.     v40 = v38;
  798.     v41 = v36 + *(_DWORD *)(v11 + 20) * v27;
  799.     v42 = *(_DWORD *)(*v8 + 4);
  800.     v43 = *(_DWORD *)(*v8 + 20);
  801.     *(_DWORD *)v11 = v32;
  802.     v44 = v42;
  803.     *(_DWORD *)(v11 + 76) = v35 + v41;
  804.     v45 = v40 + v43 * v30;
  805.     v46 = *v8;
  806.     *(_DWORD *)(v11 + 4) = v31;
  807.     v47 = *(_DWORD *)(v46 + 76);
  808.     *(_DWORD *)v46 = dw;
  809.     *(_DWORD *)(v46 + 76) = v47 + v45;
  810.     v48 = *v8;
  811.     *(_DWORD *)(v46 + 4) = dh;
  812.     result = scale_nn(v48, v11);
  813.     *(_DWORD *)(v11 + 76) = v35;
  814.     v49 = result;
  815.     v50 = *v8;
  816.     *(_DWORD *)v11 = v33;
  817.     *(_DWORD *)(v11 + 4) = src_height_orig;
  818.     *(_DWORD *)v50 = v37;
  819.     *(_DWORD *)(v50 + 4) = v44;
  820.     *(_DWORD *)(v50 + 76) = v39;
  821.     if ( !result )
  822.       return result;
  823.     goto LABEL_31;
  824.   }
  825.   return result;
  826. }
  827. // 9EC: using guessed type int __fastcall _aeabi_uidiv(_DWORD, _DWORD);
  828. // 9F0: using guessed type int __fastcall grub_error(_DWORD);
  829. // 9F4: using guessed type int __fastcall grub_video_bitmap_create(_DWORD, _DWORD, _DWORD, _DWORD);
  830. // 9F8: using guessed type int __fastcall grub_video_bitmap_destroy(_DWORD);
  831.  
  832. // ALL OK, 3 function(s) have been successfully decompiled
Advertisement
RAW Paste Data Copied
Advertisement