1. Си / Говнокод #26333

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    switch (pattern)
                {
                    case 0:
                    case 1:
                    case 4:
                    case 32:
                    case 128:
                    case 5:
                    case 132:
                    case 160:
                    case 33:
                    case 129:
                    case 36:
                    case 133:
                    case 164:
                    case 161:
                    case 37:
                    case 165:
                        {
                            PIXEL00_20
                            PIXEL01_60
                            PIXEL02_60
                            PIXEL03_20
                            PIXEL10_60
                            PIXEL11_70
                            PIXEL12_70
                            PIXEL13_60
                            PIXEL20_60
                            PIXEL21_70
                            PIXEL22_70
                            PIXEL23_60
                            PIXEL30_20
                            PIXEL31_60
                            PIXEL32_60
                            PIXEL33_20
                            break;
                        }
                    case 2:
                    case 34:
                    case 130:
                    case 162:
                        {
                            PIXEL00_80
                            PIXEL01_10
                            PIXEL02_10
                            PIXEL03_80
                            PIXEL10_61
                            PIXEL11_30
                            PIXEL12_30
                            PIXEL13_61
                            PIXEL20_60
                            PIXEL21_70
                            PIXEL22_70
                            PIXEL23_60
                            PIXEL30_20
                            PIXEL31_60
                            PIXEL32_60
                            PIXEL33_20
                            break;
                        }
                    case 16:
                    case 17:
                    case 48:
                    case 49:
                        {
                            PIXEL00_20
                            PIXEL01_60
                            PIXEL02_61
                            PIXEL03_80
                            PIXEL10_60
                            PIXEL11_70
                            PIXEL12_30
                            PIXEL13_10
                            PIXEL20_60
                            PIXEL21_70
                            PIXEL22_30
                            PIXEL23_10
                            PIXEL30_20
                            PIXEL31_60
                            PIXEL32_61
                            PIXEL33_80
                            break;
                        }

    Отсюда:
    https://github.com/grom358/hqx/blob/master/src/hq4x.c

    Запостил: HoBorogHuu_nemyx, 09 Января 2020

    Комментарии (16) RSS

    • SEO-пост.

      Метки: #hqx, #алгоритмы, #копипаста, #генереции, #мокросы, #магия.

      Вдогонку:
      #define PIXEL00_0     *dp = w[5];
      #define PIXEL00_11    Interp1(dp, w[5], w[4]);
      #define PIXEL00_12    Interp1(dp, w[5], w[2]);
      #define PIXEL00_20    Interp2(dp, w[5], w[2], w[4]);
      #define PIXEL00_50    Interp5(dp, w[2], w[4]);
      #define PIXEL00_80    Interp8(dp, w[5], w[1]);
      #define PIXEL00_81    Interp8(dp, w[5], w[4]);
      #define PIXEL00_82    Interp8(dp, w[5], w[2]);
      #define PIXEL01_0     *(dp+1) = w[5];
      #define PIXEL01_10    Interp1(dp+1, w[5], w[1]);
      #define PIXEL01_12    Interp1(dp+1, w[5], w[2]);
      #define PIXEL01_14    Interp1(dp+1, w[2], w[5]);
      #define PIXEL01_21    Interp2(dp+1, w[2], w[5], w[4]);
      #define PIXEL01_31    Interp3(dp+1, w[5], w[4]);
      #define PIXEL01_50    Interp5(dp+1, w[2], w[5]);
      #define PIXEL01_60    Interp6(dp+1, w[5], w[2], w[4]);
      #define PIXEL01_61    Interp6(dp+1, w[5], w[2], w[1]);
      #define PIXEL01_82    Interp8(dp+1, w[5], w[2]);
      #define PIXEL01_83    Interp8(dp+1, w[2], w[4]);
      #define PIXEL02_0     *(dp+2) = w[5];
      #define PIXEL02_10    Interp1(dp+2, w[5], w[3]);
      #define PIXEL02_11    Interp1(dp+2, w[5], w[2]);
      #define PIXEL02_13    Interp1(dp+2, w[2], w[5]);
      #define PIXEL02_21    Interp2(dp+2, w[2], w[5], w[6]);
      #define PIXEL02_32    Interp3(dp+2, w[5], w[6]);
      #define PIXEL02_50    Interp5(dp+2, w[2], w[5]);
      #define PIXEL02_60    Interp6(dp+2, w[5], w[2], w[6]);
      #define PIXEL02_61    Interp6(dp+2, w[5], w[2], w[3]);
      #define PIXEL02_81    Interp8(dp+2, w[5], w[2]);
      #define PIXEL02_83    Interp8(dp+2, w[2], w[6]);
      Ответить
    • Царский онролл. Я бы ещё от массива избавился.
      Ответить
      • И то верно. Там же повсюду в качестве индекса только константа.

        Кстати, сам алгоритм отвоевал отдельную статью в «Википедии»:
        https://en.wikipedia.org/wiki/Hqx

        Ссылку нашёл в этой статье, когда искал алгоритмы масштабирования изображений, потому что «waifu2x» мне показался сложноватым:
        https://en.wikipedia.org/wiki/Pixel-art_scaling_algorithms
        Ответить
      • А вот алгоритм «xBRZ» реализован на крестошаблонах с числовыми параметрами. Но, тем не менее, там тоже есть красивые места:
        switch (factor)
                    {
                        case 2:
                            return scaleImage<Scaler2x<ColorGradientRGB>, ColorDistanceRGB, OobReaderDuplicate>(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast);
                        case 3:
                            return scaleImage<Scaler3x<ColorGradientRGB>, ColorDistanceRGB, OobReaderDuplicate>(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast);
                        case 4:
                            return scaleImage<Scaler4x<ColorGradientRGB>, ColorDistanceRGB, OobReaderDuplicate>(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast);
                        case 5:
                            return scaleImage<Scaler5x<ColorGradientRGB>, ColorDistanceRGB, OobReaderDuplicate>(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast);
                        case 6:
                            return scaleImage<Scaler6x<ColorGradientRGB>, ColorDistanceRGB, OobReaderDuplicate>(src, trg, srcWidth, srcHeight, cfg, yFirst, yLast);
                    }
        Ответить
    • Даже Терри Дэвис (царствие небесное!) советовал петухам сишникам юзать if..elseif а не select..case.
      Ответить
    • о, FXAA переизобрели
      Ответить
      • Чтобы не вводить остальных читателей в заблуждение, замечу, что эти алгоритмы из разной оперы.

        FXAA — алгоритм антиалиасинга, т. е. сглаживания зубчатости наклонных линий:
        https://ru.wikipedia.org/wiki/Сглаживание
        https://en.wikipedia.org/wiki/Spatial_anti-aliasing

        hqx — алгоритм масштабирования изображений:
        https://ru.wikipedia.org/wiki/Алгоритмы_масштабирования_пиксельной_гра фики
        https://ru.wikipedia.org/wiki/Масштабирование_изображения

        Да, иногда после масштабирования тупым клонированием пикселей применяют антиалиасинг, чтобы сгладить получившиеся зубцы. Но вообще же алгоритмы антиалиасинга и специального масштабирования неэквивалентны.
        Ответить
        • > First, the color of each of the 8 pixels around the source pixel is compared to the color of the source pixel. Shapes are detected by checking for pixels of similar color according to a threshold. This gives total of 28 = 256 combinations of similar or dissimilar neighbors. To expand the single pixel into a 2×2, 3×3, or 4×4 block of pixels, the arrangement of neighbors is looked up in a predefined table which contains the necessary interpolation patterns.

          > Hqx uses the YUV color space to calculate color differences, so that differences in brightness is weighted higher to mimic human perception.

          Та же хуйня, только FXAA использует окружающие пиксели для определения направления, а уже по этому направлению может ходить на несколько пикселей.
          Ответить
          • FXAA на входе всё-таки знает глубину пикселей чтобы края искать, а эти алгоритмы для масштабирования только над картинкой работают. Разве нет?
            Ответить
            • FXAA работает только с конечным изображением
              Ответить
              • А почему тогда на вики пишут, что он depth-aware? Есть пруф, что он только над цветами работает, а буфер глубины не юзает?
                Ответить
                • > This helps to reduce blurring in textures, since edges in a texture have similar depths.

                  под глубиной очевидно подразумевается какая-то цветовая характеристика (luma?)

                  весь алгоитм описан на стр. 7-8 http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf
                  Ответить
        • > а фики
          > Fike
          Совпадение? Не думаю.
          Ответить

    Добавить комментарий