Code archives/Graphics/Aspect Ratio Helper Thing
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This may well be of use to NOBODY except me, but it is a list of common computer resolutions and information on their aspect ratios, and methods to look up one from the other, eg. resolution from ratio name. IMPORTANT: You need to download the file linked below and place it in the same folder as this source code, or it won't do anything! (Observing Wikipedia license restriction, as I adapted an article from there for this information.) http://www.hi-toro.com/blitz/misc/computer_resolutions.txt (Right-click the above link and save; place in same folder as this code. Do not edit this text file or failure will almost certainly result!) | |||||
' Updated as I needed some sorting options to output a couple of lists...
SuperStrict
' Sort modes...
Const ASPECT_NAME:Int = 1
Const ASPECT_RATIO:Int = 2
Const ASPECT_WIDTH:Int = 3
Type Resolution
' See license for the required text file at the end of
' "www.hi-toro.com/blitz/misc/computer_resolutions.txt" --
' information from Wikipedia under Creative Commons
' Attribution-ShareAlike License, hence separate file.
' (This source code is still in the public domain.)
Global ResList:TList = CreateList ()
Global SortMode:Int = ASPECT_WIDTH
Field name:String
Field width:Int
Field height:Int
Field aspectreadable:String
Field aspectnumerical:String ' Stored as string as float will be inaccurate
Method New ()
ListAddLast ResList, Self
End Method
Method Compare:Int (obj:Object)
Select SortMode
Case ASPECT_NAME
Return Self.AspectName () > Resolution (obj).AspectName ()
Case ASPECT_RATIO
Return Self.AspectRatio () > Resolution (obj).AspectRatio ()
Case ASPECT_WIDTH
Return Self.AspectWidth () > Resolution (obj).AspectWidth ()
Default
Return 0
End Select
End Method
Method AspectName:String ()
Return name
End Method
Method AspectWidth:Int ()
Return width
End Method
Method AspectHeight:Int ()
Return height
End Method
' This is called AspectRatio as this is what most people would quote, eg. "16:9"...
Method AspectRatio:String ()
Return aspectreadable
End Method
' This is the float version, for calculations (returns width part of ratio, to be compared to 1.0 for height)...
Method Aspect:Float ()
Return Float (aspectnumerical)
End Method
' Just a dumb listing...
Function ListAspectInfo:Int ()
SortList ResList
For Local res:Resolution = EachIn Resolution.ResList
Print res.AspectName () + ": " + res.AspectWidth () + " x " + res.AspectHeight () + " (" + res.AspectRatio () + ", or " + res.Aspect () + " as float)"
Next
End Function
Function ListRatios:Int ()
SortList ResList
For Local res:Resolution = EachIn Resolution.ResList
Print res.AspectRatio () + "~t~t" + res.AspectWidth () + " x " + res.AspectHeight ()
Next
End Function
Function ListResolutions:Int ()
SortList ResList
For Local res:Resolution = EachIn Resolution.ResList
Print res.AspectWidth () + " x " + res.AspectHeight () + "~t~t" + res.AspectRatio ()
Next
End Function
Function AspectFromRes:String (width:Int, height:Int)
For Local res:Resolution = EachIn Resolution.ResList
If res.width = width And res.height = height Then Return res.AspectName ()
Next
Return "[Unknown aspect ratio]"
End Function
Function ResFromAspect:String (aspect:String)
For Local res:Resolution = EachIn Resolution.ResList
If Left (res.AspectName (), Len (aspect)) = aspect Then Return String (res.width) + " x " + String (res.height)
Next
Return "[Unknown aspect ratio]"
End Function
Function ResObjFromRes:Resolution (width:Int, height:Int)
For Local res:Resolution = EachIn Resolution.ResList
If res.width = width And res.height = height Then Return res
Next
Return Null
End Function
Function ResObjFromAspectName:Resolution (aspect:String)
For Local res:Resolution = EachIn Resolution.ResList
If Left (res.AspectName (), Len (aspect)) = aspect Then Return res
Next
Return Null
End Function
Function ReadResolutions:Int ()
Local res:Resolution
Local file:TStream = ReadFile ("computer_resolutions.txt")
If file
While Not Eof (file)
Local in:String = ReadLine (file)
If in = "" Then Exit
Local char:Int
Local index:Int = 0
Local chunk:String = ""
' One line split by tabs. I seem to be missing the last element
' somehow, but it's only the pixel count, ie. width * height...
Local chunkcount:Int = 0
While index < Len (in)
char = in [index]
Select char
Case 9 ' Tab
chunkcount = chunkcount + 1
Select chunkcount
Case 1
res = New Resolution
res.name = chunk
Case 2
res.width = Int (chunk)
Case 3
' "x"
Case 4
res.height = Int (chunk)
Case 5
res.aspectreadable = chunk
Case 6
res.aspectnumerical = chunk + ":1.0"
End Select
chunk = ""
Default
chunk = chunk + Chr (char)
End Select
index = index + 1
Wend
Wend
CloseFile file
Return True
EndIf
End Function
End Type
' D E M O . . .
' IMPORTANT: Must read the list from "computer_resolutions.txt" first, using Resolution.ReadResolutions ()!
If Resolution.ReadResolutions () = False Then Notify "Can't read resolutions file!"; End
Print ""
Print "Aspect list..."
Print ""
Resolution.ListAspectInfo
Print ""
Print "Aspect names from resolutions..."
Print ""
Print "1024 x 768:~t~t" + Resolution.AspectFromRes (1024, 768)
Print "640 x 400:~t~t" + Resolution.AspectFromRes (640, 400)
Print "1280 x 1024:~t~t" + Resolution.AspectFromRes (1280, 1024)
Print "512 x 123:~t~t" + Resolution.AspectFromRes (512, 123)
Print "1920 x 1080:~t~t" + Resolution.AspectFromRes (1920, 1080)
Print ""
Print "Resolutions from aspect names..."
Print ""
' Note that strings can be partial, but only first in list will be returned. For
' example, VGA is listed as "VGA, MCGA (in monochome), Sun-1 color"...
Print "VGA:~t~t" + Resolution.ResFromAspect ("VGA") + " [Same as ~qVGA, MCGA (in monochome), Sun-1 color~q: " + Resolution.ResFromAspect ("VGA, MCGA (in monochome), Sun-1 color") + "]"
Print "HD 1080:~t" + Resolution.ResFromAspect ("HD 1080")
Print "SXGA:~t~t" + Resolution.ResFromAspect ("SXGA")
Print "FAKEGA:~t" + Resolution.ResFromAspect ("FAKEGA")
Print "WVGA:~t~t" + Resolution.ResFromAspect ("WVGA")
Print ""
Print "Get Resolution objects..."
Print ""
Local res1:Resolution = Resolution.ResObjFromRes (640, 480)
Local res2:Resolution = Resolution.ResObjFromAspectName ("720p")
If res1 And res2
Print res1.AspectName ()
Print res2.AspectRatio ()
EndIf
Print ""
Print "Sorted by resolution, resolution listed first..."
Print ""
Resolution.SortMode = ASPECT_WIDTH
Resolution.ListResolutions
Print ""
Print "Sorted by ratio, ratio listed first..."
Print ""
Resolution.SortMode = ASPECT_RATIO
Resolution.ListRatios |
Comments
None.
Code Archives Forum