96 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| // Adam 7
 | |
| //   0 1 2 3 4 5 6 7
 | |
| // 0 x 6 4 6 x 6 4 6
 | |
| // 1 7 7 7 7 7 7 7 7
 | |
| // 2 5 6 5 6 5 6 5 6
 | |
| // 3 7 7 7 7 7 7 7 7
 | |
| // 4 3 6 4 6 3 6 4 6
 | |
| // 5 7 7 7 7 7 7 7 7
 | |
| // 6 5 6 5 6 5 6 5 6
 | |
| // 7 7 7 7 7 7 7 7 7
 | |
| 
 | |
| let imagePasses = [
 | |
|   {
 | |
|     // pass 1 - 1px
 | |
|     x: [0],
 | |
|     y: [0],
 | |
|   },
 | |
|   {
 | |
|     // pass 2 - 1px
 | |
|     x: [4],
 | |
|     y: [0],
 | |
|   },
 | |
|   {
 | |
|     // pass 3 - 2px
 | |
|     x: [0, 4],
 | |
|     y: [4],
 | |
|   },
 | |
|   {
 | |
|     // pass 4 - 4px
 | |
|     x: [2, 6],
 | |
|     y: [0, 4],
 | |
|   },
 | |
|   {
 | |
|     // pass 5 - 8px
 | |
|     x: [0, 2, 4, 6],
 | |
|     y: [2, 6],
 | |
|   },
 | |
|   {
 | |
|     // pass 6 - 16px
 | |
|     x: [1, 3, 5, 7],
 | |
|     y: [0, 2, 4, 6],
 | |
|   },
 | |
|   {
 | |
|     // pass 7 - 32px
 | |
|     x: [0, 1, 2, 3, 4, 5, 6, 7],
 | |
|     y: [1, 3, 5, 7],
 | |
|   },
 | |
| ];
 | |
| 
 | |
| exports.getImagePasses = function (width, height) {
 | |
|   let images = [];
 | |
|   let xLeftOver = width % 8;
 | |
|   let yLeftOver = height % 8;
 | |
|   let xRepeats = (width - xLeftOver) / 8;
 | |
|   let yRepeats = (height - yLeftOver) / 8;
 | |
|   for (let i = 0; i < imagePasses.length; i++) {
 | |
|     let pass = imagePasses[i];
 | |
|     let passWidth = xRepeats * pass.x.length;
 | |
|     let passHeight = yRepeats * pass.y.length;
 | |
|     for (let j = 0; j < pass.x.length; j++) {
 | |
|       if (pass.x[j] < xLeftOver) {
 | |
|         passWidth++;
 | |
|       } else {
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|     for (let j = 0; j < pass.y.length; j++) {
 | |
|       if (pass.y[j] < yLeftOver) {
 | |
|         passHeight++;
 | |
|       } else {
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|     if (passWidth > 0 && passHeight > 0) {
 | |
|       images.push({ width: passWidth, height: passHeight, index: i });
 | |
|     }
 | |
|   }
 | |
|   return images;
 | |
| };
 | |
| 
 | |
| exports.getInterlaceIterator = function (width) {
 | |
|   return function (x, y, pass) {
 | |
|     let outerXLeftOver = x % imagePasses[pass].x.length;
 | |
|     let outerX =
 | |
|       ((x - outerXLeftOver) / imagePasses[pass].x.length) * 8 +
 | |
|       imagePasses[pass].x[outerXLeftOver];
 | |
|     let outerYLeftOver = y % imagePasses[pass].y.length;
 | |
|     let outerY =
 | |
|       ((y - outerYLeftOver) / imagePasses[pass].y.length) * 8 +
 | |
|       imagePasses[pass].y[outerYLeftOver];
 | |
|     return outerX * 4 + outerY * width * 4;
 | |
|   };
 | |
| };
 | 
