Программирование BASCOM
Меню сайта
Категории каталога
Мои статьи [115]
Наш опрос
Оцените мой сайт
Всего ответов: 1292
Главная » Статьи » Мои статьи

HSV to RGB
Желание искать варианты оптимизации кода для построения ЦМУ натолкнули меня на мысль воспользоватся функцией преобразования цветов человеческой модели в машинную.
Поиск готовой реализации дал несколько результатов, в основном на Си, но и опробование положительных результатов не дало.
Слишком резкое управление яркостью и насыщенностью на одном из краёв диапазона и абсолютный ноль на реакцию в средине и с другого края.


Я разработал свою функцию преобразования HSV в RGB, которая избавлена от этих досадных недостатков. 
255 оттенков, 255 уровней насыщенности, 255 уровней яркости.
Указываем три параметра HSV модели - оттенок, насыщенность и яркость. 
Функция возвращает три значения - уровни яркости для RGB диодов. 
Причём работает она достаточно быстро. Я обрабатывал сразу 16 диодов, никаких тормозов не замечено! 

Ну а вот и формулы, по которым всё это должно считаться!

Для любых оттенка H ∈ [0°, 360°), насыщенности S ∈ [0, 100], и яркости V ∈ [0, 100]:

(Мне пришлось перестроить все параметры на 256, так удобнее, не нужно проверять на корректность - используем полностью байт)

H_i = \left\lfloor {H \over 60} \right\rfloor
V_{min} = {{(100 - S) * V} \over 100}
a = {(V -V_{min})} *{{H \mod 60} \over 60}
V_{inc} = V_{min} + a
V_{dec} = V - a
  • если H_i = 0, то R = V, G = V_{inc}, B = V_{min}
  • если H_i = 1, то R = V_{dec}, G = V, B = V_{min}
  • если H_i = 2, то R = V_{min}, G = V, B = V_{inc}
  • если H_i = 3, то R = V_{min}, G = V_{dec}, B = V
  • если H_i = 4, то R = V_{inc}, G = V_{min}, B = V
  • если H_i = 5, то R = V, G = V_{min}, B = V_{dec}


Полученные значения красного, зелёного и синего каналов RGB исчисляются в процентах. 
Чтобы привести их в соответствие распространённому представлению COLORREF необходимо умножить каждое из них на 2,55.
При целочисленном кодировании для каждого цвета в HSV есть соответствующий цвет в RGB. 
Однако обратное утверждение не является верным: некоторые цвета в RGB нельзя выразить в HSV так, 
чтобы значение каждого компонента было целым. 
Фактически, при таком кодировании доступна только 1/256 часть цветового пространства RGB.



Чтобы сделать радужные переливы, достаточно сделать цикл, в котором менять параметр Hue от 0 до 255 (оттенок). 
А полученные значения RGB выставлять на ШИМ для светодиодов.
Чем меньше задержка в цикле, тем быстрее будут меняться цвета.
Для радужных переливов в обратную сторону достаточно сделать обратный цикл, в котором значения убавляются.
Функция очень удобная с человеческой точки зрения.
Проще ведь для нашего понимания выставить с её помощью бледно-голубой яркий цвет так: (hue = 128 - номер цвета, sat=128 - насыщенность, val=255 - яркость), 
чем тоже самое получить с помощью стандартного RGB: (R=128, G=200, B=255). 
Мы ведь когда определяем цвет, не говорим что он состоит из красного, зелёного и синего в таких-то отношениях?
Мы говорим просто - ярко красный, бледно желтый, светло-зелёный.
На основе этой функции можно сделать многие эффекты.
На основе стандартного RGB  - радуга в одну или другую сторону, мигание цветами, эффект стробоскопа.
Я не видел управления яркостью, а тем более насыщенностью.
А вот с HSV совсем другой коленкор!
Кроме вращения цвета (Hue), можно плавно менять яркость выбранного в данный момент оттенка (Value). 
Например - плавно зажёгся и потух красный, затем также оранжевый, затем жёлтый...
Очень интересно использовать насыщенность. 
Можно получить похожий эффект, только цвет будет не разгораться и тухнуть, а перетекать в белый и проявляться из него.
Можно сделать переход между цветами через белый. 
Можно оперативно регулировать общую яркость или общую насыщенность.
Намного упрощается написание кода, рассчитывающего RGB параметры.
Практически для любого эффекта будет достаточно 1-2 вложенных циклов.

В чём коренное отличие моей функции?
Она учитывает нелинейность светодиодов. 
В таблицах описаны данные при которых всё работает "красиво".
Это результат многих экспериментов.
Вам никто не мешает подстроить всё под себя.
Изменяете в цикле значение цвета, наблюдаете за результатом, корректируете значения в таблице цветов.
Тоже самое с яркостью и насыщенностью.

Я думаю, что код можно ещё оптимизировать.
Также желательно вместо ШИМа применять ВАМ, он намного меньше ресурсов ест.

Попробуйте применить в своих разнообразных цветовых конструкциях, вы сразу же оцените удобство в использовании!


График яркости на каждой ступени для линейного восприятия глазом






'==========Объявление функций==========
'Функция преобразования HSV в RGB
' Вход:
' 0 <= hue < 255 - Hue - оттенок. Основные цвета:
' 0 - красный, 43 - желтый,
' 85 - зеленый, 128 - голубой
' 170 - синий, 213 - пурпурный
' 0 <= sat <= 255 - Saturation - насыщенность - 255 максимум
' 0 <= val <= 255 - Value - яркость - 255 максимум
' Выход:
' 0 <= r,g,b <= 255 - значения красного, зеленого, синего для выбранного канала
Declare Sub Hsv2rgb(byval In_h As Byte , Byval In_s As Byte , Byval In_v As Byte , Out_r As Byte , Out_g As Byte , Out_b As Byte)

'==========Объявление переменных==========
Dim R As Byte                                            'Значение ШИМ для каналов R
Dim G As Byte                                            'Значение ШИМ для каналов G
Dim B As Byte                                            'Значение ШИМ для каналов B




'==========ПРИМЕР ВЫЗОВА ФУНКЦИИ==========
Call Hsv2rgb(0 , 255 , 255 , R , G , B )
'Цвет - красный, насыщенность и яркость - максимальные.
'На выходе - значения RGB для дальнейшего формирования ШИМ или отправки в адресуемые ленты или пиксели




'==========Функция преобразования HSV в RGB==========
'http://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)
Sub Hsv2rgb(byval In_h As Byte , Byval In_s As Byte , Byval In_v As Byte , Out_r As Byte , Out_g As Byte , Out_b As Byte)
   Local Hr As Byte
   Local Hg As Byte
   Local Hb As Byte
   Local Sr As Byte
   Local Sg As Byte
   Local Sb As Byte
   Local Tmp As Byte
   Local Temps As Word

   'Получим логарифмические значения цвета RGB каналов для заданного цвета из расчитанной таблицы
   Hr = Lookup(in_h , Hsv_r)
   Hg = Lookup(in_h , Hsv_g)
   Hb = Lookup(in_h , Hsv_b)

   'Получим значения насыщенности
   In_s = Lookup(in_s , Saturation)
   Temps = Hr * In_s
   Temps = Temps / 256
   Temps = Temps + 255
   Temps = Temps - In_s
   Sr = Temps
   Temps = Hg * In_s
   Temps = Temps / 256
   Temps = Temps + 255
   Temps = Temps - In_s
   Sg = Temps
   Temps = Hb * In_s
   Temps = Temps / 256
   Temps = Temps + 255
   Temps = Temps - In_s
   Sb = Temps

   'Получим значения яркости
   In_v = Lookup(in_v , Value)
   Temps = In_v * Sr
   Temps = Temps / 256
   Out_r = Temps
   Temps = In_v * Sg
   Temps = Temps / 256
   Out_g = Temps
   Temps = In_v * Sb
   Temps = Temps / 256
   Out_b = Temps
End Sub


'==========Насыщенность==========
Saturation:
Data 0 , 6 , 12 , 17 , 22 , 27 , 32 , 37 , 42 , 46 , 51 , 55 , 59 , 64 , 68 , 72
Data 76 , 80 , 84 , 87 , 91 , 94 , 98 , 101 , 105 , 108 , 111 , 114 , 117 , 120 , 123 , 126
Data 129 , 131 , 134 , 137 , 139 , 142 , 144 , 147 , 149 , 151 , 154 , 156 , 158 , 160 , 162 , 164
Data 166 , 168 , 170 , 172 , 174 , 175 , 177 , 179 , 180 , 182 , 184 , 185 , 187 , 188 , 190 , 191
Data 193 , 194 , 195 , 197 , 198 , 199 , 200 , 201 , 203 , 204 , 205 , 206 , 207 , 208 , 209 , 210
Data 211 , 212 , 213 , 214 , 215 , 216 , 217 , 217 , 218 , 219 , 220 , 221 , 221 , 222 , 223 , 224
Data 224 , 225 , 226 , 226 , 227 , 228 , 228 , 229 , 229 , 230 , 231 , 231 , 232 , 232 , 233 , 233
Data 234 , 234 , 235 , 235 , 235 , 236 , 236 , 237 , 237 , 238 , 238 , 238 , 239 , 239 , 240 , 240
Data 240 , 241 , 241 , 241 , 242 , 242 , 242 , 242 , 243 , 243 , 243 , 244 , 244 , 244 , 244 , 245
Data 245 , 245 , 245 , 246 , 246 , 246 , 246 , 246 , 247 , 247 , 247 , 247 , 247 , 248 , 248 , 248
Data 248 , 248 , 248 , 249 , 249 , 249 , 249 , 249 , 249 , 250 , 250 , 250 , 250 , 250 , 250 , 250
Data 250 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 251 , 252 , 252 , 252 , 252 , 252 , 252
Data 252 , 252 , 252 , 252 , 252 , 252 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253 , 253
Data 253 , 253 , 253 , 253 , 253 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254
Data 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 254 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255


'==========Яркость==========
Value:
Data 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1
Data 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2
Data 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3
Data 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4
Data 4 , 4 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 6
Data 6 , 6 , 6 , 6 , 6 , 6 , 6 , 7 , 7 , 7 , 7 , 7 , 7 , 8 , 8 , 8
Data 8 , 8 , 8 , 9 , 9 , 9 , 9 , 9 , 10 , 10 , 10 , 10 , 10 , 11 , 11 , 11
Data 11 , 12 , 12 , 12 , 12 , 13 , 13 , 13 , 14 , 14 , 14 , 14 , 15 , 15 , 15 , 16
Data 16 , 16 , 17 , 17 , 18 , 18 , 18 , 19 , 19 , 20 , 20 , 21 , 21 , 21 , 22 , 22
Data 23 , 23 , 24 , 24 , 25 , 25 , 26 , 27 , 27 , 28 , 28 , 29 , 30 , 30 , 31 , 32
Data 32 , 33 , 34 , 35 , 35 , 36 , 37 , 38 , 39 , 39 , 40 , 41 , 42 , 43 , 44 , 45
Data 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 55 , 56 , 57 , 58 , 59 , 61 , 62 , 63
Data 65 , 66 , 68 , 69 , 71 , 72 , 74 , 76 , 77 , 79 , 81 , 82 , 84 , 86 , 88 , 90
Data 92 , 94 , 96 , 98 , 100 , 102 , 105 , 107 , 109 , 112 , 114 , 117 , 119 , 122 , 125 , 127
Data 130 , 133 , 136 , 139 , 142 , 145 , 148 , 151 , 155 , 158 , 162 , 165 , 169 , 172 , 176 , 180
Data 184 , 188 , 192 , 197 , 201 , 205 , 210 , 214 , 219 , 224 , 229 , 234 , 239 , 244 , 250 , 255


'==========Цветовой тон для R==========
Hsv_r:
'От красного до желтого - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От желтого до зеленого - 42 ступени
Data 223 , 192 , 170 , 148 , 130 , 113 , 99 , 86 , 76 , 66 , 58 , 50 , 44 , 38 , 34 , 29 , 26 , 22 , 20 , 17 , 15
Data 13 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 0
'От зеленого до голубого - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От голубого до синего - 42 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От синего до фиолетового - 43 ступени
Data 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15
Data 17 , 20 , 22 , 26 , 29 , 34 , 38 , 44 , 50 , 58 , 66 , 76 , 86 , 99 , 113 , 130 , 148 , 170 , 192 , 223 , 255
'От фиолетового до красного - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255


'==========Цветовой тон для G==========
Hsv_g:
'От красного до желтого - 43 ступени
Data 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15
Data 17 , 20 , 22 , 26 , 29 , 34 , 38 , 44 , 50 , 58 , 66 , 76 , 86 , 99 , 113 , 130 , 148 , 170 , 192 , 223 , 255
'От желтого до зеленого - 42 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От зеленого до голубого - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От голубого до синего - 42 ступени
Data 223 , 192 , 170 , 148 , 130 , 113 , 99 , 86 , 76 , 66 , 58 , 50 , 44 , 38 , 34 , 29 , 26 , 22 , 20 , 17 , 15
Data 13 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 0
'От синего до фиолетового - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От фиолетового до красного - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0


'==========Цветовой тон для B==========
Hsv_b:
'От красного до желтого - 43 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От желтого до зеленого - 42 ступени
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
'От зеленого до голубого - 43 ступени
Data 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15
Data 17 , 20 , 22 , 26 , 29 , 34 , 38 , 44 , 50 , 58 , 66 , 76 , 86 , 99 , 113 , 130 , 148 , 170 , 192 , 223 , 255
'От голубого до синего - 42 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От синего до фиолетового - 43 ступени
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
Data 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255
'От фиолетового до красного - 43 ступени
Data 223 , 192 , 170 , 148 , 130 , 113 , 99 , 86 , 76 , 66 , 58 , 50 , 44 , 38 , 34 , 29 , 26 , 22 , 20 , 17 , 15
Data 13 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 4 , 3 , 3 , 3 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 0





Ну  и на всякий случай привожу код формирования ШИМ посредством ВАМ :) Его прислал один из тестеров функции.

'---------------------------------------------
$regfile = "m8def.dat"
$crystal = 4000000
$swstack = 256
$framesize = 256
'---------------------------------------------
Dim M_count As Byte
Dim Rgb(8) As Byte
Dim Tabl(8) As Byte
Led01 Alias Portd.0
Led02 Alias Portd.1
Led03 Alias Portd.2
Led04 Alias Portd.3
Led05 Alias Portd.4
Led06 Alias Portd.5
Led07 Alias Portd.6
Led08 Alias Portd.7
'---------------------------------------------
Config Timer0 = Timer , Prescale = 256
Config Portd = Output
'---------------------------------------------
Enable Interrupts
Enable Timer0
On Timer0 Bam
'---------------------------------------------
Rgb(1) = 7
Rgb(2) = 248
Rgb(3) = 7
Rgb(4) = 15
Rgb(5) = 31
Rgb(6) = 63
Rgb(7) = 127
Rgb(8) = 240
'----------------------------------------------
 'Таблица для BAM
Tabl(1) = 254
Tabl(2) = 253                                              
Tabl(3) = 251
Tabl(4) = 247
Tabl(5) = 239
Tabl(6) = 223
Tabl(7) = 191
Tabl(8) = 127

'---------------------------------------------
'Главный цикл
Do
'А здесь должны быть ваши эффекты!

Loop
End
'---------------------------------------------

'---------------------------------------------
'Прерывание от Таймера 0
Bam:

Disable Timer0

If Rgb(1).m_count = 1 Then Set Led01 Else Reset Led01
If Rgb(2).m_count = 1 Then Set Led02 Else Reset Led02
If Rgb(3).m_count = 1 Then Set Led03 Else Reset Led03
If Rgb(4).m_count = 1 Then Set Led04 Else Reset Led04
If Rgb(5).m_count = 1 Then Set Led05 Else Reset Led05
If Rgb(6).m_count = 1 Then Set Led06 Else Reset Led06
If Rgb(7).m_count = 1 Then Set Led07 Else Reset Led07
If Rgb(8).m_count = 1 Then Set Led08 Else Reset Led08

M_count = M_count + 1
Timer0 = Tabl(m_count)
If M_count = 8 Then M_count = 0
Enable Timer0

Return
'---------------------------------------------



Я надеюсь, что эта информация вам будет полезной и вы сможете применить её в своих конструкциях.

С уважением, Рубашка В.Н. (Radan)



Категория: Мои статьи | Добавил: bascom (04.10.2013)
Просмотров: 8737 | Комментарии: 5
Всего комментариев: 5
4 Vladimir  
0
Здравствуйте подскажите а можно ли ваш код перенести на си, просто программирую в atmel studio. и наткнулся на проблему то что нельзя создать массивы под цвета, насыщенность и яркость, под них сразу выделяется память! не подскажете есть ли возможность использовать что-то наподобие DATA, в си? чтоб под массивы сразу память не выделялась? smile

5 bascom  
0
К сожалению, на Си я не помощник...

3 sasha_1973  
0
Даааа уж!

Нет слов, одни выражения, и все нецензурные (в лучшем смысле слова)!

100 баллов из 5-ти возможных!

2 KoSS_89  
0
Спасибо

1 Alma  
0
Спасибо за статью, очень красиво.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright Radan Studio © 2024