SVGKParserGradient.m 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. //
  2. // SVGParserLinearGradient.m
  3. // SVGPad
  4. //
  5. // Created by Kevin Stich on 1/31/12.
  6. // Copyright (c) 2012 __MyCompanyName__. All rights reserved.
  7. //
  8. #import "SVGKParserGradient.h"
  9. #import "SVGElement_ForParser.h"
  10. #import "SVGGradientStop.h"
  11. #import "SVGGradientElement.h"
  12. #import "SVGLinearGradientElement.h"
  13. #import "SVGRadialGradientElement.h"
  14. @interface SVGKParserGradient ()
  15. @property (nonatomic) NSArray *supportedNamespaces;
  16. @property (nonatomic) NSArray *supportedTags;
  17. @end
  18. @implementation SVGKParserGradient
  19. -(NSArray *)supportedNamespaces
  20. {
  21. if( _supportedNamespaces == nil )
  22. _supportedNamespaces = @[@"http://www.w3.org/2000/svg"];
  23. return _supportedNamespaces;
  24. }
  25. -(NSArray *)supportedTags
  26. {
  27. if( _supportedTags == nil )
  28. _supportedTags = @[@"linearGradient", @"radialGradient", @"stop"];
  29. return _supportedTags;
  30. }
  31. -(Node *)handleStartElement:(NSString *)name document:(SVGKSource *)document namePrefix:(NSString *)prefix namespaceURI:(NSString *)XMLNSURI attributes:(NSMutableDictionary *)attributes parseResult:(SVGKParseResult *)parseResult parentNode:(Node *)parentNode
  32. {
  33. Node *returnObject = nil;
  34. if( [name isEqualToString:@"linearGradient"] )
  35. {
  36. returnObject = currentElement = [[SVGLinearGradientElement alloc] initWithQualifiedName:name inNameSpaceURI:XMLNSURI attributes:attributes];
  37. [currentElement postProcessAttributesAddingErrorsTo:parseResult];
  38. /** No need to "store" anything; the node has been parsed, it'll be added to the DOM tree, and accessible later via DOM methods -- which is what the SVG spec expects us to do */
  39. }
  40. else if( [name isEqualToString:@"radialGradient"] ) {
  41. returnObject = currentElement = [[SVGRadialGradientElement alloc] initWithQualifiedName:name inNameSpaceURI:XMLNSURI attributes:attributes];
  42. [currentElement postProcessAttributesAddingErrorsTo:parseResult];
  43. }
  44. else if( [name isEqualToString:@"stop"] )
  45. {
  46. SVGGradientStop *gradientStop = [[SVGGradientStop alloc] initWithQualifiedName:name inNameSpaceURI:XMLNSURI attributes:attributes];
  47. [gradientStop postProcessAttributesAddingErrorsTo:parseResult];
  48. returnObject = gradientStop;
  49. [currentElement addStop:gradientStop];
  50. }
  51. // var linearGrad:SVGLinearGradient = grad as SVGLinearGradient;
  52. //                                        
  53. //                                         if("@x1" in xml_grad)
  54. //                                                 linearGrad.x1 = xml_grad.@x1;
  55. //                                         else if(linearGrad.x1 == null)
  56. //                                                 linearGrad.x1 = "0%";
  57. //                                        
  58. //                                         if("@y1" in xml_grad)
  59. //                                                 linearGrad.y1 = xml_grad.@y1;
  60. //                                         else if(linearGrad.y1 == null)
  61. //                                                 linearGrad.y1 = "0%";
  62. //                                        
  63. //                                         if("@x2" in xml_grad)
  64. //                                                 linearGrad.x2 = xml_grad.@x2;
  65. //                                         else if(linearGrad.x2 == null)
  66. //                                                 linearGrad.x2 = "100%";
  67. //                                        
  68. //                                         if("@y2" in xml_grad)
  69. //                                                 linearGrad.y2 = xml_grad.@y2;
  70. //                                         else if(linearGrad.y2 == null)
  71. //                                                 linearGrad.y2 = "0%";
  72. return returnObject;
  73. }
  74. -(void)handleEndElement:(Node *)newNode document:(SVGKSource *)document parseResult:(SVGKParseResult *)parseResult
  75. {
  76. }
  77. //-(void)dealloc
  78. //{
  79. // currentElement = nil;
  80. // [super dealloc];
  81. //}
  82. @end
  83. /*private static function parseGradient(id:String, svg:XML, storeObject:Object):SVGGradient {
  84.                         id = StringUtil.ltrim(id, "#");
  85.                        
  86.                         if(storeObject[id]!=null)
  87.                                 return storeObject[id];
  88.                                                
  89.                         var xml_grad:XML = svg..*.(attribute("id")==id)[0];
  90.                        
  91.                         if(xml_grad == null)
  92.                                 return null;
  93.                        
  94.                         var grad:SVGGradient;
  95.                        
  96.                         switch(xml_grad.localName().toLowerCase()){
  97.                                 case "lineargradient":
  98.                                         grad = new SVGLinearGradient(); break;
  99.                                 case "radialgradient" :
  100.                                         grad = new SVGRadialGradient(); break;
  101.                         }
  102.                        
  103.                         //inherits the href reference
  104.                         var xlink:Namespace = new Namespace("http://www.w3.org/1999/xlink");
  105.                         if(xml_grad.@xlink::href.length()>0){
  106.                                 var baseGradient:SVGGradient = parseGradient(xml_grad.@xlink::href, svg, storeObject);
  107.                                 if(baseGradient)
  108.                                         baseGradient.copyTo(grad);
  109.                         }
  110.                         //
  111.                        
  112.                         if("@gradientUnits" in xml_grad)
  113.                                 grad.gradientUnits = xml_grad.@gradientUnits;
  114.                         else
  115.                                 grad.gradientUnits = "objectBoundingBox";
  116.                        
  117.                         if("@gradientTransform" in xml_grad)
  118.                                 grad.transform = parseTransformation(xml_grad.@gradientTransform);
  119.                        
  120.                         switch(grad.type){
  121.                                 case GradientType.LINEAR : {
  122.                                         var linearGrad:SVGLinearGradient = grad as SVGLinearGradient;
  123.                                        
  124.                                         if("@x1" in xml_grad)
  125.                                                 linearGrad.x1 = xml_grad.@x1;
  126.                                         else if(linearGrad.x1 == null)
  127.                                                 linearGrad.x1 = "0%";
  128.                                        
  129.                                         if("@y1" in xml_grad)
  130.                                                 linearGrad.y1 = xml_grad.@y1;
  131.                                         else if(linearGrad.y1 == null)
  132.                                                 linearGrad.y1 = "0%";
  133.                                        
  134.                                         if("@x2" in xml_grad)
  135.                                                 linearGrad.x2 = xml_grad.@x2;
  136.                                         else if(linearGrad.x2 == null)
  137.                                                 linearGrad.x2 = "100%";
  138.                                        
  139.                                         if("@y2" in xml_grad)
  140.                                                 linearGrad.y2 = xml_grad.@y2;
  141.                                         else if(linearGrad.y2 == null)
  142.                                                 linearGrad.y2 = "0%";
  143.                                         break;
  144.                                 }
  145.                                 case GradientType.RADIAL : {
  146.                                         var radialGrad:SVGRadialGradient = grad as SVGRadialGradient;
  147.                                        
  148.                                         if("@cx" in xml_grad)
  149.                                                 radialGrad.cx = xml_grad.@cx;
  150.                                         else if(radialGrad.cx==null)
  151.                                                 radialGrad.cx = "50%";
  152.                                        
  153.                                         if("@cy" in xml_grad)
  154.                                                 radialGrad.cy = xml_grad.@cy;
  155.                                         else if(radialGrad.cy==null)
  156.                                                 radialGrad.cy = "50%";
  157.                                        
  158.                                         if("@r" in xml_grad)
  159.                                                 radialGrad.r = xml_grad.@r;
  160.                                         else if(radialGrad.r == null)
  161.                                                 radialGrad.r = "50%";
  162.                                        
  163.                                         if("@fx" in xml_grad)
  164.                                                 radialGrad.fx = xml_grad.@fx;
  165.                                         else if(radialGrad.fx==null)
  166.                                                 radialGrad.fx = radialGrad.cx;
  167.                                        
  168.                                         if("@fy" in xml_grad)
  169.                                                 radialGrad.fy = xml_grad.@fy;
  170.                                         else if(radialGrad.fy==null)
  171.                                                 radialGrad.fy = radialGrad.cy;
  172.                                        
  173.                                         break;
  174.                                 }
  175.                         }
  176.                        
  177.                         switch(xml_grad.@spreadMethod){
  178.                                 case "pad" : grad.spreadMethod = SpreadMethod.PAD; break;
  179.                                 case "reflect" : grad.spreadMethod = SpreadMethod.REFLECT; break;
  180.                                 case "repeat" : grad.spreadMethod = SpreadMethod.REPEAT; break;
  181.                                 default: grad.spreadMethod = SpreadMethod.PAD; break
  182.                         }
  183.                        
  184.                         if(grad.colors == null)
  185.                                 grad.colors = new Array();
  186.                        
  187.                         if(grad.alphas==null)
  188.                                 grad.alphas = new Array();
  189.                        
  190.                         if(grad.ratios==null)
  191.                                 grad.ratios = new Array();
  192.                        
  193.                         for each(var stop:XML in xml_grad.*::stop){
  194.                                 var stopStyle:StyleDeclaration = new StyleDeclaration();
  195.                                
  196.                                 if("@stop-opacity" in stop)
  197.                                         stopStyle.setProperty("stop-opacity", stop.@["stop-opacity"]);
  198.                                
  199.                                 if("@stop-color" in stop)
  200.                                         stopStyle.setProperty("stop-color", stop.@["stop-color"]);
  201.                                
  202.                                 if("@style" in stop){
  203.                                         stopStyle.fromString(stop.@style);
  204.                                 }
  205.                                
  206.                                 grad.colors.push( SVGColorUtils.parseToUint(stopStyle.getPropertyValue("stop-color")) );
  207.                                 grad.alphas.push( stopStyle.getPropertyValue("stop-opacity" ) != null ? Number(stopStyle.getPropertyValue("stop-opacity")) : 1 );
  208.                                
  209.                                 var offset:Number = Number(StringUtil.rtrim(stop.@offset, "%"));
  210.                                 if(String(stop.@offset).indexOf("%") > -1){
  211.                                         offset/=100;
  212.                                 }
  213.                                 grad.ratios.push( offset*255 );
  214.                         }
  215.                        
  216.                         //Save the gradient definition
  217.                         storeObject[id] = grad;
  218.                         //
  219.                        
  220.                         return grad;
  221. */