pattern.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2020 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. "use strict";
  23. Object.defineProperty(exports, "__esModule", {
  24. value: true
  25. });
  26. exports.getTilingPatternIR = getTilingPatternIR;
  27. exports.Pattern = void 0;
  28. var _util = require("../shared/util.js");
  29. var _colorspace = require("./colorspace.js");
  30. var _primitives = require("./primitives.js");
  31. var _core_utils = require("./core_utils.js");
  32. var ShadingType = {
  33. FUNCTION_BASED: 1,
  34. AXIAL: 2,
  35. RADIAL: 3,
  36. FREE_FORM_MESH: 4,
  37. LATTICE_FORM_MESH: 5,
  38. COONS_PATCH_MESH: 6,
  39. TENSOR_PATCH_MESH: 7
  40. };
  41. var Pattern = function PatternClosure() {
  42. function Pattern() {
  43. (0, _util.unreachable)("should not call Pattern constructor");
  44. }
  45. Pattern.prototype = {
  46. getPattern: function Pattern_getPattern(ctx) {
  47. (0, _util.unreachable)(`Should not call Pattern.getStyle: ${ctx}`);
  48. }
  49. };
  50. Pattern.parseShading = function (shading, matrix, xref, res, handler, pdfFunctionFactory, localColorSpaceCache) {
  51. var dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;
  52. var type = dict.get("ShadingType");
  53. try {
  54. switch (type) {
  55. case ShadingType.AXIAL:
  56. case ShadingType.RADIAL:
  57. return new Shadings.RadialAxial(dict, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);
  58. case ShadingType.FREE_FORM_MESH:
  59. case ShadingType.LATTICE_FORM_MESH:
  60. case ShadingType.COONS_PATCH_MESH:
  61. case ShadingType.TENSOR_PATCH_MESH:
  62. return new Shadings.Mesh(shading, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);
  63. default:
  64. throw new _util.FormatError("Unsupported ShadingType: " + type);
  65. }
  66. } catch (ex) {
  67. if (ex instanceof _core_utils.MissingDataException) {
  68. throw ex;
  69. }
  70. handler.send("UnsupportedFeature", {
  71. featureId: _util.UNSUPPORTED_FEATURES.shadingPattern
  72. });
  73. (0, _util.warn)(ex);
  74. return new Shadings.Dummy();
  75. }
  76. };
  77. return Pattern;
  78. }();
  79. exports.Pattern = Pattern;
  80. var Shadings = {};
  81. Shadings.SMALL_NUMBER = 1e-6;
  82. Shadings.RadialAxial = function RadialAxialClosure() {
  83. function RadialAxial(dict, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
  84. this.matrix = matrix;
  85. this.coordsArr = dict.getArray("Coords");
  86. this.shadingType = dict.get("ShadingType");
  87. this.type = "Pattern";
  88. const cs = _colorspace.ColorSpace.parse({
  89. cs: dict.getRaw("ColorSpace") || dict.getRaw("CS"),
  90. xref,
  91. resources,
  92. pdfFunctionFactory,
  93. localColorSpaceCache
  94. });
  95. this.cs = cs;
  96. const bbox = dict.getArray("BBox");
  97. if (Array.isArray(bbox) && bbox.length === 4) {
  98. this.bbox = _util.Util.normalizeRect(bbox);
  99. } else {
  100. this.bbox = null;
  101. }
  102. var t0 = 0.0,
  103. t1 = 1.0;
  104. if (dict.has("Domain")) {
  105. var domainArr = dict.getArray("Domain");
  106. t0 = domainArr[0];
  107. t1 = domainArr[1];
  108. }
  109. var extendStart = false,
  110. extendEnd = false;
  111. if (dict.has("Extend")) {
  112. var extendArr = dict.getArray("Extend");
  113. extendStart = extendArr[0];
  114. extendEnd = extendArr[1];
  115. }
  116. if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {
  117. var x1 = this.coordsArr[0];
  118. var y1 = this.coordsArr[1];
  119. var r1 = this.coordsArr[2];
  120. var x2 = this.coordsArr[3];
  121. var y2 = this.coordsArr[4];
  122. var r2 = this.coordsArr[5];
  123. var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
  124. if (r1 <= r2 + distance && r2 <= r1 + distance) {
  125. (0, _util.warn)("Unsupported radial gradient.");
  126. }
  127. }
  128. this.extendStart = extendStart;
  129. this.extendEnd = extendEnd;
  130. var fnObj = dict.getRaw("Function");
  131. var fn = pdfFunctionFactory.createFromArray(fnObj);
  132. const NUMBER_OF_SAMPLES = 10;
  133. const step = (t1 - t0) / NUMBER_OF_SAMPLES;
  134. var colorStops = this.colorStops = [];
  135. if (t0 >= t1 || step <= 0) {
  136. (0, _util.info)("Bad shading domain.");
  137. return;
  138. }
  139. var color = new Float32Array(cs.numComps),
  140. ratio = new Float32Array(1);
  141. var rgbColor;
  142. for (let i = 0; i <= NUMBER_OF_SAMPLES; i++) {
  143. ratio[0] = t0 + i * step;
  144. fn(ratio, 0, color, 0);
  145. rgbColor = cs.getRgb(color, 0);
  146. var cssColor = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
  147. colorStops.push([i / NUMBER_OF_SAMPLES, cssColor]);
  148. }
  149. var background = "transparent";
  150. if (dict.has("Background")) {
  151. rgbColor = cs.getRgb(dict.get("Background"), 0);
  152. background = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
  153. }
  154. if (!extendStart) {
  155. colorStops.unshift([0, background]);
  156. colorStops[1][0] += Shadings.SMALL_NUMBER;
  157. }
  158. if (!extendEnd) {
  159. colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
  160. colorStops.push([1, background]);
  161. }
  162. this.colorStops = colorStops;
  163. }
  164. RadialAxial.prototype = {
  165. getIR: function RadialAxial_getIR() {
  166. var coordsArr = this.coordsArr;
  167. var shadingType = this.shadingType;
  168. var type, p0, p1, r0, r1;
  169. if (shadingType === ShadingType.AXIAL) {
  170. p0 = [coordsArr[0], coordsArr[1]];
  171. p1 = [coordsArr[2], coordsArr[3]];
  172. r0 = null;
  173. r1 = null;
  174. type = "axial";
  175. } else if (shadingType === ShadingType.RADIAL) {
  176. p0 = [coordsArr[0], coordsArr[1]];
  177. p1 = [coordsArr[3], coordsArr[4]];
  178. r0 = coordsArr[2];
  179. r1 = coordsArr[5];
  180. type = "radial";
  181. } else {
  182. (0, _util.unreachable)(`getPattern type unknown: ${shadingType}`);
  183. }
  184. var matrix = this.matrix;
  185. if (matrix) {
  186. p0 = _util.Util.applyTransform(p0, matrix);
  187. p1 = _util.Util.applyTransform(p1, matrix);
  188. if (shadingType === ShadingType.RADIAL) {
  189. var scale = _util.Util.singularValueDecompose2dScale(matrix);
  190. r0 *= scale[0];
  191. r1 *= scale[1];
  192. }
  193. }
  194. return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1];
  195. }
  196. };
  197. return RadialAxial;
  198. }();
  199. Shadings.Mesh = function MeshClosure() {
  200. function MeshStreamReader(stream, context) {
  201. this.stream = stream;
  202. this.context = context;
  203. this.buffer = 0;
  204. this.bufferLength = 0;
  205. var numComps = context.numComps;
  206. this.tmpCompsBuf = new Float32Array(numComps);
  207. var csNumComps = context.colorSpace.numComps;
  208. this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;
  209. }
  210. MeshStreamReader.prototype = {
  211. get hasData() {
  212. if (this.stream.end) {
  213. return this.stream.pos < this.stream.end;
  214. }
  215. if (this.bufferLength > 0) {
  216. return true;
  217. }
  218. var nextByte = this.stream.getByte();
  219. if (nextByte < 0) {
  220. return false;
  221. }
  222. this.buffer = nextByte;
  223. this.bufferLength = 8;
  224. return true;
  225. },
  226. readBits: function MeshStreamReader_readBits(n) {
  227. var buffer = this.buffer;
  228. var bufferLength = this.bufferLength;
  229. if (n === 32) {
  230. if (bufferLength === 0) {
  231. return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0;
  232. }
  233. buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte();
  234. var nextByte = this.stream.getByte();
  235. this.buffer = nextByte & (1 << bufferLength) - 1;
  236. return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0;
  237. }
  238. if (n === 8 && bufferLength === 0) {
  239. return this.stream.getByte();
  240. }
  241. while (bufferLength < n) {
  242. buffer = buffer << 8 | this.stream.getByte();
  243. bufferLength += 8;
  244. }
  245. bufferLength -= n;
  246. this.bufferLength = bufferLength;
  247. this.buffer = buffer & (1 << bufferLength) - 1;
  248. return buffer >> bufferLength;
  249. },
  250. align: function MeshStreamReader_align() {
  251. this.buffer = 0;
  252. this.bufferLength = 0;
  253. },
  254. readFlag: function MeshStreamReader_readFlag() {
  255. return this.readBits(this.context.bitsPerFlag);
  256. },
  257. readCoordinate: function MeshStreamReader_readCoordinate() {
  258. var bitsPerCoordinate = this.context.bitsPerCoordinate;
  259. var xi = this.readBits(bitsPerCoordinate);
  260. var yi = this.readBits(bitsPerCoordinate);
  261. var decode = this.context.decode;
  262. var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;
  263. return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];
  264. },
  265. readComponents: function MeshStreamReader_readComponents() {
  266. var numComps = this.context.numComps;
  267. var bitsPerComponent = this.context.bitsPerComponent;
  268. var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;
  269. var decode = this.context.decode;
  270. var components = this.tmpCompsBuf;
  271. for (var i = 0, j = 4; i < numComps; i++, j += 2) {
  272. var ci = this.readBits(bitsPerComponent);
  273. components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
  274. }
  275. var color = this.tmpCsCompsBuf;
  276. if (this.context.colorFn) {
  277. this.context.colorFn(components, 0, color, 0);
  278. }
  279. return this.context.colorSpace.getRgb(color, 0);
  280. }
  281. };
  282. function decodeType4Shading(mesh, reader) {
  283. var coords = mesh.coords;
  284. var colors = mesh.colors;
  285. var operators = [];
  286. var ps = [];
  287. var verticesLeft = 0;
  288. while (reader.hasData) {
  289. var f = reader.readFlag();
  290. var coord = reader.readCoordinate();
  291. var color = reader.readComponents();
  292. if (verticesLeft === 0) {
  293. if (!(0 <= f && f <= 2)) {
  294. throw new _util.FormatError("Unknown type4 flag");
  295. }
  296. switch (f) {
  297. case 0:
  298. verticesLeft = 3;
  299. break;
  300. case 1:
  301. ps.push(ps[ps.length - 2], ps[ps.length - 1]);
  302. verticesLeft = 1;
  303. break;
  304. case 2:
  305. ps.push(ps[ps.length - 3], ps[ps.length - 1]);
  306. verticesLeft = 1;
  307. break;
  308. }
  309. operators.push(f);
  310. }
  311. ps.push(coords.length);
  312. coords.push(coord);
  313. colors.push(color);
  314. verticesLeft--;
  315. reader.align();
  316. }
  317. mesh.figures.push({
  318. type: "triangles",
  319. coords: new Int32Array(ps),
  320. colors: new Int32Array(ps)
  321. });
  322. }
  323. function decodeType5Shading(mesh, reader, verticesPerRow) {
  324. var coords = mesh.coords;
  325. var colors = mesh.colors;
  326. var ps = [];
  327. while (reader.hasData) {
  328. var coord = reader.readCoordinate();
  329. var color = reader.readComponents();
  330. ps.push(coords.length);
  331. coords.push(coord);
  332. colors.push(color);
  333. }
  334. mesh.figures.push({
  335. type: "lattice",
  336. coords: new Int32Array(ps),
  337. colors: new Int32Array(ps),
  338. verticesPerRow
  339. });
  340. }
  341. var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
  342. var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
  343. var TRIANGLE_DENSITY = 20;
  344. var getB = function getBClosure() {
  345. function buildB(count) {
  346. var lut = [];
  347. for (var i = 0; i <= count; i++) {
  348. var t = i / count,
  349. t_ = 1 - t;
  350. lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));
  351. }
  352. return lut;
  353. }
  354. var cache = [];
  355. return function getB(count) {
  356. if (!cache[count]) {
  357. cache[count] = buildB(count);
  358. }
  359. return cache[count];
  360. };
  361. }();
  362. function buildFigureFromPatch(mesh, index) {
  363. var figure = mesh.figures[index];
  364. (0, _util.assert)(figure.type === "patch", "Unexpected patch mesh figure");
  365. var coords = mesh.coords,
  366. colors = mesh.colors;
  367. var pi = figure.coords;
  368. var ci = figure.colors;
  369. var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
  370. var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
  371. var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
  372. var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
  373. var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0]));
  374. splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
  375. var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1]));
  376. splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
  377. var verticesPerRow = splitXBy + 1;
  378. var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
  379. var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
  380. var k = 0;
  381. var cl = new Uint8Array(3),
  382. cr = new Uint8Array(3);
  383. var c0 = colors[ci[0]],
  384. c1 = colors[ci[1]],
  385. c2 = colors[ci[2]],
  386. c3 = colors[ci[3]];
  387. var bRow = getB(splitYBy),
  388. bCol = getB(splitXBy);
  389. for (var row = 0; row <= splitYBy; row++) {
  390. cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;
  391. cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;
  392. cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;
  393. cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;
  394. cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;
  395. cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;
  396. for (var col = 0; col <= splitXBy; col++, k++) {
  397. if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {
  398. continue;
  399. }
  400. var x = 0,
  401. y = 0;
  402. var q = 0;
  403. for (var i = 0; i <= 3; i++) {
  404. for (var j = 0; j <= 3; j++, q++) {
  405. var m = bRow[row][i] * bCol[col][j];
  406. x += coords[pi[q]][0] * m;
  407. y += coords[pi[q]][1] * m;
  408. }
  409. }
  410. figureCoords[k] = coords.length;
  411. coords.push([x, y]);
  412. figureColors[k] = colors.length;
  413. var newColor = new Uint8Array(3);
  414. newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;
  415. newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;
  416. newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;
  417. colors.push(newColor);
  418. }
  419. }
  420. figureCoords[0] = pi[0];
  421. figureColors[0] = ci[0];
  422. figureCoords[splitXBy] = pi[3];
  423. figureColors[splitXBy] = ci[1];
  424. figureCoords[verticesPerRow * splitYBy] = pi[12];
  425. figureColors[verticesPerRow * splitYBy] = ci[2];
  426. figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
  427. figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
  428. mesh.figures[index] = {
  429. type: "lattice",
  430. coords: figureCoords,
  431. colors: figureColors,
  432. verticesPerRow
  433. };
  434. }
  435. function decodeType6Shading(mesh, reader) {
  436. var coords = mesh.coords;
  437. var colors = mesh.colors;
  438. var ps = new Int32Array(16);
  439. var cs = new Int32Array(4);
  440. while (reader.hasData) {
  441. var f = reader.readFlag();
  442. if (!(0 <= f && f <= 3)) {
  443. throw new _util.FormatError("Unknown type6 flag");
  444. }
  445. var i, ii;
  446. var pi = coords.length;
  447. for (i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {
  448. coords.push(reader.readCoordinate());
  449. }
  450. var ci = colors.length;
  451. for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
  452. colors.push(reader.readComponents());
  453. }
  454. var tmp1, tmp2, tmp3, tmp4;
  455. switch (f) {
  456. case 0:
  457. ps[12] = pi + 3;
  458. ps[13] = pi + 4;
  459. ps[14] = pi + 5;
  460. ps[15] = pi + 6;
  461. ps[8] = pi + 2;
  462. ps[11] = pi + 7;
  463. ps[4] = pi + 1;
  464. ps[7] = pi + 8;
  465. ps[0] = pi;
  466. ps[1] = pi + 11;
  467. ps[2] = pi + 10;
  468. ps[3] = pi + 9;
  469. cs[2] = ci + 1;
  470. cs[3] = ci + 2;
  471. cs[0] = ci;
  472. cs[1] = ci + 3;
  473. break;
  474. case 1:
  475. tmp1 = ps[12];
  476. tmp2 = ps[13];
  477. tmp3 = ps[14];
  478. tmp4 = ps[15];
  479. ps[12] = tmp4;
  480. ps[13] = pi + 0;
  481. ps[14] = pi + 1;
  482. ps[15] = pi + 2;
  483. ps[8] = tmp3;
  484. ps[11] = pi + 3;
  485. ps[4] = tmp2;
  486. ps[7] = pi + 4;
  487. ps[0] = tmp1;
  488. ps[1] = pi + 7;
  489. ps[2] = pi + 6;
  490. ps[3] = pi + 5;
  491. tmp1 = cs[2];
  492. tmp2 = cs[3];
  493. cs[2] = tmp2;
  494. cs[3] = ci;
  495. cs[0] = tmp1;
  496. cs[1] = ci + 1;
  497. break;
  498. case 2:
  499. tmp1 = ps[15];
  500. tmp2 = ps[11];
  501. ps[12] = ps[3];
  502. ps[13] = pi + 0;
  503. ps[14] = pi + 1;
  504. ps[15] = pi + 2;
  505. ps[8] = ps[7];
  506. ps[11] = pi + 3;
  507. ps[4] = tmp2;
  508. ps[7] = pi + 4;
  509. ps[0] = tmp1;
  510. ps[1] = pi + 7;
  511. ps[2] = pi + 6;
  512. ps[3] = pi + 5;
  513. tmp1 = cs[3];
  514. cs[2] = cs[1];
  515. cs[3] = ci;
  516. cs[0] = tmp1;
  517. cs[1] = ci + 1;
  518. break;
  519. case 3:
  520. ps[12] = ps[0];
  521. ps[13] = pi + 0;
  522. ps[14] = pi + 1;
  523. ps[15] = pi + 2;
  524. ps[8] = ps[1];
  525. ps[11] = pi + 3;
  526. ps[4] = ps[2];
  527. ps[7] = pi + 4;
  528. ps[0] = ps[3];
  529. ps[1] = pi + 7;
  530. ps[2] = pi + 6;
  531. ps[3] = pi + 5;
  532. cs[2] = cs[0];
  533. cs[3] = ci;
  534. cs[0] = cs[1];
  535. cs[1] = ci + 1;
  536. break;
  537. }
  538. ps[5] = coords.length;
  539. coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);
  540. ps[6] = coords.length;
  541. coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);
  542. ps[9] = coords.length;
  543. coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);
  544. ps[10] = coords.length;
  545. coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);
  546. mesh.figures.push({
  547. type: "patch",
  548. coords: new Int32Array(ps),
  549. colors: new Int32Array(cs)
  550. });
  551. }
  552. }
  553. function decodeType7Shading(mesh, reader) {
  554. var coords = mesh.coords;
  555. var colors = mesh.colors;
  556. var ps = new Int32Array(16);
  557. var cs = new Int32Array(4);
  558. while (reader.hasData) {
  559. var f = reader.readFlag();
  560. if (!(0 <= f && f <= 3)) {
  561. throw new _util.FormatError("Unknown type7 flag");
  562. }
  563. var i, ii;
  564. var pi = coords.length;
  565. for (i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {
  566. coords.push(reader.readCoordinate());
  567. }
  568. var ci = colors.length;
  569. for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
  570. colors.push(reader.readComponents());
  571. }
  572. var tmp1, tmp2, tmp3, tmp4;
  573. switch (f) {
  574. case 0:
  575. ps[12] = pi + 3;
  576. ps[13] = pi + 4;
  577. ps[14] = pi + 5;
  578. ps[15] = pi + 6;
  579. ps[8] = pi + 2;
  580. ps[9] = pi + 13;
  581. ps[10] = pi + 14;
  582. ps[11] = pi + 7;
  583. ps[4] = pi + 1;
  584. ps[5] = pi + 12;
  585. ps[6] = pi + 15;
  586. ps[7] = pi + 8;
  587. ps[0] = pi;
  588. ps[1] = pi + 11;
  589. ps[2] = pi + 10;
  590. ps[3] = pi + 9;
  591. cs[2] = ci + 1;
  592. cs[3] = ci + 2;
  593. cs[0] = ci;
  594. cs[1] = ci + 3;
  595. break;
  596. case 1:
  597. tmp1 = ps[12];
  598. tmp2 = ps[13];
  599. tmp3 = ps[14];
  600. tmp4 = ps[15];
  601. ps[12] = tmp4;
  602. ps[13] = pi + 0;
  603. ps[14] = pi + 1;
  604. ps[15] = pi + 2;
  605. ps[8] = tmp3;
  606. ps[9] = pi + 9;
  607. ps[10] = pi + 10;
  608. ps[11] = pi + 3;
  609. ps[4] = tmp2;
  610. ps[5] = pi + 8;
  611. ps[6] = pi + 11;
  612. ps[7] = pi + 4;
  613. ps[0] = tmp1;
  614. ps[1] = pi + 7;
  615. ps[2] = pi + 6;
  616. ps[3] = pi + 5;
  617. tmp1 = cs[2];
  618. tmp2 = cs[3];
  619. cs[2] = tmp2;
  620. cs[3] = ci;
  621. cs[0] = tmp1;
  622. cs[1] = ci + 1;
  623. break;
  624. case 2:
  625. tmp1 = ps[15];
  626. tmp2 = ps[11];
  627. ps[12] = ps[3];
  628. ps[13] = pi + 0;
  629. ps[14] = pi + 1;
  630. ps[15] = pi + 2;
  631. ps[8] = ps[7];
  632. ps[9] = pi + 9;
  633. ps[10] = pi + 10;
  634. ps[11] = pi + 3;
  635. ps[4] = tmp2;
  636. ps[5] = pi + 8;
  637. ps[6] = pi + 11;
  638. ps[7] = pi + 4;
  639. ps[0] = tmp1;
  640. ps[1] = pi + 7;
  641. ps[2] = pi + 6;
  642. ps[3] = pi + 5;
  643. tmp1 = cs[3];
  644. cs[2] = cs[1];
  645. cs[3] = ci;
  646. cs[0] = tmp1;
  647. cs[1] = ci + 1;
  648. break;
  649. case 3:
  650. ps[12] = ps[0];
  651. ps[13] = pi + 0;
  652. ps[14] = pi + 1;
  653. ps[15] = pi + 2;
  654. ps[8] = ps[1];
  655. ps[9] = pi + 9;
  656. ps[10] = pi + 10;
  657. ps[11] = pi + 3;
  658. ps[4] = ps[2];
  659. ps[5] = pi + 8;
  660. ps[6] = pi + 11;
  661. ps[7] = pi + 4;
  662. ps[0] = ps[3];
  663. ps[1] = pi + 7;
  664. ps[2] = pi + 6;
  665. ps[3] = pi + 5;
  666. cs[2] = cs[0];
  667. cs[3] = ci;
  668. cs[0] = cs[1];
  669. cs[1] = ci + 1;
  670. break;
  671. }
  672. mesh.figures.push({
  673. type: "patch",
  674. coords: new Int32Array(ps),
  675. colors: new Int32Array(cs)
  676. });
  677. }
  678. }
  679. function updateBounds(mesh) {
  680. var minX = mesh.coords[0][0],
  681. minY = mesh.coords[0][1],
  682. maxX = minX,
  683. maxY = minY;
  684. for (var i = 1, ii = mesh.coords.length; i < ii; i++) {
  685. var x = mesh.coords[i][0],
  686. y = mesh.coords[i][1];
  687. minX = minX > x ? x : minX;
  688. minY = minY > y ? y : minY;
  689. maxX = maxX < x ? x : maxX;
  690. maxY = maxY < y ? y : maxY;
  691. }
  692. mesh.bounds = [minX, minY, maxX, maxY];
  693. }
  694. function packData(mesh) {
  695. var i, ii, j, jj;
  696. var coords = mesh.coords;
  697. var coordsPacked = new Float32Array(coords.length * 2);
  698. for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
  699. var xy = coords[i];
  700. coordsPacked[j++] = xy[0];
  701. coordsPacked[j++] = xy[1];
  702. }
  703. mesh.coords = coordsPacked;
  704. var colors = mesh.colors;
  705. var colorsPacked = new Uint8Array(colors.length * 3);
  706. for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
  707. var c = colors[i];
  708. colorsPacked[j++] = c[0];
  709. colorsPacked[j++] = c[1];
  710. colorsPacked[j++] = c[2];
  711. }
  712. mesh.colors = colorsPacked;
  713. var figures = mesh.figures;
  714. for (i = 0, ii = figures.length; i < ii; i++) {
  715. var figure = figures[i],
  716. ps = figure.coords,
  717. cs = figure.colors;
  718. for (j = 0, jj = ps.length; j < jj; j++) {
  719. ps[j] *= 2;
  720. cs[j] *= 3;
  721. }
  722. }
  723. }
  724. function Mesh(stream, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
  725. if (!(0, _primitives.isStream)(stream)) {
  726. throw new _util.FormatError("Mesh data is not a stream");
  727. }
  728. var dict = stream.dict;
  729. this.matrix = matrix;
  730. this.shadingType = dict.get("ShadingType");
  731. this.type = "Pattern";
  732. const bbox = dict.getArray("BBox");
  733. if (Array.isArray(bbox) && bbox.length === 4) {
  734. this.bbox = _util.Util.normalizeRect(bbox);
  735. } else {
  736. this.bbox = null;
  737. }
  738. const cs = _colorspace.ColorSpace.parse({
  739. cs: dict.getRaw("ColorSpace") || dict.getRaw("CS"),
  740. xref,
  741. resources,
  742. pdfFunctionFactory,
  743. localColorSpaceCache
  744. });
  745. this.cs = cs;
  746. this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null;
  747. var fnObj = dict.getRaw("Function");
  748. var fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;
  749. this.coords = [];
  750. this.colors = [];
  751. this.figures = [];
  752. var decodeContext = {
  753. bitsPerCoordinate: dict.get("BitsPerCoordinate"),
  754. bitsPerComponent: dict.get("BitsPerComponent"),
  755. bitsPerFlag: dict.get("BitsPerFlag"),
  756. decode: dict.getArray("Decode"),
  757. colorFn: fn,
  758. colorSpace: cs,
  759. numComps: fn ? 1 : cs.numComps
  760. };
  761. var reader = new MeshStreamReader(stream, decodeContext);
  762. var patchMesh = false;
  763. switch (this.shadingType) {
  764. case ShadingType.FREE_FORM_MESH:
  765. decodeType4Shading(this, reader);
  766. break;
  767. case ShadingType.LATTICE_FORM_MESH:
  768. var verticesPerRow = dict.get("VerticesPerRow") | 0;
  769. if (verticesPerRow < 2) {
  770. throw new _util.FormatError("Invalid VerticesPerRow");
  771. }
  772. decodeType5Shading(this, reader, verticesPerRow);
  773. break;
  774. case ShadingType.COONS_PATCH_MESH:
  775. decodeType6Shading(this, reader);
  776. patchMesh = true;
  777. break;
  778. case ShadingType.TENSOR_PATCH_MESH:
  779. decodeType7Shading(this, reader);
  780. patchMesh = true;
  781. break;
  782. default:
  783. (0, _util.unreachable)("Unsupported mesh type.");
  784. break;
  785. }
  786. if (patchMesh) {
  787. updateBounds(this);
  788. for (var i = 0, ii = this.figures.length; i < ii; i++) {
  789. buildFigureFromPatch(this, i);
  790. }
  791. }
  792. updateBounds(this);
  793. packData(this);
  794. }
  795. Mesh.prototype = {
  796. getIR: function Mesh_getIR() {
  797. return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, this.bbox, this.background];
  798. }
  799. };
  800. return Mesh;
  801. }();
  802. Shadings.Dummy = function DummyClosure() {
  803. function Dummy() {
  804. this.type = "Pattern";
  805. }
  806. Dummy.prototype = {
  807. getIR: function Dummy_getIR() {
  808. return ["Dummy"];
  809. }
  810. };
  811. return Dummy;
  812. }();
  813. function getTilingPatternIR(operatorList, dict, args) {
  814. const matrix = dict.getArray("Matrix");
  815. const bbox = _util.Util.normalizeRect(dict.getArray("BBox"));
  816. const xstep = dict.get("XStep");
  817. const ystep = dict.get("YStep");
  818. const paintType = dict.get("PaintType");
  819. const tilingType = dict.get("TilingType");
  820. if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {
  821. throw new _util.FormatError(`Invalid getTilingPatternIR /BBox array: [${bbox}].`);
  822. }
  823. return ["TilingPattern", args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];
  824. }