Fill.hx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package h2d.css;
  2. import h2d.css.Defs;
  3. class Fill extends h2d.TileGroup {
  4. public function new(?parent) {
  5. super(h2d.Tile.fromColor(0xFFFFFFFF), parent);
  6. }
  7. public inline function fillRectColor(x, y, w, h, c) {
  8. content.rectColor(x, y, w, h, c);
  9. }
  10. public inline function fillRectGradient(x, y, w, h, ctl, ctr, cbl, cbr) {
  11. content.rectGradient(x, y, w, h, ctl, ctr, cbl, cbr);
  12. }
  13. public inline function addPoint(x, y, color) {
  14. content.addPoint(x, y, color);
  15. }
  16. public function fillRect(fill:FillStyle,x,y,w,h) {
  17. switch( fill ) {
  18. case Transparent:
  19. case Color(c):
  20. fillRectColor(x,y,w,h,c);
  21. case Gradient(a,b,c,d):
  22. fillRectGradient(x,y,w,h,a,b,c,d);
  23. }
  24. }
  25. inline function clerp(c1:Int,c2:Int,v:Float) {
  26. var a = Std.int( (c1>>>24) * (1-v) + (c2>>>24) * v );
  27. var r = Std.int( ((c1>>16)&0xFF) * (1-v) + ((c2>>16)&0xFF) * v );
  28. var g = Std.int( ((c1>>8)&0xFF) * (1-v) + ((c2>>8)&0xFF) * v );
  29. var b = Std.int( (c1&0xFF) * (1-v) + (c2&0xFF) * v );
  30. return (a << 24) | (r << 16) | (g << 8) | b;
  31. }
  32. public function lineRect(fill:FillStyle, x:Float, y:Float, w:Float, h:Float, size:Float) {
  33. if( size <= 0 ) return;
  34. switch( fill ) {
  35. case Transparent:
  36. case Color(c):
  37. fillRectColor(x,y,w,size,c);
  38. fillRectColor(x,y+h-size,w,size,c);
  39. fillRectColor(x,y+size,size,h-size*2,c);
  40. fillRectColor(x+w-size,y+size,size,h-size*2,c);
  41. case Gradient(a,b,c,d):
  42. var px = size / w;
  43. var py = size / h;
  44. var a2 = clerp(a,c,py);
  45. var b2 = clerp(b,d,py);
  46. var c2 = clerp(a,c,1-py);
  47. var d2 = clerp(b,d,1-py);
  48. fillRectGradient(x,y,w,size,a,b,a2,b2);
  49. fillRectGradient(x,y+h-size,w,size,c2,d2,c,d);
  50. fillRectGradient(x,y+size,size,h-size*2,a2,clerp(a2,b2,px),c2,clerp(c2,d2,px));
  51. fillRectGradient(x+w-size,y+size,size,h-size*2,clerp(a2,b2,1-px),b2,clerp(c2,d2,1-px),d2);
  52. }
  53. }
  54. }