1function e(e,{width:o,height:a},n){const{mode:r,showInstructions:i,showGrid:s,angleScore:c,panelType:g}=n 2switch(e.imageSmoothingEnabled=!1,e.clearRect(0,0,o,a),e.fillStyle="#000000",e.fillRect(0,0,o,a),r){case"gamma-shift":((e,t,o)=>{const a=.15*Math.min(t,o),n=.5*a,r=t/2,i=o/2,s=[{x:r,y:i-a-n},{x:r-a-n,y:i},{x:r,y:i},{x:r+a+n,y:i},{x:r,y:i+a+n}];[{value:0,label:"0%"},{value:64,label:"25%"},{value:128,label:"50%"},{value:192,label:"75%"},{value:255,label:"100%"}].forEach((t,o)=>{const n=s[o] 3e.fillStyle=`rgb(${t.value}, ${t.value}, ${t.value})`,e.fillRect(n.x-a/2,n.y-a/2,a,a),e.strokeStyle="rgba(255, 255, 255, 0.3)",e.lineWidth=1,e.strokeRect(n.x-a/2,n.y-a/2,a,a),l(e,t.label,n.x,n.y,{font:"bold 16px monospace",textColor:t.value>128?"#000000":"#FFFFFF",bgColor:"transparent"})}) 4const c=3*(a+n) 5e.strokeStyle="rgba(255, 255, 255, 0.2)",e.lineWidth=2,e.setLineDash([10,10]),e.strokeRect(r-c/2,i-c/2,c,c),e.setLineDash([])})(e,o,a) 6break 7case"color-shift":((e,t,o)=>{const a=.12*t,n=.2*o,r=.02*t,i=.1*t,s=.25*o,c=.55*o;[{r:255,g:0,b:0,name:"Red"},{r:0,g:255,b:0,name:"Green"},{r:0,g:0,b:255,name:"Blue"},{r:255,g:255,b:0,name:"Yellow"},{r:255,g:0,b:255,name:"Magenta"},{r:0,g:255,b:255,name:"Cyan"}].forEach((t,o)=>{const c=i+o*(a+r) 8e.fillStyle=`rgb(${t.r}, ${t.g}, ${t.b})`,e.fillRect(c,s,a,n),l(e,t.name,c+a/2,s-10,{font:"12px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.8)",baseline:"bottom"})}),[{r:255,g:224,b:189,name:"Light"},{r:234,g:192,b:134,name:"Fair"},{r:221,g:168,b:108,name:"Medium"},{r:182,g:132,b:83,name:"Olive"},{r:150,g:104,b:65,name:"Brown"},{r:95,g:65,b:43,name:"Dark"}].forEach((t,o)=>{const s=i+o*(a+r) 9e.fillStyle=`rgb(${t.r}, ${t.g}, ${t.b})`,e.fillRect(s,c,a,n),l(e,t.name,s+a/2,c+n+15,{font:"12px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.8)",baseline:"top"})}),l(e,"Skin Tone Reference",t/2,c-20,{font:"bold 16px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.8)",baseline:"bottom"})})(e,o,a) 10break 11case"polarization":((e,t,o)=>{const a=40,n=Math.floor(t/a),r=Math.floor(o/a),i=(t-n*a)/2,s=(o-r*a)/2 12for(let t=0;t<r;t++)for(let o=0;o<n;o++){const l=i+o*a,n=s+t*a 13e.fillStyle=(t+o)%2==0?"#FFFFFF":"#000000",e.fillRect(l,n,a,a)}const c=t/2,g=o/2,f=.15*Math.min(t,o) 14e.fillStyle="rgb(128, 128, 128)",e.beginPath(),e.arc(c,g,f,0,2*Math.PI),e.fill() 15const b=1.5*f 16e.strokeStyle="#00FF00",e.lineWidth=2,[0,45,90,135].forEach(t=>{const o=t*Math.PI/180,a=c+Math.cos(o)*f,n=g+Math.sin(o)*f,r=c+Math.cos(o)*b,i=g+Math.sin(o)*b 17e.beginPath(),e.moveTo(a,n),e.lineTo(r,i),e.stroke() 18const s=c+Math.cos(o)*(b+20),h=g+Math.sin(o)*(b+20) 19l(e,`${t}\xb0`,s,h,{font:"bold 14px monospace",textColor:"#00FF00",bgColor:"rgba(0, 0, 0, 0.9)"})})})(e,o,a) 20break 21case"panel-tech":((e,o,a,n)=>{const{panelType:r}=n 22if("ips"===r||"unknown"===r){e.fillStyle="#000000",e.fillRect(0,0,o,a) 23const t=.15*Math.min(o,a),n=40,r=3,i=`rgb(${r}, ${r}, ${r})`;[{x:n,y:n,label:"TL"},{x:o-t-n,y:n,label:"TR"},{x:n,y:a-t-n,label:"BL"},{x:o-t-n,y:a-t-n,label:"BR"}].forEach(o=>{e.fillStyle=i,e.fillRect(o.x,o.y,t,t),e.strokeStyle="rgba(255, 255, 255, 0.1)",e.lineWidth=1,e.strokeRect(o.x,o.y,t,t),l(e,o.label,o.x+t/2,o.y+t/2,{font:"bold 16px monospace",textColor:"#666666",bgColor:"transparent"})}) 24const s=1.2*t 25e.fillStyle=i,e.fillRect(o/2-s/2,a/2-s/2,s,s),e.strokeStyle="rgba(255, 255, 255, 0.1)",e.strokeRect(o/2-s/2,a/2-s/2,s,s),l(e,"CENTER",o/2,a/2,{font:"bold 16px monospace",textColor:"#666666",bgColor:"transparent"}),l(e,"IPS GLOW TEST",o/2,a-40,{font:"bold 18px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.8)"})}else if("va"===r){const t=o/2,n=a/2 26e.fillStyle="#000000",e.fillRect(0,0,o,a) 27const r=.25*Math.min(o,a),i=.3*r;[{x:t-i,y:n-i},{x:t+i,y:n-i},{x:t-i,y:n+i},{x:t+i,y:n+i}].forEach(t=>{e.fillStyle="#FFFFFF",e.fillRect(t.x-r/2,t.y-r/2,r,r) 28const o=.6*r 29e.fillStyle="#000000",e.fillRect(t.x-o/2,t.y-o/2,o,o)}),e.fillStyle="rgb(128, 128, 128)",e.fillRect(t-r/3,n-r/3,2*r/3,2*r/3),l(e,"VA CONTRAST TEST",o/2,a-40,{font:"bold 18px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.8)"})}else{t(e,o,a) 30const l=60,n=20 31e.fillStyle="#FFFFFF",e.fillRect(n,n,l,l),e.fillRect(o-n-l,n,l,l),e.fillStyle="#000000",e.fillRect(n+10,n+10,l-20,l-20),e.fillRect(o-n-l+10,n+10,l-20,l-20)}})(e,o,a,n) 32break 33case"split-gamma":((e,t,o)=>{const a=t/2,n=t/8,r=.8*o,i=(o-r)/2,s=[{lStar:0,rgb:0,label:"L*0"},{lStar:18,rgb:32,label:"L*18"},{lStar:25,rgb:52,label:"L*25"},{lStar:32,rgb:76,label:"L*32"},{lStar:50,rgb:128,label:"L*50"},{lStar:68,rgb:179,label:"L*68"},{lStar:75,rgb:204,label:"L*75"},{lStar:82,rgb:224,label:"L*82"}
33,{lStar:100,rgb:255,label:"L*100"}] 34s.forEach((t,o)=>{const c=a-(s.length/2-o)*n 35e.fillStyle=`rgb(${t.rgb}, ${t.rgb}, ${t.rgb})`,e.fillRect(c,i,n,r),e.strokeStyle="rgba(255, 255, 255, 0.3)",e.lineWidth=1,e.strokeRect(c,i,n,r),l(e,t.label,c+n/2,i-10,{font:"12px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.8)",baseline:"bottom"}),l(e,`${t.rgb}`,c+n/2,i+r+10,{font:"11px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.8)",baseline:"top"})}),e.strokeStyle="rgba(255, 0, 0, 0.6)",e.lineWidth=2,e.setLineDash([10,5]),e.beginPath(),e.moveTo(a,0),e.lineTo(a,o),e.stroke(),e.setLineDash([]),l(e,"SPLIT GAMMA TEST - Compare sides at different angles",t/2,30,{font:"bold 16px monospace",textColor:"#FFFFFF",bgColor:"rgba(0, 0, 0, 0.9)"}),l(e,"Left & Right should match when viewed straight on",t/2,o-30,{font:"14px monospace",textColor:"#FFFF00",bgColor:"rgba(0, 0, 0, 0.8)"})})(e,o,a) 36break 37case"ips-glow":t(e,o,a) 38break 39case"va-contrast":((e,t,o)=>{const a=t/2,n=o/2 40e.fillStyle="#000000",e.fillRect(0,0,t,o) 41const r=.3*Math.min(t,o),i=.2*r 42e.fillStyle="#FFFFFF",e.fillRect(a-r/2,n-r/2,r,r) 43const s=.6*r 44e.fillStyle="#000000",e.fillRect(a-s/2,n-s/2,s,s) 45const c=.4*r;[{x:a-r-i,y:n},{x:a+r+i,y:n},{x:a,y:n-r-i},{x:a,y:n+r+i}].forEach(t=>{e.fillStyle="rgb(128, 128, 128)",e.fillRect(t.x-c/2,t.y-c/2,c,c)}),l(e,"CONTRAST TEST",a,n,{font:"bold 24px monospace",textColor:"#FFFFFF",bgColor:"transparent"})})(e,o,a)}i&&((e,t,o,l)=>{const a={"gamma-shift":["1. View display straight on (0\xb0)","2. Note brightness of gray patches","3. Move to 30\xb0, 45\xb0, 60\xb0 angles","4. Check for brightness/gamma shifts","5. Score uniformity (1-10)"],"color-shift":["1. View colors straight on","2. Note color appearance","3. View from different angles","4. Check for color shifts","5. Pay attention to skin tones"],polarization:["1. Put on polarized sunglasses","2. Rotate head 45\xb0 while viewing","3. Check for pattern changes","4. Note any color shifts","5. Remove glasses and compare"],"panel-tech":["1. View pattern straight on first","2. Look at corners from 45\xb0 angle","3. Check for glow (IPS) or wash-out (VA)","4. Compare corner vs center brightness","5. Identify panel technology type"],"split-gamma":["1. View blocks straight on - should match","2. Tilt display or move to side angle","3. Note which blocks shift differently","4. Check for gamma curve variations","5. Compare left/right side differences"],"ips-glow":["1. Set brightness to normal level","2. View in dark room","3. Look at corners from angle","4. Check for bright glow","5. Compare corners to center"],"va-contrast":["1. View contrast pattern straight on","2. Note black level quality","3. View from side angles","4. Check for contrast reduction","5. Compare to center reference"]},n=Math.max(...a[l].map(t=>e.measureText(t).width)) 46e.fillStyle="rgba(0, 0, 0, 0.9)",e.fillRect(15,15,n+30,25*a[l].length+30),e.fillStyle="#FFFFFF",e.font="14px monospace",e.textAlign="left",e.textBaseline="top",a[l].forEach((t,o)=>{e.fillText(t,30,30+25*o)})})(e,0,0,r),s&&((e,t,o)=>{const l=t/2,a=o/2,n=.4*Math.min(t,o) 47e.strokeStyle="rgba(255, 255, 255, 0.1)",e.lineWidth=1,e.setLineDash([5,5]),[0,15,30,45,60,75,90].forEach(t=>{[-1,1].forEach(o=>{const r=t*Math.PI/180,i=l+o*Math.cos(r)*n,s=a-Math.sin(r)*n,c=a+Math.sin(r)*n 48e.beginPath(),e.moveTo(l,a),e.lineTo(i,a),e.stroke(),t>0&&(e.beginPath(),e.moveTo(l,a),e.lineTo(i,s),e.stroke(),e.beginPath(),e.moveTo(l,a),e.lineTo(i,c),e.stroke())})}),e.setLineDash([])})(e,o,a),((e,t,o,l)=>{const a=t-200,n=o-100,r=150 49e.fillStyle="rgba(0, 0, 0, 0.8)",e.fillRect(a-10,n-40,170,80),e.fillStyle="#FFFFFF",e.font="bold 14px monospace",e.textAlign="center",e.fillText("Viewing Quality",a+75,n-20),e.fillStyle="rgba(255, 255, 255, 0.2)",e.fillRect(a,n,r,20) 50const i=l/10*r,s=l/10*120 51e.fillStyle=`hsl(${s}, 70%, 50%)`,e.fillRect(a,n,i,20),e.fillStyle="#FFFFFF",e.font="bold 16px monospace",e.fillText(`${l}/10`,a+75,n+20+20)})(e,o,a,c)}function t(e,t,o,a){e.fillStyle="#000000",e.fillRect(0,0,t,o) 52const n=.2*Math.min(t,o),r=50,i="rgb(10, 10, 10)";[{x:r,y:r},{x:t-n-r,y:r},{x:r,y:o-n-r},{x:t-n-r,y:o-n-r}
52].forEach((t,o)=>{e.fillStyle=i,e.fillRect(t.x,t.y,n,n),l(e,["TL","TR","BL","BR"][o],t.x+n/2,t.y+n/2,{font:"bold 20px monospace",textColor:"#FFFFFF",bgColor:"transparent"})}) 53const s=1.5*n 54e.fillStyle=i,e.fillRect(t/2-s/2,o/2-s/2,s,s),e.strokeStyle="rgba(255, 255, 255, 0.05)",e.lineWidth=1 55for(let l=0;l<t;l+=100)e.beginPath(),e.moveTo(l,0),e.lineTo(l,o),e.stroke() 56for(let l=0;l<o;l+=100)e.beginPath(),e.moveTo(0,l),e.lineTo(t,l),e.stroke()}function o(e){const t=Object.keys(i),o=t.indexOf(e) 57return t[(o+1)%t.length]}import{d as l}from"./B8jpHuQS.js" 58const a="Viewing Angle Test - AV Tools | asenno",n="viewing-angle",r={mode:"gamma-shift",showInstructions:!0,showGrid:!0,angleScore:5,panelType:"unknown"},i={"gamma-shift":"Gamma Shift Test","color-shift":"Color & Skin Tone",polarization:"Polarization Check","panel-tech":"Panel Tech Tests","split-gamma":"Split L* Blocks","ips-glow":"IPS Glow Test","va-contrast":"VA Contrast Test"},s={unknown:"Unknown",ips:"IPS/PLS",va:"VA/MVA/PVA",tn:"TN",oled:"OLED"},c={handlers:{m:e=>({...e,mode:o(e.mode)}),i:e=>({...e,showInstructions:!e.showInstructions}),g:e=>({...e,showGrid:!e.showGrid}),ArrowUp:e=>({...e,angleScore:Math.min(10,e.angleScore+1)}),ArrowDown:e=>({...e,angleScore:Math.max(1,e.angleScore-1)}),1:e=>({...e,angleScore:1}),2:e=>({...e,angleScore:2}),3:e=>({...e,angleScore:3}),4:e=>({...e,angleScore:4}),5:e=>({...e,angleScore:5}),6:e=>({...e,angleScore:6}),7:e=>({...e,angleScore:7}),8:e=>({...e,angleScore:8}),9:e=>({...e,angleScore:9}),0:e=>({...e,angleScore:10})}},g={infoText:"Test viewing angle characteristics, panel technology, and polarization effects. Panel-tech mode identifies IPS glow vs VA contrast shift. Split-gamma shows L* blocks for gamma curve analysis. Use physical viewing angles for testing. Score quality from 1-10."} 59export{g as controls,r as defaultSettings,n as id,c as keyboard,i as modes,s as panelTypes,e as render,a as title}
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.