1779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger-- Experimental helpers for skia --
2779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerfunction string.startsWith(String,Start)
458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger   return string.sub(String,1,string.len(Start))==Start
558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerend
658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerfunction string.endsWith(String,End)
858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger   return End=='' or string.sub(String,-string.len(End))==End
958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerend
1058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerSk = {}
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.isFinite(x)
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return x * 0 == 0
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger-------------------------------------------------------------------------------
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerSk.Rect = { left = 0, top = 0, right = 0, bottom = 0 }
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerSk.Rect.__index = Sk.Rect
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect.new(l, t, r, b)
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    local rect
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    if r then
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        -- 4 arguments
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        rect = { left = l, top = t, right = r, bottom = b }
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    elseif l then
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        -- 2 arguments
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        rect = { right = l, bottom = t }
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    else
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        -- 0 arguments
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        rect = {}
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    end
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    setmetatable(rect, Sk.Rect)
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return rect;
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:width()
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return self.right - self.left
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:height()
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return self.bottom - self.top
457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:isEmpty()
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return self:width() <= 0 or self:height() <= 0
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:isFinite()
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    local value = self.left * 0
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    value = value * self.top
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    value = value * self.right
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    value = value * self.bottom
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    return 0 == value
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:setEmpty()
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.left = 0
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.top = 0
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.right = 0
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.bottom = 0
647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:set(l, t, r, b)
677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.left = l
687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.top = t
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.right = r
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.bottom = b
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:offset(dx, dy)
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    dy = dy or dx
757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.left = self.left + dx
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.top = self.top + dy
787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.right = self.right + dx
797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.bottom = self.bottom + dy
807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerfunction Sk.Rect:inset(dx, dy)
837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    dy = dy or dx
847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.left = self.left + dx
867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.top = self.top + dy
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.right = self.right - dx
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    self.bottom = self.bottom - dy
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerend
907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger-------------------------------------------------------------------------------
92