Advertisement
Guest User

Untitled

a guest
Jul 28th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.39 KB | None | 0 0
  1. #target "illustrator"
  2.  
  3. // 選択パスのうち最前面のもののfillColor(CMYKグラデーション)をソースとして、
  4. // その他の選択パスのfillColorを、選択パス(最前面を除く)を囲む
  5. // 矩形範囲の対角線(左上→右下)を基準にした位置にあたるソース上の色の云々
  6. // TODO: midPoint, opacity を考慮する
  7.  
  8. (function(){
  9. function main(){
  10. // selectionは全てpathItemとする
  11. var sel = app.activeDocument.selection;
  12. if(sel.length < 2) return;
  13.  
  14. // 最前面のパスのfillColor(CMYKグラデーション)をソースにする
  15. var grad = sel[0].fillColor;
  16. if(isGradInvalid(grad)) return;
  17. var stops = grad.gradient.gradientStops;
  18.  
  19. // 選択範囲全体の矩形範囲(最前面を除く)を取得
  20. var rect = getSelBounds(sel);
  21.  
  22. // 色作成用function
  23. var getColorOnDiagonal = getColorOnDiagonalFunc(rect, stops);
  24. if(!getColorOnDiagonal) return;
  25.  
  26. // 色を割り当て
  27. for(var i = 1; i < sel.length; i++){
  28. var center = getCenter(sel[i]);
  29. sel[i].fillColor = getColorOnDiagonal(center);
  30. }
  31. }
  32. // ---------------------------------------------------------------
  33. // グラデーションが不適切な場合に true を返す。
  34. // grad = GradientColor ?
  35. function isGradInvalid(grad){
  36. if(!grad || grad.typename != "GradientColor"){
  37. alert("最前面パスの色がグラデーションではありません");
  38. return true;
  39. }
  40. var stops = grad.gradient.gradientStops;
  41. for(var i = 0; i < stops.length; i++){
  42. if(stops[i].color.typename != "CMYKColor"
  43. && stops[i].color.typename != "GrayColor"){
  44. alert("グラデーションにCMYK, グレースケール以外の色が含まれています");
  45. return true;
  46. }
  47. }
  48. return false;
  49. }
  50. // ---------------------------------------------------------------
  51. function getSelBounds(sel){
  52. var rect = { left:0, top:0, right:0, bottom:0, width:0, height:0 };
  53.  
  54. // 最前面は除く
  55. var idx = 1;
  56. var gb = sel[idx].geometricBounds;
  57. rect.left = gb[0];
  58. rect.top = gb[1];
  59. rect.right = gb[2];
  60. rect.bottom = gb[3];
  61.  
  62. for(var i = idx, iEnd = sel.length; i < iEnd; i++){
  63. gb = sel[i].geometricBounds;
  64. if(gb[0] < rect.left) rect.left = gb[0];
  65. if(gb[1] > rect.top) rect.top = gb[1];
  66. if(gb[2] > rect.right) rect.right = gb[2];
  67. if(gb[3] < rect.bottom) rect.bottom = gb[3];
  68. }
  69.  
  70. rect.width = rect.right - rect.left;
  71. rect.height = rect.top - rect.bottom;
  72. return rect;
  73. }
  74.  
  75. // ---------------------------------------------------------------
  76. var getCenter = function(p){
  77. var gb = p.geometricBounds; // left, top, right, bottom
  78. return [(gb[0] + gb[2]) / 2, (gb[1] + gb[3]) / 2];
  79. }
  80. // ---------------------------------------------------------------
  81. function mix(c1, c2, p1, p2){
  82. return Math.min(100, c1 * p1 + c2 * p2);
  83. }
  84. // ---------------------------------------------------------------
  85. function getColorOfGradationAtPercent(stops, p){
  86. // stops = grad.gradient.gradientStops
  87. // p = 対角線左上=0, 右下=100 とした対角線上の位置
  88.  
  89. // TODO: midPoint, opacity
  90. // midPoint, opacity は考慮されていません
  91.  
  92. if(p <= stops[0].rampPoint) return stops[0].color;
  93. if(p >= stops[stops.length - 1].rampPoint) return stops[stops.length - 1].color;
  94.  
  95. var idx = 0;
  96. for(var i = 1; i < stops.length; i++){
  97. if(p < stops[i].rampPoint){
  98. idx = i;
  99. break;
  100. }
  101. }
  102. var loc = p - stops[idx - 1].rampPoint;
  103. var range = stops[idx].rampPoint - stops[idx - 1].rampPoint;
  104. if(range == 0) return stops[idx].color;
  105.  
  106. var p1 = loc / range;
  107. var p2 = 1 - p1;
  108. var c1 = fixColor(stops[idx - 1].color);
  109. var c2 = fixColor(stops[idx].color);
  110.  
  111. var c = new CMYKColor();
  112. c.cyan = mix(c1.cyan, c2.cyan, p2, p1);
  113. c.magenta = mix(c1.magenta, c2.magenta, p2, p1);
  114. c.yellow = mix(c1.yellow, c2.yellow, p2, p1);
  115. c.black = mix(c1.black, c2.black, p2, p1);
  116. return c;
  117. }
  118. // ---------------------------------------------------------------
  119. function fixColor(c){
  120. if(c.typename == "CMYKColor") return c;
  121. if(c.typename == "GrayColor"){
  122. var c1 = new CMYKColor();
  123. c1.cyan = 0;
  124. c1.magenta = 0;
  125. c1.yellow = 0;
  126. c1.black = c.gray;
  127. return c1;
  128. }
  129. }
  130. // ---------------------------------------------------------------
  131. function getColorOnDiagonalFunc(rect, stops){
  132. var wh = rect.width * rect.height;
  133. if(wh == 0) return;
  134. var wh2 = 2 * wh;
  135.  
  136. var getColorOnDiagonal = function(point){
  137. var x = point[0] - rect.left;
  138. var y = point[1] - rect.bottom;
  139. var p = 100 * (wh + rect.height * x - rect.width * y) / wh2; // wh2 != 0
  140.  
  141. var c = getColorOfGradationAtPercent(stops, p);
  142. return c;
  143. }
  144. return getColorOnDiagonal;
  145. }
  146.  
  147. main();
  148. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement