1function e(e,{width:l,height:r},i){if(!e)return 2const{mode:o="checkerboard-1px",subpixelType:n="rgb",temporalMode:s="static",frameCounter:c=0,showOverscan:f=!0,devicePixelMode:p=!1,rotationAngle:h=15,moireScale:d=1,moireType:b="sine"}=i||{},m=p&&"undefined"!=typeof window&&window.devicePixelRatio?window.devicePixelRatio:1 3p&&(e.save(),e.scale(1/m,1/m),l*=m,r*=m),e.fillStyle="#404040",e.fillRect(0,0,l,r) 4const g=((e,t)=>{switch(e){case"invert1":case"frc-flicker":return t%2==1 5case"invert2":return Math.floor(t/2)%2==1 6case"linepair":return Math.floor(t/4)%2==1 7case"frc-pattern":return t%4==1||t%4==2 8default:return!1}})(s,c) 9switch(o){case"checkerboard-1px":((e,t,a,l)=>{const r=e.createImageData(t,a),data=r.data 10for(let e=0;e<a;e++)for(let a=0;a<t;a++){const r=4*(e*t+a),i=(a+e)%2==0!==l?255:0 11data[r]=i,data[r+1]=i,data[r+2]=i,data[r+3]=255}e.putImageData(r,0,0)})(e,l,r,g) 12break 13case"lines-h":t(e,l,r,"horizontal",g) 14break 15case"lines-v":t(e,l,r,"vertical",g) 16break 17case"lines-d":t(e,l,r,"diagonal",g) 18break 19case"rotated-lines":((e,t,a,l,r)=>{const i=e.createImageData(t,a),data=i.data,o=l*Math.PI/180,n=Math.cos(o),s=Math.sin(o),c=t/2,f=a/2 20for(let e=0;e<a;e++)for(let a=0;a<t;a++){const l=4*(e*t+a),i=a-c,o=e-f,p=i*n-o*s,h=i*s+o*n,d=Math.floor(p+h)%4<2!==r?255:0 21data[l]=d,data[l+1]=d,data[l+2]=d,data[l+3]=255}e.putImageData(i,0,0),e.fillStyle="rgba(0, 255, 0, 0.8)",e.font="16px monospace",e.fillText(`Angle: ${l}\xb0`,20,30) 22e.fillStyle="rgba(255, 255, 255, 0.7)",e.font="12px monospace",e.fillText("Test angles: "+[15,30,45,60,75].join("\xb0, ")+"\xb0",20,a-20)})(e,l,r,h,g) 23break 24case"fractal-moire":((e,t,a,l,r,i)=>{const o=e.createImageData(t,a),data=o.data,n=.02*i 25for(let e=0;e<a;e++)for(let i=0;i<t;i++){const o=4*(e*t+i),s=(i-t/2)/t*l,c=(e-a/2)/a*l 26let f=0 27if("sine"===r){const e=40,t=41 28f=(Math.sin((s*e+n)*Math.PI*2)+Math.sin((c*t+n)*Math.PI*2))/2}else if("circular"===r){const e=Math.sqrt(s*s+c*c),t=Math.sqrt((s-.1)*(s-.1)+(c-.1)*(c-.1)),a=60 29f=(Math.sin(e*a+n)+Math.sin(t*a+n))/2}else if("grid"===r){const e=30,t=31 30f=(Math.sin(s*e*Math.PI*2+n)*Math.sin(c*e*Math.PI*2+n)+Math.sin(s*t*Math.PI*2+n)*Math.sin(c*t*Math.PI*2+n))/2}else if("fractal"===r){f=0 31let e=1,t=20 32for(let a=0;a<4;a++)f+=Math.sin((s*t+c*t+n)*Math.PI)*e,e*=.5,t*=2.1 33f/=2}const p=Math.floor(127.5*(f+1)),h=Math.max(0,Math.min(255,p)) 34data[o]=h,data[o+1]=h,data[o+2]=h,data[o+3]=255}e.putImageData(o,0,0),e.fillStyle="rgba(0, 255, 0, 0.8)",e.font="16px monospace",e.fillText(`Moir\xe9 Type: ${r}`,20,30),e.fillText(`Scale: ${l.toFixed(1)}`,20,50),e.fillStyle="rgba(255, 255, 255, 0.7)",e.font="12px monospace",["Look for moir\xe9 patterns that indicate aliasing","Use R/F to adjust scale, Y/U to change type","Patterns should be stable without flickering"].forEach((t,l)=>{e.fillText(t,20,a-60+16*l)})})(e,l,r,d,b,c) 35break 36case"subpixel":((e,t,a,l)=>{const r=e.createImageData(t,a),data=r.data 37for(let e=0;e<a;e++)for(let a=0;a<t;a++){const r=4*(e*t+a) 38switch(l){case"rgb":data[r]=a%3==0?255:0,data[r+1]=a%3==1?255:0,data[r+2]=a%3==2?255:0 39break 40case"bgr":data[r]=a%3==2?255:0,data[r+1]=a%3==1?255:0,data[r+2]=a%3==0?255:0 41break 42case"wrgb":{const e=a%4 430===e?(data[r]=255,data[r+1]=255,data[r+2]=255):(data[r]=1===e?255:0,data[r+1]=2===e?255:0,data[r+2]=3===e?255:0) 44break}case"pentile":{const t=a%4 450==e%2?(data[r]=0===t||2===t?255:0,data[r+1]=1===t||3===t?255:0,data[r+2]=0):(data[r]=0,data[r+1]=0===t||2===t?255:0,data[r+2]=1===t||3===t?255:0) 46break}}data[r+3]=255}e.putImageData(r,0,0)})(e,l,r,n) 47break 48case"siemens":((e,t,a)=>{const l=t/2,r=a/2,i=.45*Math.min(t,a) 49e.fillStyle="#808080",e.fillRect(0,0,t,a),e.save(),e.translate(l,r) 50for(let t=0;t<36;t++){const a=2*t*Math.PI/36,l=2*(t+1)*Math.PI/36 51e.fillStyle=t%2==0?"#ffffff":"#000000",e.beginPath(),e.moveTo(0,0),e.arc(0,0,i,a,l),e.closePath(),e.fill()}e.restore()})(e,l,r) 52break 53case"resolution":((e,t,a)=>{e.fillStyle="#808080",e.fillRect(0,0,t,a) 54const l=a/4,r=.8*t,i=.1*t 55for(let t=0;t<4;t++){const a=t*l+l/2,o=20+10*t 56for(let t=0;t<r;t++){const n=t/r*o,s=Math.sin(n*Math.PI)>0?255:0 57e.strokeStyle=`rgb(${s}, ${s}, ${s})`,e.lineWidth=1,e.beginPath(),e.moveTo(i+t,a-.3*l),e.lineTo(i+t,a+.3*l),e.stroke()}e.fillStyle="#ffffff",e.font="12px monospace",e.fillText(`${o} cycles`,i-80,a)}})(e,l,r) 58break 59case"overscan":((e,t,l,r)=>{e.fillStyle="#404040",e.fillRect(0,0,t,l) 60e.lineWidth=1,e.font="14px monospace",[{percent:0,color:"#ff0000",label:"0% (Edge)"},{percent:2.5,color:"#ffaa00",label:"2.5% Safe Action"},{percent:5,color:"#ffff00",label:"5% Action Safe"},{percent:10,color:"#00ff00",label:"10% Title Safe"}
60].forEach(a=>{const r=t*a.percent/100,i=l*a.percent/100 61e.strokeStyle=a.color,e.strokeRect(r,i,t-2*r,l-2*i),e.fillStyle=a.color,e.fillText(a.label,r+5,i+20)}),a(e,t,l,r,!0)})(e,l,r,c) 62break 63case"frc-dither":((e,t,a,l)=>{const{frameCounter:r,temporalMode:i}=l,o=100,n=t/6 64e.fillStyle="#808080",e.fillRect(0,0,t,a),[{base:10,alternate:20},{base:20,alternate:30},{base:240,alternate:250},{base:230,alternate:245},{base:127,alternate:128},{base:64,alternate:192}].forEach((t,l)=>{const s=l*n+(n-o)/2,c=a/2-50 65let f=t.base 66if("frc-flicker"===i)f=r%2==0?t.base:t.alternate 67else if("frc-pattern"===i){const e=r%4 68f=0===e?t.base:1===e||2===e?t.alternate:t.base}e.fillStyle=`rgb(${f}, ${f}, ${f})`,e.fillRect(s,c,o,o),e.strokeStyle="rgba(255, 255, 255, 0.3)",e.lineWidth=1,e.strokeRect(s,c,o,o),e.fillStyle="#00FF00",e.font="12px monospace",e.textAlign="center",e.fillText(`${t.base}/${t.alternate}`,s+50,c-10)}) 69e.fillStyle="rgba(0, 0, 0, 0.85)",e.fillRect(20,50,400,150),e.fillStyle="#FFFFFF",e.font="bold 14px monospace",e.textAlign="left",e.fillText("FRC/Temporal Dithering Detection",30,75),e.font="12px monospace",e.fillStyle="#CCCCCC",["Camera capture instructions:","1. Set camera to 1/30s or 1/60s exposure","2. Take photo of screen","3. Look for alternating patterns in patches","4. Visible banding = temporal dithering active"].forEach((t,a)=>{e.fillText(t,30,95+18*a)}),e.fillStyle="#00FF00",e.fillText(`Mode: ${i}`,30,190)})(e,l,r,i)}f&&"overscan"!==o&&((e,t,l,r)=>{a(e,t,l,r,!1)})(e,l,r,c),p&&e.restore()}function t(e,t,a,l,r){const i=e.createImageData(t,a),data=i.data 70for(let e=0;e<a;e++)for(let a=0;a<t;a++){const i=4*(e*t+a) 71let o=!1 72switch(l){case"horizontal":o=e%2==0!==r 73break 74case"vertical":o=a%2==0!==r 75break 76case"diagonal":o=((a-e)%4==0||(a-e)%4==1)!==r}const n=o?255:0 77data[i]=n,data[i+1]=n,data[i+2]=n,data[i+3]=255}e.putImageData(i,0,0)}function a(e,t,a,l,r){const i=r?40:20;[{x:0,y:0,label:"TL"},{x:t-i,y:0,label:"TR"},{x:0,y:a-i,label:"BL"},{x:t-i,y:a-i,label:"BR"}].forEach(t=>{for(let a=0;a<i;a++)for(let l=0;l<i;l++){const r=(l+a)%2==0 78e.fillStyle=r?"#ffffff":"#000000",e.fillRect(t.x+l,t.y+a,1,1)}if(r){e.fillStyle="#00ff00",e.font="10px monospace" 79const a=t.label.includes("L")?t.x+i+5:t.x-50,r=t.label.includes("T")?t.y+i+15:t.y-5 80e.fillText(`${t.label}:${l}`,a,r)}}),e.strokeStyle="#ff00ff",e.lineWidth=1,e.strokeRect(.5,.5,t-1,a-1)}function l(e){return{frameCounter:(e.frameCounter+1)%1e3}}const r="Pixel Integrity Test - AV Tools | asenno",i="pixel-integrity",o={mode:"checkerboard-1px",subpixelType:"rgb",temporalMode:"static",frameCounter:0,showOverscan:!0,devicePixelMode:!1,linePattern:"horizontal",rotationAngle:15,moireScale:1,moireType:"sine"},n={"checkerboard-1px":"1px Checkerboard","lines-h":"Horizontal Lines","lines-v":"Vertical Lines","lines-d":"Diagonal Lines","rotated-lines":"Rotated Lines (Anti-aliasing)","fractal-moire":"Fractal/Moir\xe9 Patterns",subpixel:"Subpixel Pattern",siemens:"Siemens Star",resolution:"Resolution Wedges",overscan:"Overscan Test","frc-dither":"FRC/Temporal Dithering"},s={rgb:"RGB Stripe",bgr:"BGR Stripe",wrgb:"WRGB (OLED)",pentile:"PenTile"},c={static:"Static",invert1:"1-Frame Invert",invert2:"2-Frame Invert",linepair:"Line-Pair Invert","frc-flicker":"FRC 60Hz Flicker","frc-pattern":"FRC Test Pattern"},f={animate:!0,infoText:"Comprehensive pixel integrity tests including single-pixel patterns, rotated lines for anti-aliasing detection, fractal/moir\xe9 patterns for advanced aliasing analysis, subpixel structure testing, temporal dithering detection, and overscan boundary testing."},p={handlers:{m:e=>{const t=Object.keys(n),a=t.indexOf(e.mode) 81return{mode:t[(a+1)%t.length]}},s:e=>{if("subpixel"===e.mode){const t=Object.keys(s),a=t.indexOf(e.subpixelType) 82return{subpixelType:t[(a+1)%t.length]}}},t:e=>{const t=Object.keys(c),a=t.indexOf(e.temporalMode) 83return{temporalMode:t[(a+1)%t.length]}},d:e=>({devicePixelMode:!e.devicePixelMode}),o:e=>({showOverscan:!e.showOverscan}),a:e=>{if("rotated-lines"===e.mode){const t=[15,30,45,60,75],a=t.indexOf(e.rotationAngle) 84return{rotationAngle:t[(a+1)%t.length]}}return{}},y:e=>{if("fractal-moire"===e.mode){const t=["sine","circular","grid","fractal"],a=t.indexOf(e.moireType) 85return{moireType:t[(a+1)%t.length]}}return{}},r:e=>"fractal-moire"===e.mode?{moireScale:Math.min(e.moireScale+.2,3)}
85:{},f:e=>"fractal-moire"===e.mode?{moireScale:Math.max(e.moireScale-.2,.2)}:{}}} 86export{f as controls,o as defaultSettings,i as id,p as keyboard,n as modes,e as render,s as subpixelTypes,c as temporalModes,r as title,l as updatePosition}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.