SVGColors.Mod 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. MODULE SVGColors;
  2. IMPORT Strings, SVGUtilities, Raster;
  3. (* Constants defining colors in the format 0RRGGBBAAH *)
  4. CONST
  5. Aliceblue* = LONGINT(0F0F8FFFFH);
  6. Antiquewhite* = LONGINT(0FAEBD7FFH);
  7. Aqua* = 000FFFFFFH;
  8. Aquamarine* = 07FFFD4FFH;
  9. Azure* = LONGINT(0F0FFFFFFH);
  10. Beige* = LONGINT(0F5F5DCFFH);
  11. Bisque* = LONGINT(0FFE4C4FFH);
  12. Black* = 0000000FFH;
  13. Blanchedalmond* = LONGINT(0FFEBCDFFH);
  14. Blue* = 00000FFFFH;
  15. Blueviolet* = LONGINT(08A2BE2FFH);
  16. Brown* = LONGINT(0A52A2AFFH);
  17. Burlywood* = LONGINT(0DEB887FFH);
  18. Cadetblue* = 05F9EA0FFH;
  19. Chartreuse* = 07FFF00FFH;
  20. Chocolate* = LONGINT(0D2691EFFH);
  21. Coral* = LONGINT(0FF7F50FFH);
  22. Cornflowerblue* = 06495EDFFH;
  23. Cornsilk* = LONGINT(0FFF8DCFFH);
  24. Crimson* = LONGINT(0DC143CFFH);
  25. Cyan* = 000FFFFFFH;
  26. Darkblue* = 000008BFFH;
  27. Darkcyan* = 0008B8BFFH;
  28. Darkgoldenrod* = 0008B8BFFH;
  29. Darkgray* = LONGINT(0A9A9A9FFH);
  30. Darkgreen* = 0006400FFH;
  31. Darkgrey* = LONGINT(0A9A9A9FFH);
  32. Darkkhaki* = LONGINT(0BDB76BFFH);
  33. Darkmagenta* = LONGINT(08B008BFFH);
  34. Darkolivegreen* = 0556B2FFFH;
  35. Darkorange* = LONGINT(0FF8C00FFH);
  36. Darkorchid* = LONGINT(09932CCFFH);
  37. Darkred* = LONGINT(08B0000FFH);
  38. Darksalmon* = LONGINT(0E9967AFFH);
  39. Darkseagreen* = LONGINT(08FBC8FFFH);
  40. Darkslateblue* = 0483D8BFFH;
  41. Darkslategray* = 02F4F4FFFH;
  42. Darkslategrey* = 02F4F4FFFH;
  43. Darkturquoise* = 000CED1FFH;
  44. Darkviolet* = LONGINT(09400D3FFH);
  45. Deeppink* = LONGINT(0FF1493FFH);
  46. Deepskyblue* = 000BFFFFFH;
  47. Dimgray* = 0696969FFH;
  48. Dimgrey* = 0696969FFH;
  49. Dodgerblue* = 01E90FFFFH;
  50. Firebrick* = LONGINT(0B22222FFH);
  51. Floralwhite* = LONGINT(0FFFAF0FFH);
  52. Forestgreen* = 0228B22FFH;
  53. Fuchsia* = LONGINT(0FF00FFFFH);
  54. Gainsboro* = LONGINT(0DCDCDCFFH);
  55. Ghostwhite* = LONGINT(0F8F8FFFFH);
  56. Gold* = LONGINT(0FFD700FFH);
  57. Goldenrod* = LONGINT(0DAA520FFH);
  58. Gray* = LONGINT(0808080FFH);
  59. Grey* = LONGINT(0808080FFH);
  60. Green* = 0008000FFH;
  61. Greenyellow* = LONGINT(0ADFF2FFFH);
  62. Honeydew* = LONGINT(0F0FFF0FFH);
  63. Hotpink* = LONGINT(0FF69B4FFH);
  64. Indianred* = LONGINT(0CD5C5CFFH);
  65. Indigo* = 04B0082FFH;
  66. Ivory* = LONGINT(0FFFFF0FFH);
  67. Khaki* = LONGINT(0F0E68CFFH);
  68. Lavender* = LONGINT(0E6E6FAFFH);
  69. Lavenderblush* = LONGINT(0FFF0F5FFH);
  70. Lawngreen* = 07CFC00FFH;
  71. Lemonchiffon* = LONGINT(0FFFACDFFH);
  72. Lightblue* = LONGINT(0ADD8E6FFH);
  73. Lightcoral* = LONGINT(0F08080FFH);
  74. Lightcyan* = LONGINT(0E0FFFFFFH);
  75. Lightgoldenrodyellow* = LONGINT(0FAFAD2FFH);
  76. Lightgray* = LONGINT(0D3D3D3FFH);
  77. Lightgreen* = LONGINT(090EE90FFH);
  78. Lightgrey* = LONGINT(0D3D3D3FFH);
  79. Lightpink* = LONGINT(0FFB6C1FFH);
  80. Lightsalmon* = LONGINT(0FFA07AFFH);
  81. Lightseagreen* = 020B2AAFFH;
  82. Lightskyblue* = LONGINT(087CEFAFFH);
  83. Lightslategray* = 0778899FFH;
  84. Lightslategrey* = 0778899FFH;
  85. Lightsteelblue* = LONGINT(0B0C4DEFFH);
  86. Lightyellow* = LONGINT(0FFFFE0FFH);
  87. Lime* = 000FF00FFH;
  88. Limegreen* = 032CD32FFH;
  89. Linen* = LONGINT(0FAF0E6FFH);
  90. Magenta* = LONGINT(0FF00FFFFH);
  91. Maroon* = LONGINT(0800000FFH);
  92. Mediumaquamarine* = 066CDAAFFH;
  93. Mediumblue* = 00000CDFFH;
  94. Mediumorchid* = LONGINT(0BA55D3FFH);
  95. Mediumpurple* = LONGINT(09370DBFFH);
  96. Mediumseagreen* = 03CB371FFH;
  97. Mediumslateblue* = 07B68EEFFH;
  98. Mediumspringgreen* = 000FA9AFFH;
  99. Mediumturquoise* = 048D1CCFFH;
  100. Mediumvioletred* = LONGINT(0C71585FFH);
  101. Midnightblue* = 0191970FFH;
  102. Mintcream* = LONGINT(0F5FFFAFFH);
  103. Mistyrose* = LONGINT(0FFE4E1FFH);
  104. Moccasin* = LONGINT(0FFE4B5FFH);
  105. Navajowhite* = LONGINT(0FFDEADFFH);
  106. Navy* = 0000080FFH;
  107. Oldlace* = LONGINT(0FDF5E6FFH);
  108. Olive* = LONGINT(0808000FFH);
  109. Olivedrab* = 06B8E23FFH;
  110. Orange* = LONGINT(0FFA500FFH);
  111. Orangered* = LONGINT(0FF4500FFH);
  112. Orchid* = LONGINT(0DA70D6FFH);
  113. Palegoldenrod* = LONGINT(0EEE8AAFFH);
  114. Palegreen* = LONGINT(098FB98FFH);
  115. Paleturquoise* = LONGINT(0AFEEEEFFH);
  116. Palevioletred* = LONGINT(0DB7093FFH);
  117. Papayawhip* = LONGINT(0FFEFD5FFH);
  118. Peachpuff* = LONGINT(0FFDAB9FFH);
  119. Peru* = LONGINT(0CD853FFFH);
  120. Pink* = LONGINT(0FFC0CBFFH);
  121. Plum* = LONGINT(0DDA0DDFFH);
  122. Powderblue* = LONGINT(0B0E0E6FFH);
  123. Purple* = LONGINT(0800080FFH);
  124. Red* = LONGINT(0FF0000FFH);
  125. Rosybrown* = LONGINT(0BC8F8FFFH);
  126. Royalblue* = 04169E1FFH;
  127. Saddlebrown* = LONGINT(08B4513FFH);
  128. Salmon* = LONGINT(0FA8072FFH);
  129. Sandybrown* = LONGINT(0F4A460FFH);
  130. Seagreen* = 02E8B57FFH;
  131. Seashell* = LONGINT(0FFF5EEFFH);
  132. Sienna* = LONGINT(0A0522DFFH);
  133. Silver* = LONGINT(0C0C0C0FFH);
  134. Skyblue* = LONGINT(087CEEBFFH);
  135. Slateblue* = 06A5ACDFFH;
  136. Slategray* = 0708090FFH;
  137. Slategrey* = 0708090FFH;
  138. Snow* = LONGINT(0FFFAFAFFH);
  139. Springgreen* = 000FF7FFFH;
  140. Steelblue* = 04682B4FFH;
  141. Tan* = LONGINT(0D2B48CFFH);
  142. Teal* = 0008080FFH;
  143. Thistle* = LONGINT(0D8BFD8FFH);
  144. Tomato* = LONGINT(0FF6347FFH);
  145. Turquoise* = 040E0D0FFH;
  146. Violet* = LONGINT(0EE82EEFFH);
  147. Wheat* = LONGINT(0F5DEB3FFH);
  148. White* = LONGINT(0FFFFFFFFH);
  149. Whitesmoke* = LONGINT(0F5F5F5FFH);
  150. Yellow* = LONGINT(0FFFF00FFH);
  151. Yellowgreen* = LONGINT(09ACD32FFH);
  152. TYPE
  153. Color*=LONGINT;
  154. ColorSum*=ARRAY 4 OF LONGREAL;
  155. (* Parse a color specified by name or value *)
  156. PROCEDURE Parse*(value: Strings.String; VAR color: Color):BOOLEAN;
  157. VAR res: WORD; i, r, g, b: LONGINT;
  158. f: LONGREAL;
  159. BEGIN
  160. IF value[0]='#' THEN
  161. value := Strings.Substring2(1,value^);
  162. Strings.HexStrToInt(value^, color, res);
  163. IF res # Strings.Ok THEN RETURN FALSE END;
  164. IF Strings.Length(value^)=3 THEN
  165. (* Expand #rgb to #rrggbb *)
  166. r := (color DIV 0100H) MOD 0100H;
  167. g := (color DIV 010H) MOD 010H;
  168. b := color MOD 010H;
  169. Unsplit(color, r+r*010H, g+g*010H, b+b*010H, 0FFH)
  170. ELSE
  171. color := color * 0100H + 0FFH
  172. END
  173. ELSIF Strings.StartsWith2("rgb(",value^) THEN
  174. i := 4;
  175. IF Strings.IndexOfByte2('%', value^) # -1 THEN
  176. SVGUtilities.StrToFloatPos(value^, f, i);
  177. IF value[i]#'%' THEN RETURN FALSE ELSE INC(i) END;
  178. SVGUtilities.SkipCommaWhiteSpace(i, value);
  179. r := ENTIER((f*255)/100);
  180. SVGUtilities.StrToFloatPos(value^, f, i);
  181. IF value[i]#'%' THEN RETURN FALSE ELSE INC(i) END;
  182. SVGUtilities.SkipCommaWhiteSpace(i, value);
  183. g := ENTIER((f*255)/100);
  184. SVGUtilities.StrToFloatPos(value^, f, i);
  185. IF value[i]#'%' THEN RETURN FALSE ELSE INC(i) END;
  186. SVGUtilities.SkipWhiteSpace(i, value);
  187. b := ENTIER((f*255)/100);
  188. ELSE
  189. Strings.StrToIntPos(value^, r, i);
  190. SVGUtilities.SkipCommaWhiteSpace(i, value);
  191. Strings.StrToIntPos(value^, g, i);
  192. SVGUtilities.SkipCommaWhiteSpace(i, value);
  193. Strings.StrToIntPos(value^, b, i);
  194. SVGUtilities.SkipWhiteSpace(i, value);
  195. END;
  196. IF value[i]#')' THEN
  197. SVGUtilities.Warning("color starting with rgb( omitted closing )");
  198. RETURN FALSE
  199. END;
  200. Unsplit(color, r, g, b, 0FFH)
  201. ELSIF value^ = "aliceblue" THEN color := Aliceblue
  202. ELSIF value^ = "antiquewhite" THEN color := Antiquewhite
  203. ELSIF value^ = "aqua" THEN color := Aqua
  204. ELSIF value^ = "aquamarine" THEN color := Aquamarine
  205. ELSIF value^ = "azure" THEN color := Azure
  206. ELSIF value^ = "beige" THEN color := Beige
  207. ELSIF value^ = "bisque" THEN color := Bisque
  208. ELSIF value^ = "black" THEN color := Black
  209. ELSIF value^ = "blanchedalmond" THEN color := Blanchedalmond
  210. ELSIF value^ = "blue" THEN color := Blue
  211. ELSIF value^ = "blueviolet" THEN color := Blueviolet
  212. ELSIF value^ = "brown" THEN color := Brown
  213. ELSIF value^ = "burlywood" THEN color := Burlywood
  214. ELSIF value^ = "cadetblue" THEN color := Cadetblue
  215. ELSIF value^ = "chartreuse" THEN color := Chartreuse
  216. ELSIF value^ = "chocolate" THEN color := Chocolate
  217. ELSIF value^ = "coral" THEN color := Coral
  218. ELSIF value^ = "cornflowerblue" THEN color := Cornflowerblue
  219. ELSIF value^ = "cornsilk" THEN color := Cornsilk
  220. ELSIF value^ = "crimson" THEN color := Crimson
  221. ELSIF value^ = "cyan" THEN color := Cyan
  222. ELSIF value^ = "darkblue" THEN color := Darkblue
  223. ELSIF value^ = "darkcyan" THEN color := Darkcyan
  224. ELSIF value^ = "darkgoldenrod" THEN color := Darkgoldenrod
  225. ELSIF value^ = "darkgray" THEN color := Darkgray
  226. ELSIF value^ = "darkgreen" THEN color := Darkgreen
  227. ELSIF value^ = "darkgrey" THEN color := Darkgrey
  228. ELSIF value^ = "darkkhaki" THEN color := Darkkhaki
  229. ELSIF value^ = "darkmagenta" THEN color := Darkmagenta
  230. ELSIF value^ = "darkolivegreen" THEN color := Darkolivegreen
  231. ELSIF value^ = "darkorange" THEN color := Darkorange
  232. ELSIF value^ = "darkorchid" THEN color := Darkorchid
  233. ELSIF value^ = "darkred" THEN color := Darkred
  234. ELSIF value^ = "darksalmon" THEN color := Darksalmon
  235. ELSIF value^ = "darkseagreen" THEN color := Darkseagreen
  236. ELSIF value^ = "darkslateblue" THEN color := Darkslateblue
  237. ELSIF value^ = "darkslategray" THEN color := Darkslategray
  238. ELSIF value^ = "darkslategrey" THEN color := Darkslategrey
  239. ELSIF value^ = "darkturquoise" THEN color := Darkturquoise
  240. ELSIF value^ = "darkviolet" THEN color := Darkviolet
  241. ELSIF value^ = "deeppink" THEN color := Deeppink
  242. ELSIF value^ = "deepskyblue" THEN color := Deepskyblue
  243. ELSIF value^ = "dimgray" THEN color := Dimgray
  244. ELSIF value^ = "dimgrey" THEN color := Dimgrey
  245. ELSIF value^ = "dodgerblue" THEN color := Dodgerblue
  246. ELSIF value^ = "firebrick" THEN color := Firebrick
  247. ELSIF value^ = "floralwhite" THEN color := Floralwhite
  248. ELSIF value^ = "forestgreen" THEN color := Forestgreen
  249. ELSIF value^ = "fuchsia" THEN color := Fuchsia
  250. ELSIF value^ = "gainsboro" THEN color := Gainsboro
  251. ELSIF value^ = "ghostwhite" THEN color := Ghostwhite
  252. ELSIF value^ = "gold" THEN color := Gold
  253. ELSIF value^ = "goldenrod" THEN color := Goldenrod
  254. ELSIF value^ = "gray" THEN color := Gray
  255. ELSIF value^ = "grey" THEN color := Grey
  256. ELSIF value^ = "green" THEN color := Green
  257. ELSIF value^ = "greenyellow" THEN color := Greenyellow
  258. ELSIF value^ = "honeydew" THEN color := Honeydew
  259. ELSIF value^ = "hotpink" THEN color := Hotpink
  260. ELSIF value^ = "indianred" THEN color := Indianred
  261. ELSIF value^ = "indigo" THEN color := Indigo
  262. ELSIF value^ = "ivory" THEN color := Ivory
  263. ELSIF value^ = "khaki" THEN color := Khaki
  264. ELSIF value^ = "lavender" THEN color := Lavender
  265. ELSIF value^ = "lavenderblush" THEN color := Lavenderblush
  266. ELSIF value^ = "lawngreen" THEN color := Lawngreen
  267. ELSIF value^ = "lemonchiffon" THEN color := Lemonchiffon
  268. ELSIF value^ = "lightblue" THEN color := Lightblue
  269. ELSIF value^ = "lightcoral" THEN color := Lightcoral
  270. ELSIF value^ = "lightcyan" THEN color := Lightcyan
  271. ELSIF value^ = "lightgoldenrodyellow" THEN color := Lightgoldenrodyellow
  272. ELSIF value^ = "lightgray" THEN color := Lightgray
  273. ELSIF value^ = "lightgreen" THEN color := Lightgreen
  274. ELSIF value^ = "lightgrey" THEN color := Lightgrey
  275. ELSIF value^ = "lightpink" THEN color := Lightpink
  276. ELSIF value^ = "lightsalmon" THEN color := Lightsalmon
  277. ELSIF value^ = "lightseagreen" THEN color := Lightseagreen
  278. ELSIF value^ = "lightskyblue" THEN color := Lightskyblue
  279. ELSIF value^ = "lightslategray" THEN color := Lightslategray
  280. ELSIF value^ = "lightslategrey" THEN color := Lightslategrey
  281. ELSIF value^ = "lightsteelblue" THEN color := Lightsteelblue
  282. ELSIF value^ = "lightyellow" THEN color := Lightyellow
  283. ELSIF value^ = "lime" THEN color := Lime
  284. ELSIF value^ = "limegreen" THEN color := Limegreen
  285. ELSIF value^ = "linen" THEN color := Linen
  286. ELSIF value^ = "magenta" THEN color := Magenta
  287. ELSIF value^ = "maroon" THEN color := Maroon
  288. ELSIF value^ = "mediumaquamarine" THEN color := Mediumaquamarine
  289. ELSIF value^ = "mediumblue" THEN color := Mediumblue
  290. ELSIF value^ = "mediumorchid" THEN color := Mediumorchid
  291. ELSIF value^ = "mediumpurple" THEN color := Mediumpurple
  292. ELSIF value^ = "mediumseagreen" THEN color := Mediumseagreen
  293. ELSIF value^ = "mediumslateblue" THEN color := Mediumslateblue
  294. ELSIF value^ = "mediumspringgreen" THEN color := Mediumspringgreen
  295. ELSIF value^ = "mediumturquoise" THEN color := Mediumturquoise
  296. ELSIF value^ = "mediumvioletred" THEN color := Mediumvioletred
  297. ELSIF value^ = "midnightblue" THEN color := Midnightblue
  298. ELSIF value^ = "mintcream" THEN color := Mintcream
  299. ELSIF value^ = "mistyrose" THEN color := Mistyrose
  300. ELSIF value^ = "moccasin" THEN color := Moccasin
  301. ELSIF value^ = "navajowhite" THEN color := Navajowhite
  302. ELSIF value^ = "navy" THEN color := Navy
  303. ELSIF value^ = "oldlace" THEN color := Oldlace
  304. ELSIF value^ = "olive" THEN color := Olive
  305. ELSIF value^ = "olivedrab" THEN color := Olivedrab
  306. ELSIF value^ = "orange" THEN color := Orange
  307. ELSIF value^ = "orangered" THEN color := Orangered
  308. ELSIF value^ = "orchid" THEN color := Orchid
  309. ELSIF value^ = "palegoldenrod" THEN color := Palegoldenrod
  310. ELSIF value^ = "palegreen" THEN color := Palegreen
  311. ELSIF value^ = "paleturquoise" THEN color := Paleturquoise
  312. ELSIF value^ = "palevioletred" THEN color := Palevioletred
  313. ELSIF value^ = "papayawhip" THEN color := Papayawhip
  314. ELSIF value^ = "peachpuff" THEN color := Peachpuff
  315. ELSIF value^ = "peru" THEN color := Peru
  316. ELSIF value^ = "pink" THEN color := Pink
  317. ELSIF value^ = "plum" THEN color := Plum
  318. ELSIF value^ = "powderblue" THEN color := Powderblue
  319. ELSIF value^ = "purple" THEN color := Purple
  320. ELSIF value^ = "red" THEN color := Red
  321. ELSIF value^ = "rosybrown" THEN color := Rosybrown
  322. ELSIF value^ = "royalblue" THEN color := Royalblue
  323. ELSIF value^ = "saddlebrown" THEN color := Saddlebrown
  324. ELSIF value^ = "salmon" THEN color := Salmon
  325. ELSIF value^ = "sandybrown" THEN color := Sandybrown
  326. ELSIF value^ = "seagreen" THEN color := Seagreen
  327. ELSIF value^ = "seashell" THEN color := Seashell
  328. ELSIF value^ = "sienna" THEN color := Sienna
  329. ELSIF value^ = "silver" THEN color := Silver
  330. ELSIF value^ = "skyblue" THEN color := Skyblue
  331. ELSIF value^ = "slateblue" THEN color := Slateblue
  332. ELSIF value^ = "slategray" THEN color := Slategray
  333. ELSIF value^ = "slategrey" THEN color := Slategrey
  334. ELSIF value^ = "snow" THEN color := Snow
  335. ELSIF value^ = "springgreen" THEN color := Springgreen
  336. ELSIF value^ = "steelblue" THEN color := Steelblue
  337. ELSIF value^ = "tan" THEN color := Tan
  338. ELSIF value^ = "teal" THEN color := Teal
  339. ELSIF value^ = "thistle" THEN color := Thistle
  340. ELSIF value^ = "tomato" THEN color := Tomato
  341. ELSIF value^ = "turquoise" THEN color := Turquoise
  342. ELSIF value^ = "violet" THEN color := Violet
  343. ELSIF value^ = "wheat" THEN color := Wheat
  344. ELSIF value^ = "white" THEN color := White
  345. ELSIF value^ = "whitesmoke" THEN color := Whitesmoke
  346. ELSIF value^ = "yellow" THEN color := Yellow
  347. ELSIF value^ = "yellowgreen" THEN color := Yellowgreen
  348. ELSE
  349. RETURN FALSE
  350. END;
  351. RETURN TRUE
  352. END Parse;
  353. (* Split a color into r, g, b and a values *)
  354. PROCEDURE Split*(color: Color; VAR r, g, b, a: INTEGER);
  355. BEGIN
  356. r := SHORT((color DIV 01000000H) MOD 0100H);
  357. g := SHORT((color DIV 010000H) MOD 0100H);
  358. b := SHORT((color DIV 0100H) MOD 0100H);
  359. a := SHORT(color MOD 0100H);
  360. END Split;
  361. (* Create a color using r, g, b and a values *)
  362. PROCEDURE Unsplit*(VAR color: Color; r, g, b, a: LONGINT);
  363. BEGIN
  364. color := ((r * 0100H + g) * 0100H + b) * 0100H + a
  365. END Unsplit;
  366. (* Blend two pixels and premultiply their alpha values *)
  367. PROCEDURE BlendAndPremultiply*(VAR a,b: Raster.Pixel; t: LONGREAL): Raster.Pixel;
  368. VAR p: Raster.Pixel;
  369. fa: LONGREAL;
  370. BEGIN
  371. fa := (ORD(a[3])+(ORD(b[3])-ORD(a[3]))*t) / 255.0;
  372. p[0] := CHR(ENTIER( fa*(ORD(a[0])+(ORD(b[0])-ORD(a[0]))*t) ));
  373. p[1] := CHR(ENTIER( fa*(ORD(a[1])+(ORD(b[1])-ORD(a[1]))*t) ));
  374. p[2] := CHR(ENTIER( fa*(ORD(a[2])+(ORD(b[2])-ORD(a[2]))*t) ));
  375. p[3] := CHR(ENTIER( fa*255 ));
  376. RETURN p;
  377. END BlendAndPremultiply;
  378. (* Convert a color to a pixel *)
  379. PROCEDURE ColorToPixel*(c: Color; VAR p: Raster.Pixel);
  380. VAR r,g,b,a: INTEGER;
  381. BEGIN
  382. Split(c, r,g,b,a);
  383. p[0] := CHR(b);
  384. p[1] := CHR(g);
  385. p[2] := CHR(r);
  386. p[3] := CHR(a);
  387. END ColorToPixel;
  388. (* Add the r, g, b and a values of a pixel to a running sum *)
  389. PROCEDURE WeightedAdd*(VAR sum: ColorSum; w: LONGREAL; pix: Raster.Pixel);
  390. BEGIN
  391. sum[0] := sum[0] + w*ORD(pix[0]);
  392. sum[1] := sum[1] + w*ORD(pix[1]);
  393. sum[2] := sum[2] + w*ORD(pix[2]);
  394. sum[3] := sum[3] + w*ORD(pix[3]);
  395. END WeightedAdd;
  396. (* Convert a sum of r, g, b and a values to a pixel *)
  397. PROCEDURE ColorSumToPixel*(sum: ColorSum; VAR pix: Raster.Pixel);
  398. BEGIN
  399. pix[0] := CHR(ENTIER(sum[0]));
  400. pix[1] := CHR(ENTIER(sum[1]));
  401. pix[2] := CHR(ENTIER(sum[2]));
  402. pix[3] := CHR(ENTIER(sum[3]));
  403. END ColorSumToPixel;
  404. END SVGColors.