1. C++ / Говнокод #8216

    +1007

    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
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    void Image::CombineNoise(byte combineType, byte noiseType, cCol3D& maxcolor, Image* mask)
    {
    	byte *maskBf=0;
    	if(mask)
    	{
    		uint mask_pixels=mask->Width*mask->Height;
    		maskBf=(byte*)malloc(mask_pixels);
    		if(mask->Format!=ImageFormat_Luminance)
    		for(uint i=0, ic=0; i<mask_pixels; i++, ic+=mask->Components)
    			maskBf[i]=min((byte)255)((byte)(mask->Data[ic]*0.3f+mask->Data[ic+1]*0.59f+mask->Data[ic+2]*0.11f));
    		else memcpy(maskBf, mask->Data, mask_pixels);
    		if(mask->Width!=Width || mask->Height!=Height)
    		{
    			byte* maskBf2=ScaleImage(Width, Height, maskBf, mask->Width, mask->Height, 1);
    			free(maskBf);
    			maskBf=maskBf2;
    		}
    	}
    
    	uint pixels=Width*Height;
    	uint size=pixels*Components;
    	if(Data && Width>0 && Height>0)
    	{
    		if(noiseType==0 && Format!=ImageFormat_Luminance)	//Цветной шум
    		{
    			switch(combineType)
    			{
    			case 0:	//Модуляция
    				if(mask)
    				for(uint i=0, ic=0; ic<size; i++, ic+=Components)
    				{
    					if(maskBf[i]<=127) continue;
    					Data[ic]=min<byte>(Data[ic]*(rand()%maxcolor.r)/255)(255);
    					if(Components<2) continue;
    					Data[ic+1]=min<byte>(Data[ic+1]*(rand()%maxcolor.g)/255)(255);
    					if(Components<3) continue;
    					Data[ic+2]=min<byte>(Data[ic+2]*(rand()%maxcolor.b)/255)(255);
    				}
    				else
    				for(uint ic=0; ic<size; ic+=Components)
    				{
    					Data[ic]=min<byte>(Data[ic]*(rand()%maxcolor.r)/255)(255);
    					if(Components<2) continue;
    					Data[ic+1]=min<byte>(Data[ic+1]*(rand()%maxcolor.g)/255)(255);
    					if(Components<3) continue;
    					Data[ic+2]=min<byte>(Data[ic+2]*(rand()%maxcolor.b)/255)(255);
    				}
    				break;
    
    			case 1:	//Сложение
    				if(mask)
    				for(uint i=0, ic=0; ic<size; i++, ic+=Components)
    				{
    					float factor=maskBf[i]/255.0f;
    					Data[ic]=(byte)min(Data[ic]+(rand()%maxcolor.r*factor))(255);
    					if(Components<2) continue;
    					Data[ic+1]=(byte)min(Data[ic+1]+(rand()%maxcolor.g*factor))(255);
    					if(Components<3) continue;
    					Data[ic+2]=(byte)min(Data[ic+2]+(rand()%maxcolor.b*factor))(255);
    				}
    				else
    				for(uint ic=0; ic<size; ic+=Components)
    				{
    					Data[ic]=min<byte>(Data[ic]+(maxcolor.r>0? rand()%maxcolor.r: 0))(255);
    					Data[ic+1]=min<byte>(Data[ic+1]+(maxcolor.g>0? rand()%maxcolor.g: 0))(255);
    					Data[ic+2]=min<byte>(Data[ic+2]+(maxcolor.b>0? rand()%maxcolor.b: 0))(255);
    				}
    				break;
    
    			case 2:	//Вычитание
    				if(mask)
    				for(uint i=0, ic=0; ic<size; i++, ic+=Components)
    				{
    					float factor=maskBf[i]/255.0f;
    					Data[ic]=(byte)max(Data[ic]-(rand()%maxcolor.r*factor))(0);
    					if(Components<2) continue;
    					Data[ic+1]=(byte)max(Data[i+1]-(rand()%maxcolor.g*factor))(0);
    					if(Components<3) continue;
    					Data[ic+2]=(byte)max(Data[i+2]-(rand()%maxcolor.b*factor))(0);
    				}
    				else
    				for(uint ic=0; ic<size; ic+=Components)
    				{
    					Data[ic]=max<byte>(Data[ic]-rand()%maxcolor.r)(0);
    					if(Components<2) continue;
    					Data[ic+1]=max<byte>(Data[ic+1]-rand()%maxcolor.g)(0);
    					if(Components<3) continue;
    					Data[ic+2]=max<byte>(Data[ic+2]-rand()%maxcolor.b)(0);
    				}
    				break;
    				
    			case 3:	//Средний цвет
    //На говнокод не лезет больше. Такая гигантская функция.

    Одна из функций для генерации изображений. Решил не рефакторить, потому что всё равно всё буду переделывать.

    Запостил: gammaker, 17 Октября 2011

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

    • Ничего себе, таких ф-ций я давно не видел...
      Ответить
    • Да, кто-то не знал про шаблон Strategy
      Ответить
      • тут до шаблонов надо ещё плюсы подучить, а то free/malloc'ами мозг поражен и привидениями типов в C-style
        Ответить
        • привидения типов это да
          Ответить
          • когда я был маленький, я всегда боялся привидений, особенно привидений всяких подозрительных типов...
            Ответить
          • хе-хе, ну это да :)) ghost type castle
            Ответить
        • А чем плохи free и malloc? Кроме того, что они пришли из C? Выделять память-то надо всё-равно по байтам. А приведение типов в стиле C мне больше нравится. Другие типы приведений слишком длинные.
          Если бы я плохо знал C++, я бы такого не написал:
          min(Data[ic]+(rand()%maxcolor.r*factor))(255);
          min самодельный шаблонный функтор, принимающий неограниченное число аргументов. Можно написать min(5)(34)(66)(2)(87); и он вернёт 2.
          Писал этот код ещё до того, как начал читать такие умные книжки как "Совершенный код" и т. п.
          Ответить
          • >min(Data[ic]+(rand()%maxcolor.r*factor))(255);
            Такое обычно пишут не знающие с++ и программирование в целом.
            Ответить
            • показать все, что скрытоЧто именно на это указывает? Предложи лучший вариант. Я в этой строке кода лучшего варианта не вижу, но вижу вариант всю обработку изображений на шейдеры перевести, либо разбить эту функцию на более мелкие. Я выбрал первый вариант, поэтому не перехожу ко второму.
              Ответить
              • >Предложи лучший вариант.
                Кого-то мне это напоминает...
                Ответить
                • Кого это?
                  Ответить
                • Данный индивидуум отличается наличием интеллекта, шизофрения?
                  Ответить
                  • Ты про мой интеллект? IQ тест показал 152. Надеюсь, ему можно верить. Только причём здесь интеллект?
                    Что меня сразу все минусуют? Как будто меня тут ненавидят, непонятно за что. Не аргументированно как-то.
                    Ответить
                    • Ммм....недавние происшествия показали, что на ГК находится как минимум один человек с похожими симптомами. У вас случаем нет синдрома Аспергера?
                      Ответить
                      • >У вас случаем нет синдрома Аспергера?
                        Прочитал, что это такое в википедии и ужаснулся: неужели я псих?
                        Ответить
                    • показать все, что скрыто>Что меня сразу все минусуют? Как будто меня тут ненавидят

                      Ну не нужно обобщать. Не все минуснули. Тут много троллей, но есть и умные люди.


                      Вот, например я плюсанул. Так что впредь не обращайте внимания. Я верю, что у вас интеллект 152. Оно видно.
                      Ответить
                      • >Ну не нужно обобщать. Не все минуснули.
                        По крайней мере, большинство.

                        >Так что впредь не обращайте внимания.
                        Да я и не обижаюсь ни на кого, просто я задаю вопросы, а их игнорируют. Ставят минус и всё. Обычно минус ставят за что-то (спам, нецензурные слова, оффтоп), а на этом сайте всё с точностью наоборот.
                        Ответить
                        • вот именно поэтому IQ-тест - это ещё не весь показатель интеллекта
                          Ответить
                        • >По крайней мере, большинство.
                          Неужели вы думаете, что на сайте сидят только 3 бота, если посчитать кол-во минусов на вашем посте?
                          Ответить
                        • Мне кажется, тебя минусуют потому, что ты с геймдева :)
                          Хоть мне и нравится нестандартность твоего мышления, я считаю, что изобретать велосипеды всё-же не стоит
                          Ответить
                        • >Обычно минус ставят за что-то (спам, нецензурные слова, оффтоп), а на этом сайте всё с точностью наоборот.

                          Это говнокод, детка.

                          А серъезно зачастую годные, но понятные не всем, говнокоды имеют низкий рейтинг, и в то же время что-то а-ля
                          double penetration=0;
                          рейтинг зашкаливает.
                          Ответить
    • лютое говно

      убрать магические числа
      убрать изврат с байтами
      убрать хуиту с maxcolor(все-равно rgb везде? раз так, то все компоненты всегда будут 0 <= { r, g, b } <= 255)
      свернуть поебень в case xxx: с if(mask) {} else {} const double factor = (mask)? maskBf[i] / 255.0: 1;

      если не нужен райн-тайм блядство с combineType, то можно усе свернуть с помощью стратегий или template<size_t type> Int2Type; (делаешь пустышку аргумент функции int2type<combineType>)
      Ответить
      • > убрать хуиту с maxcolor(все-равно rgb везде? раз так, то все компоненты всегда будут 0 <= { r, g, b } <= 255)
        особо не поубираешь - у него же тут проверка на переполнение при сложении/вычитании.
        основная проблема - дублирование кода из-за combineType
        Ответить
      • >убрать магические числа
        Это да, надо.
        >убрать изврат с байтами
        С этим ничего не поделаешь. Класс может хранить изображение в любом формате. Из-за этого на пиксель может приходиться и 3, и 4, и 1 байт.
        В общем, кое-что исправил бы, но лучше всё переделаю полностью.
        Ответить
        • А создать иерархию классов, описывающих конкретный тип картинки и соответствующие методы никак?
          Ответить
    • Смотрел говнокоды с наивысшим рейтингом и случайно наступил на своё говно наткнулся на свой.
      Ответить
      • Переделал? Покажи новую версию.
        Ответить
        • У меня уже давно всё на шейдерах, а там такие функции не нужны. При рендеринге в текстуру и чтении из текстуры преобразование в нужный формат происходит автоматически. И клампить в диапазон [0; 1] тоже не нужно, так как никакого переполнения не происходит. В зависимости от формата цели рендеринга шейдер или сохраняет как есть, или автоматически усекает.
          Ответить

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