Няшная / Говнокод #26333 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 HoBorogHuu_nemyx, (Updated )

Комментарии (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);
                  }
      Ответить
      • А всё потому, что Комитет не осилил нормальной интеграции шаблоноговна с рантаймом.
        Ответить
        • А жаль. Было бы круто, если бы выполнение кода в компайлтайме или рантайме зависело бы от тысячи факторов, и было б иногда implementation specific.

          ну как
          const int i = 1 + 1;
          Ответить
  • Даже Терри Дэвис (царствие небесное!) советовал петухам сишникам юзать if..elseif а не select..case.
    Ответить
    • Чтобы не вводить остальных читателей в заблуждение, замечу, что эти алгоритмы из разной оперы.

      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 на входе всё-таки знает глубину пикселей чтобы края искать, а эти алгоритмы для масштабирования только над картинкой работают. Разве нет?
          Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8