Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2012
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.80 KB | None | 0 0
  1. -- Пример написания скрипта часов
  2. -- Так как при выводе часов используются команды на языке cairo
  3. -- необходимо указать программе об этом
  4.  
  5. require 'cairo'
  6.  
  7. -- создаем функцию для вывода изображения часов
  8.  
  9. function conky_clock ()
  10.  
  11. -- необходимые данные для вывода часов
  12.  
  13. clock_settings = {
  14.  
  15. {
  16. -- корпус часов
  17. width_housing_hours = 15, -- толщина корпуса часов
  18. color_housing_hours = 0x5b5b5b, -- цвет корпуса часов
  19. alpha_housing_hours = 1, -- насыщенность цвета
  20. -- циферблат
  21. -- x = 150, -- координаты часов по горизонтали
  22. y = 150, -- координаты часов по вертикали
  23. radius = 85, -- радиус часов
  24. color_dial = 0xffffff, -- цвет циферблата
  25. alpha_dial = 1, -- насыщенность цвета
  26. -- цифры
  27. font_size = 16, -- размер шрифта цифр
  28. bold = true,
  29. color_font = 0x000000, -- цвет цифр
  30. alpha_font = 1, -- насыщенность цвета
  31. -- стрелки
  32. border = true, -- контур стрелок Да - true, Нет - false.
  33. width_hour_hand = 2.5, -- ширина часовой стрелки
  34. length_hour_hand = 1.4, -- длина часовой стрелки
  35. color_hour_hand = 0xeeeeee, -- цвет часовой стрелки
  36. alpha_hour_hand = 1, -- насыщенность цвета
  37. color_border_hour = 0x000000, -- цвет контура часовой стрелки
  38. alpha_border_hour = 0.8, -- насыщенность цвета
  39.  
  40. width_minute_hand = 2, -- ширина минутной стрелки
  41. length_minute_hand = 1.9, -- длина минутной стрелки
  42. color_minute_hand = 0xffffff, -- цвет минутной стрелки
  43. alpha_minute_hand = 0.8, -- насыщенность цвета
  44. color_border_minute = 0x000000, -- цвет контура минутной стрелки
  45. alpha_border_minute = 0.8, -- насыщенность цвета
  46. -- Выводить секундную стрелку, Да - true, Нет - false.
  47. -- При выводе секундной стрелки update_interval в .conkyrc должен быть менее 1 сек.
  48. show_seconds = true, -- вывод секундной стрелки
  49. width_second_hand = 1, -- ширина секундной стрелки
  50. length_second_hand = 1.9, -- длина секундной стрелки
  51. color_second_hand = 0xff0000, -- цвет секундной стрелки
  52. alpha_second_hand = 1, -- насыщенность цвета
  53. color_border_second = 0xff0000, -- цвет контура секундной стрелки
  54. alpha_border_second = 1, -- насыщенность цвета
  55. -- тень от стрелок и оси стрелок Да - true, Нет - false.
  56. shadow = false, -- вывод тени
  57. -- координаты источника света относительно центра часов, 0 - источник света над центром часов
  58. shadow_degree = -90, -- координаты источника света по горизонтали от -90 до 90
  59. shadow_height = 25, -- координаты источника света по вертикали от -90 до 90
  60. shadow_opacity = 0.5, -- прозрачность тени, значения от 0 до 1
  61.  
  62.  
  63. }
  64. }
  65.  
  66. -- проверяем, существует окно конки или нет, если нет, выходим из программы
  67.  
  68. if conky_window == nil then return end
  69.  
  70. --
  71. local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
  72.  
  73. -- вызываем функцию вывода часов на экран
  74.  
  75. for i, v in pairs(clock_settings) do
  76. cr = cairo_create (cs)
  77. display_clock (v)
  78. cairo_destroy (cr)
  79. end
  80. end
  81.  
  82. -- функция перекодировки цвета
  83.  
  84. function rgb_to_r_g_b(colour,alpha)
  85. return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
  86. end
  87.  
  88. -- функция рисования часов
  89.  
  90. function display_clock (t)
  91.  
  92. -- производим проверку вводимых данных и задаем значения по умолчанию
  93.  
  94. if t.x == nil then t.x = conky_window.width/2 end
  95. if t.y == nil then t.y = conky_window.height end
  96. if t.radius == nil then t.radius = 75 end
  97. if t.color_dial == nil then t.color_dial = 0xffffff end
  98. if t.alpha_dial == nil then t.alpha_dial = 1 end
  99. -- цифры
  100. if t.font_name == nil then t.font_name = "Ubuntu" end
  101. if t.font_size == nil then t.font_size = 12 end
  102. if t.italic == nil then t.italic = false end
  103. if t.oblique == nil then t.oblique = false end
  104. if t.bold == nil then t.bold = false end
  105. if t.color_font == nil then t.color = 0x000000 end
  106. if t.alpha_font == nil then t.alpha = 1 end
  107.  
  108.  
  109. -- шрифт
  110. local slant = CAIRO_FONT_SLANT_NORMAL
  111. local weight =CAIRO_FONT_WEIGHT_NORMAL
  112.  
  113. if t.italic then slant = CAIRO_FONT_SLANT_ITALIC end
  114. if t.bold then weight = CAIRO_FONT_WEIGHT_BOLD end
  115.  
  116. cairo_select_font_face(cr, t.font_name, slant, weight)
  117.  
  118. cairo_set_font_size(cr, t.font_size)
  119.  
  120. te=cairo_text_extents_t:create()
  121. cairo_text_extents (cr,t.text,te)
  122. -- ----------------------------------------------------------
  123. -- корпус часов, циферблат и тени на корпусе
  124. -- рисуем белую основу для нормальной цветопередачи на темных обоях
  125. cairo_set_source_rgba(cr, 1, 1, 1, 1)
  126. cairo_arc (cr, t.x, t.y, t.radius + t.width_housing_hours*1.2, 0, 2*math.pi)
  127. cairo_fill (cr)
  128. -- создаем радиальную градацию для внешней части корпуса
  129. pat_housing_hours1 = cairo_pattern_create_radial (t.x - t.radius*math.sin(math.rad(t.shadow_degree)), t.y - t.radius*math.sin(math.rad(t.shadow_height)), 0, t.x, t.y, t.radius + t.width_housing_hours*1.7)
  130. -- задаём цвет
  131. cairo_pattern_add_color_stop_rgba (pat_housing_hours1, 0.85, rgb_to_r_g_b(t.color_housing_hours, 0.2))
  132. cairo_pattern_add_color_stop_rgba (pat_housing_hours1, 1, rgb_to_r_g_b(t.color_housing_hours, t.alpha_housing_hours))
  133. -- закрашиваем корпус
  134. cairo_set_source (cr, pat_housing_hours1)
  135. cairo_set_line_width(cr, t.width_housing_hours/2)
  136. cairo_arc (cr, t.x, t.y, t.radius + t.width_housing_hours, 0, 2*math.pi)
  137. -- выводим изображение
  138. cairo_stroke (cr)
  139. cairo_fill (cr)
  140. cairo_pattern_destroy (pat_housing_hours1)
  141. -- создаём радиальную градацию для внутренней части корпуса
  142. pat_housing_hours2 = cairo_pattern_create_radial (t.x + t.radius*math.sin(math.rad(t.shadow_degree)), t.y + t.radius*math.sin(math.rad(t.shadow_height)), 0, t.x, t.y, t.radius + t.width_housing_hours*1.2)
  143. -- задаём цвет
  144. cairo_pattern_add_color_stop_rgba (pat_housing_hours2, 0.75, rgb_to_r_g_b(t.color_housing_hours, 0.2))
  145. cairo_pattern_add_color_stop_rgba (pat_housing_hours2, 1, rgb_to_r_g_b(t.color_housing_hours, t.alpha_housing_hours))
  146. -- закрашиваем корпус
  147. cairo_set_source (cr, pat_housing_hours2)
  148. cairo_set_line_width(cr, t.width_housing_hours/2)
  149. cairo_arc (cr, t.x, t.y, t.radius + t.width_housing_hours/2, 0, 2*math.pi)
  150. -- выводим изображение
  151. cairo_stroke (cr)
  152. cairo_fill (cr)
  153. cairo_pattern_destroy (pat_housing_hours2)
  154. -- вывод циферблата
  155. -- сначала зададим цвет
  156. cairo_set_source_rgba(cr, rgb_to_r_g_b(t.color_dial, t.alpha_dial))
  157. -- и толщину линии
  158. cairo_set_line_width(cr, 2)
  159. -- рисуем окружность
  160. cairo_arc (cr, t.x, t.y, t.radius, 0, 2*math.pi)
  161. -- закрашиваем циферблат
  162. cairo_fill (cr)
  163. -- ----------------------------------------------------------------------------------------
  164. -- добавляем часовые деления
  165. -- зададим цвет
  166. cairo_set_source_rgba(cr, rgb_to_r_g_b(t.color_font, t.alpha_font))
  167. -- сбрасываем счетчик делений на 0
  168. local i = 0
  169. -- задаем расстояние между делениями
  170. local winkel = math.rad(30)
  171. -- выводим 12 делений
  172. for i= 0, 11, 1 do
  173. cairo_move_to(cr, t.x - math.sin(winkel*i)*t.radius, t.y - math.cos(winkel*i)*t.radius)
  174. -- длину делений берем равной 0.1 от длины радиуса
  175. cairo_line_to(cr, t.x - math.sin(winkel*i)*(t.radius*0.85), t.y - math.cos(winkel*i)*(t.radius*0.85))
  176.  
  177. -- выводим изображение
  178. cairo_stroke (cr)
  179. end
  180. -- -------------------------------------------------------------------------------------------
  181. -- добавляем цифры
  182. -- запоминаем данные
  183. cairo_save (cr)
  184. -- переносим значения координат
  185. cairo_translate(cr, t.x, t.y)
  186. -- сбрасываем координаты цифр
  187. local mx = 0
  188. local my = 0
  189. -- сбрасываем счетчик делений на 0
  190. local i = 0
  191. -- задаем расстояние между цифрами
  192. local winkel = math.rad(30)
  193. -- необходимо вывести цифра начиная с 1 и заканчивая 12
  194. for i = 1, 12, 1 do
  195. -- расчитываем координаты цифр
  196. mov_x = math.sin(winkel*i)*(t.radius*0.73)
  197. mov_y = math.cos(winkel*i)*(t.radius*0.73)
  198. -- расчитываем ширину и высоту цифр
  199. te=cairo_text_extents_t:create()
  200. cairo_text_extents (cr,i,te)
  201. -- вносим поправку на половину ширины и половину высоты цифр
  202. mx = -te.width/2
  203. my = -te.height/2-te.y_bearing
  204. -- задаем координаты цифр
  205. cairo_move_to(cr, mx + mov_x, my - mov_y)
  206. -- выводим цифры
  207. cairo_show_text(cr, i)
  208.  
  209. end
  210. -- восстанавливаем данные
  211. cairo_restore (cr)
  212. -- ------------------------------------------------------------------------------------------
  213. -- добавляем минутные деления
  214. -- сбрасываем счетчик делений на 0
  215. local i = 0
  216. -- задаем расстояние между делениями
  217. local winkel = math.rad(6)
  218. -- выводим 12 делений
  219. for i=0, 59, 1 do
  220. cairo_move_to(cr, t.x - math.sin(winkel * i) * t.radius, t.y - math.cos(winkel * i) * t.radius)
  221. -- длину делений берем равной 0.1 от длины радиуса
  222. cairo_line_to(cr, t.x - math.sin(winkel * i) * (t.radius * 0.9), t.y - math.cos(winkel * i) * (t.radius*0.9))
  223. end
  224. -- выводим изображение
  225. cairo_stroke (cr)
  226. -- ------------------------------------------------------
  227.  
  228. -- рисуем стрелки. За основу взята разработка wlourf, полностью статью можно посмотреть http://u-scripts.blogspot.com/2010/01/shadowed-clock.html
  229. local function draw_hand(arc, arc0, arc1, length_hand, width_hand, color_border, alpha_border, color_hand, alpha_hand)
  230. -- расчет основных точек для прорисовки стрелок
  231. local xx = t.x + t.radius*math.sin(arc)*length_hand
  232. local yy = t.y - t.radius*math.cos(arc)*length_hand
  233. local x0 = t.x + width_hand*math.sin(arc0)
  234. local y0 = t.y - width_hand*math.cos(arc0)
  235. local x1 = t.x + width_hand*math.sin(arc1)
  236. local y1 = t.y - width_hand*math.cos(arc1)
  237. -- если необходимо нарисовать контуры стрелок тогда
  238. if t.border then
  239. -- назначаем толщину линий
  240. cairo_set_line_width(cr, 1)
  241. -- назначаем цвет и насыщенность линий контура стрелок
  242. cairo_set_source_rgba(cr, rgb_to_r_g_b(color_border, alpha_border))
  243. -- переходим в первую точку
  244. cairo_move_to (cr, x0, y0)
  245. -- рисуем кривые проходящие через три точки
  246. cairo_curve_to (cr, x0, y0, xx, yy, x1, y1)
  247. -- рисуем половину окружности основания стрелки
  248. cairo_arc(cr, t.x, t.y, width_hand, arc1 - math.pi/2, arc0 - math.pi/2)
  249. cairo_stroke(cr)
  250. end
  251. -- если необходимо вывести тень от стрелок, длина тени изменяется в зависимости от расположения "источника света"
  252. if t.shadow then
  253. -- переходим в первую точку
  254. cairo_move_to (cr, x0, y0)
  255. -- рисуем кривые через три точки со смещением зависищим от расположения "источника света"
  256. cairo_curve_to (cr, x0, y0, xx + t.shadow_degree, yy + t.shadow_height, x1, y1)
  257. -- рисуем половину окружности основания тени стрелки
  258. cairo_arc(cr, t.x, t.y, width_hand, arc1 - math.pi/2, arc0 - math.pi/2)
  259. -- для закрашивания тени от стрелок используем радиальную окраску
  260. pat = cairo_pattern_create_radial (t.x - math.sin(math.rad(t.shadow_degree))*length_hand, t.y + math.cos(math.rad(t.shadow_degree))*length_hand, 0, t.x, t.y, t.radius)
  261. -- цвет тени черный поэтому на темных циферблатах тень не очень заметна
  262. cairo_pattern_add_color_stop_rgba (pat, 0, 0, 0, 0, t.shadow_opacity)
  263. cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 0)
  264. cairo_set_source (cr, pat)
  265. cairo_fill (cr)
  266. end
  267. -- рисуем стрелки по тому же принципу, что и тень, но без смещения
  268. cairo_move_to (cr, x0, y0)
  269. cairo_curve_to (cr, x0, y0, xx, yy, x1, y1)
  270. cairo_arc(cr, t.x, t.y, width_hand, arc1 - math.pi/2, arc0 - math.pi/2)
  271. pat = cairo_pattern_create_radial (t.x, t.y, t.radius/10, t.x, t.y, t.radius*length_hand)
  272. cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(color_hand, alpha_hand))
  273. cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 1)
  274. cairo_set_source (cr, pat)
  275. cairo_fill (cr)
  276. cairo_pattern_destroy (pat)
  277. end
  278. -- забираем данные из ОС
  279.  
  280. local hours = os.date("%I")
  281. local mins = os.date("%M")
  282. local secs = os.date("%S")
  283.  
  284. -- расчет угла движения стрелок
  285.  
  286. local gamma = math.pi/2 - math.atan(t.width_second_hand / (t.radius * t.length_second_hand))
  287. local secs_arc = (2*math.pi/60)*secs
  288. local secs_arc0 = secs_arc - gamma
  289. local secs_arc1 = secs_arc + gamma
  290.  
  291. local gamma = math.pi/2 - math.atan(t.width_minute_hand/(t.radius*t.length_minute_hand))
  292. local mins_arc = (2*math.pi/60)*mins + secs_arc/60
  293. local mins_arc0 = mins_arc - gamma
  294. local mins_arc1 = mins_arc + gamma
  295.  
  296. local gamma = math.pi/2 - math.atan(t.width_hour_hand/(t.radius*t.length_hour_hand))
  297. local hours_arc = (2*math.pi/12)*hours + mins_arc/12
  298. local hours_arc0 = hours_arc - gamma
  299. local hours_arc1 = hours_arc + gamma
  300.  
  301. -- вывод стрелок
  302. -- задаем данные для вывода часовой стрелки
  303. draw_hand(hours_arc, hours_arc0, hours_arc1, t.length_hour_hand, t.width_hour_hand, t.color_border_hour, t.alpha_border_hour, t.color_hour_hand, t.alpha_hour_hand)
  304. -- задаем данные для минутной стрелки
  305. draw_hand(mins_arc, mins_arc0, mins_arc1, t.length_minute_hand, t.width_minute_hand, t.color_border_minute, t.alpha_border_minute, t.color_minute_hand, t.alpha_minute_hand)
  306. -- если необходима секундная стрелка, то задаем данные
  307. if t.show_seconds then
  308. draw_hand(secs_arc, secs_arc0, secs_arc1, t.length_second_hand, t.width_second_hand, t.color_border_second, t.alpha_border_second, t.color_second_hand, t.alpha_second_hand)
  309. end
  310.  
  311. -- рисуем ось стрелок
  312. -- расчитываем радиус оси стрелок
  313. local radius = math.min(t.width_hour_hand, t.width_minute_hand, t.width_second_hand)*0.75
  314. -- если радиус меньше 1, то устанавливаем радиус равный 1
  315. if radius < 1 then radius = 1 end
  316. -- рисуем ось
  317. cairo_arc(cr, t.x, t.y, radius, 0, 2*math.pi)
  318. cairo_set_source_rgba(cr, 0, 0, 0, 1)
  319. cairo_fill (cr)
  320. -- рисуем тень на стеклк часов
  321. pat_glass = cairo_pattern_create_radial (t.x + t.radius*math.sin(math.rad(t.shadow_degree)), t.y + t.radius*math.sin(math.rad(t.shadow_height)), 0, t.x, t.y, t.radius*1.2)
  322. cairo_pattern_add_color_stop_rgba (pat_glass, 0, 1,1,1,0)
  323. cairo_pattern_add_color_stop_rgba (pat_glass, 1, 0,0,0, 0.3)
  324. cairo_set_source (cr, pat_glass)
  325. cairo_arc (cr, t.x, t.y, t.radius+t.width_housing_hours/2, 0, 2*math.pi)
  326. cairo_fill (cr)
  327. cairo_pattern_destroy (pat_glass)
  328. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement