Register - Login
Views: 99347794
Main - Memberlist - Active users - Calendar - Wiki - IRC Chat - Online users
Ranks - Rules/FAQ - Stats - Latest Posts - Color Chart - Smilies
04-21-22 05:11:33 PM
Jul - NO! GO TO STAR! - Okay guys, I had an idea for a game New poll - New thread - Thread closed
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Next newer thread | Next older thread
Disch
User
Level: 9


Posts: 2/11
EXP: 2498
For next: 664

Since: 06-18-09


Since last post: 12.4 years
Last activity: 12.2 years

Posted on 06-19-09 04:02:24 PM Link
Originally posted by Sukasa
And of course, talk abouu dshlib in here if you want!



Mwahahahahahahahah

I made some changes to make it easier to load audio files from normal files (ie: via a file/path name).


// old:

SoundPtr snd = new StreamedSound( new SoundSource_Ogg( new File( "file.ogg" ) ) )

// new:
SoundPtr snd = new StreamedSound( SoundSource::Load( "file.ogg" ) )



These two are more or less equivilent. SoundSource::Load queries the "smart loader" which examines the file header to determine the file type, and creates the approprite SoundSource object. Currently the only supported format is .ogg so it's not all that significant, but as support for more formats are added in the future this will be handy. The smart loader already existed in the version I gave Sukasa, but you had to give it a FilePtr... ie: "Load( new File( "file.ogg" ) )".

I did some more work on some different File structures. Nothing that would have much practical use outside the lib (and least I wouldn't think so), but some stuff that will be useful for internal workings.

As for an overall layout of dshlib:

Stuff that's done:

- Unicode friendly strings (classes for utf8, utf16 and utf32 strings, all interchangable and having the same interface). These strings are used internally by dshlib for things like file and pathnames (and anything else where strings are used), so Unicode support is built-in, effortless, and idiot proof.

- Abstracted FileBase for I/O operations. Most things in dshlib that perform I/O do so through a FilePtr -- what that FilePtr represents is up to you: a file on the disk, a temporary file that's deleted on close, an in-memory buffer, a file inside a .zip archive, etc. Complete with file resizing capabilities, endian-safe read/write routines for integers (still need to come up with something for floating points, though), and other goodies.

- Abstracted interface for the FileSystem, and file searching. Search for specific file(s) based on name ("somedir/*.png") and get a compiled list of matches. Abstracted interface makes it easily portable, and applicable to filesystems other than the computer's file system. IE: a .zip archive would have the exact same interface -- and you could traverse its directories and search for files in the same manner.

- A "FileName" class which parses a string and separates it into a list of directories, a file title, and extension.

- Smart pointers (dshlib::refptr) which auto-delete the owned object when all references to it lose scope. Not unlike boost::shared_ptr, except refptrs are thread-safe (needed this for the audio engine, where objects may be shared between multiple threads). A similar refarray class for arrays. Worry not about memory leaks.

- Highly abstracted Audio system with rich feature list and powerful adaptability. The interface is set up so it's easy to do basic things, but is still possible to have more fine control.

- An abstracted "Transform" interface for doing conversions of any sort. Useful for things like compression, encryption, or simply converting binary data from one format to another.

- Classes to wrap zlib inflate and deflate behind the abstracted Transform interface, for much simpler compression/decompression of data.

- Everything is very modular and OO friendly. Anything that uses an external lib (like the SDL based audio device, or the vorbis file .ogg reader, etc) is behind an #ifdef, so if you don't want to use that lib you can change a line in the header file and remove those classes from the lib. Everything that requires something lib or OS specific is contained in its own class, so if SDL audio doesn't suit your needs, you can write a new AudioOut class to use whichever output method you need, and everything in dshlib will work exactly the same. OS specific classes (for stuff like directory searching, file I/O, etc) are isolated and modular so porting to other systems is easy. To add support for Windows I couldn't use any of the code I was using for Linux, and was still able to add support for it in a day.

Stuff that I'm still working on:

- .zip file support. The goal is to use an abstract 'Archive' class so that other formats like .7z or .rar may be easily added in the future. Other goals are for transparent reading/writing of files, creating new files/directories in the archive and deleting existing ones. Optional caching of the archived file to a temp file, so that you can do seek operations, and so it only needs to be decompressed once. Basically the goal is to make the fact that the files are in an archive and don't actually exist completely transparent to the user, so that files can be treated just as if they were normal files. This is quite a task, but the interface is there -- I just have to write the code for it. I've got a layout in mind and a lot of the hard code written already.

- A Checksum abstraction, behind which will be things like MD5, CRC32, etc. I'll need to add this for .zip files anyway, but it could have other uses.

- A DSPSound abstraction, which can act as a filter for sounds. So if you want to add echo, or to muffle the sound, or something like that. This would also be used to re-sample a sound so that you can play a file with a samplerate that doesn't match your output samplerate -- which is currently prohibited by dshlib.

Stuff I plan to do eventually:

- a pRNG abstraction. Behind which could be one or more RNGs of varying complexity. Pick the one you want and use it anywhere. I'm not a fan of Mersenne Twister because it's very obfuscated -- but I've come across other RNGs. Two in particular that I like: one that is quick and simple with a 32-bit period, and another with an even longer period than MT, but not as computationally expensive, and much easier to understand and use. RNGs would be able to have their state dumped and reloaded, allowing you to reproduce the same string of random numbers if required like for a movie recording or something -- or for reproducing the same randomly generated dungeon multiple times.

- An abstracted interface for images, image data, and the like. .png/.bmp/whathaveyou file loading/saving.

- An abstracted interface for texture/drawing surfaces that work with .png/etc loaders. IE: load a png directly to an OpenGL texture, or an SDL surface.

- A bitmapped font file format (vwf data followed by .pngs containing the bitmapped font) and ways to draw text using the bitmapped file. I actually had a font bitmapper, but had to scrap it because it had a fatal bug that wasn't exposed on my computer, but crashed on every other computer that ran it . But I have the file format down, and have the ability to bitmap files.

- A flexible text file format (possibly something similar to xml, but maybe something custom) to keep all game text in an external file for easy translation/internationalization. I kicked around ideas for this but never actually commited to anything yet. I figured I shouldn't focus on it until I finish the bitmapped font stuff.

- .spc / .nsf file support. weeeeeeeeeeeee. The interface is already there, I'd just have to write a player for it (I've written players for both, before)



ANYWAY that's dshlib in a nutshell. My goals/dreams/etc. I don't know how much of this is useful for this particular game but I felt compelled to write this huge post anyway. Like I say if you guys have features you'd like me to focus on for this game, I'd be willing to consider giving them a higher priority.
Hiryuu

Level: 206


Posts: 11060/14435
EXP: 127485540
For next: 127839

Since: 07-06-07


Since last post: 11.8 years
Last activity: 11.7 years

Posted on 06-19-09 04:35:56 PM Link
NotSoFatso and related in-game?

That oughta be sweet.

____________________
Sukasa

Level: 123


Posts: 1112/4326
EXP: 20913309
For next: 317957

Since: 07-07-07


Since last post: 1.1 years
Last activity: 1.0 years

Posted on 06-19-09 06:06:43 PM Link
Me PM
Yeah, some of the more esoteric formats would be great, and I'm loving the idea of the smart loader for files... Though, it'd be great if there were a relatively easy way, then, to determine whether the music BGM was a series of two tracks, or just a single one (e.g. SPC), a simple IsStream() function might work for that (Idea being, SPC's/NSFs/anything looping would return false).

____________________
Disch
User
Level: 9


Posts: 3/11
EXP: 2498
For next: 664

Since: 06-18-09


Since last post: 12.4 years
Last activity: 12.2 years

Posted on 06-19-09 06:55:44 PM Link
x->GetInfo().forever works for individual sounds / sound sources (ie, for OGG it would be false, but for SPC it would be true), but for BGMSound, 'forever' would be true if there's a loop portion.

I suppose to get around that you could retain the SoundSource rather than discarding it immediately:




SoundSourcePtr src = SoundSource::Load( "yourfile" )
if(src->GetInfo().forever) // sound file loops forever

// create StreamingSound or whatever with 'src' here

Sukasa

Level: 123


Posts: 1113/4326
EXP: 20913309
For next: 317957

Since: 07-07-07


Since last post: 1.1 years
Last activity: 1.0 years

Posted on 06-19-09 07:07:58 PM Link
Me PM
That code segment was basically what I was thinking, too

____________________
Disch
User
Level: 9


Posts: 4/11
EXP: 2498
For next: 664

Since: 06-18-09


Since last post: 12.4 years
Last activity: 12.2 years

Posted on 06-22-09 04:09:04 PM Link
Resampling via linear interpolation is done! You can now play files of any samplerate. Simplistic example:




SoundPtr snd = new StreamingSound( SoundSource::Load( "yourfile.ogg" ) )

if(snd->GetInfo().samplerate != outputsamplerate)
snd = new DSPSound( new DSPResample_Linear(outputsamplerate), snd )

audout.GetMixer().Play(snd)



Was a bit of work because I had to construct the DSPSound abstract base class, as well as the DSPTransform abstraction for the actual audio filtering effects. This will make it much easier to add new audio filters and stuff.

I thought about making this automated (if you try to play a sound of a differing samplerate, it would automatically apply the resampling filter), but that introduces a whole new series of problems that would not easily be addressed. I might wiggle something in in the future, but meh. I don't think the above code to play a sound is unreasonable.

Anyway -- cross that off the list. I guess that means I should go back to .zip files now.
GuyPerfect
Catgirl
Level: 68


Posts: 664/1096
EXP: 2662811
For next: 65989

Since: 07-23-07


Since last post: 1.6 years
Last activity: 208 days

Posted on 06-22-09 04:57:49 PM Link
Originally posted by Disch
[...] endian-safe read/write routines for integers (still need to come up with something for floating points, though) [...]
I wrote this function for an unrelated project that reads IEEE-754 singles, but it could easily be modified to make a write routine as well as support doubles. This is set up for little-endian, though you can make an alternate GetUInt32 macro for when big-endian is needed.

#define GetUInt32(X, Y) ((X[Y+3]<<24)|(X[Y+2]<<16)|(X[Y+1]<<8)|X[Y])


// Returns the floating-point value for 32 bits (s23e8)
float GetSingle(unsigned char *fData, unsigned int fOff) {
unsigned int Temp, S1, M1;
int E1;
double S2, E2, M2, Ret;

// Get raw data
Temp = GetUInt32(fData, fOff);

// Parse bits
S1 = (Temp & 0x80000000) >> 31;
E1 = (Temp & 0x7F800000) >> 23;
M1 = Temp & 0x7FFFFF;

// Process as floating-point
S2 = 1.0f; if (S1) S2 = -1.0f;
E2 = (double) (E1 - 127);
M2 = (double) M1 / 0x800000;

// Composite floating-point value
if (E1) Ret = S2 * pow(2, E2) * (1.0 + M2);
else Ret = S2 * M2;

// Return value
return (float) Ret;
}
Disch
User
Level: 9


Posts: 5/11
EXP: 2498
For next: 664

Since: 06-18-09


Since last post: 12.4 years
Last activity: 12.2 years

Posted on 06-22-09 06:31:32 PM Link
Hmmm... very interesting.

So you read it from the file as if it had 23 mantissa bits, but make no assumption that the type 'float' has exactly 23. That's definatly nice (I like the assuming as little as possible). Although I think this might choke on things like NaN or infinity though.

I'm wondering if I shouldn't just take a 'float' as-is and dump it to a file and just assume that when read, 'float' will have the same binary structure. I already assume 2's compliment for signed integers... maybe it's safe to assume IEEE-754 for floating points?

Thanks for the link and example code! This definately gives me things to think about.
GuyPerfect
Catgirl
Level: 68


Posts: 666/1096
EXP: 2662811
For next: 65989

Since: 07-23-07


Since last post: 1.6 years
Last activity: 208 days

Posted on 06-22-09 07:59:44 PM Link
Originally posted by Disch
So you read it from the file as if it had 23 mantissa bits, but make no assumption that the type 'float' has exactly 23.

The link I posted shows the floating-point format used by nearly every computer manufactured today. The format is used natively by the processor, and will be the same regardless of your target system or programming language.

The only reason I used doubles in that function to composite the resulting value was because I didn't want bit information to get lost during the arithmetic.

Originally posted by Disch
Although I think this might choke on things like NaN or infinity though.

It will, but you can just throw in a few if statements. Infinity is present when (E1 == 0xFF && M1 == 0), and NaN is present when (E1 == 0xFF && M1 > 0).

Originally posted by Disch
I'm wondering if I shouldn't just take a 'float' as-is and dump it to a file and just assume that when read, 'float' will have the same binary structure.

That in itself is a safe assumption, given the IEEE-754 definition of the float data type. However, writing float variables directly to disk will completely circumvent any endianness precautions, making data written by one computer potentially read incorrectly by a different one.
Disch
User
Level: 9


Posts: 6/11
EXP: 2498
For next: 664

Since: 06-18-09


Since last post: 12.4 years
Last activity: 12.2 years

Posted on 06-22-09 08:37:51 PM (last edited by Disch at 06-22-09 06:07 PM) Link
Originally posted by GuyPerfect
That in itself is a safe assumption, given the IEEE-754 definition of the float data type.


That's probably what I'll look into, then.


However, writing float variables directly to disk will completely circumvent any endianness precautions, making data written by one computer potentially read incorrectly by a different one.


Of course. The trick is to do a binary dump in an endian-safe manner. I'll probably fall back to some casting tricks.

Thanks again. I'll whip something together and post what I came up with.

EDIT:

My original plan was to reinterpret_cast it to an integral type and then use my integer read/write handlers. However since I'm making these templated functions, the integer type would need to be determined dynamically, which was kind of a pain in the ass.

So I just said "screw it" and fell back to #if style endian checks:




template <typename T> inline T FileBase::GetFlt(bool* isok)
{
static bool dummy;
if(!isok) isok = &dummy;

T ret = 0;
u8* p = reinterpret_cast<u8*>(&ret)

#if DSHLIB_ENDIAN == DSHLIB_ENDIAN_LITTLE
*isok = (Read(p,sizeof(T)) == sizeof(T))
#elif DSHLIB_ENDIAN == DSHLIB_ENDIAN_BIG
int i;
*isok = true;
for(i = sizeof(T)-1; i >= 0; --i)
{
if(!Read(&p[i],1))
{
*isok = false;
break;
}
}
#else
#error "dshlib: Unknown system endianness in FileBase::GetFlt"
#endif

return ret;
}

template <typename T> inline bool FileBase::PutFlt(T v)
{
u8* p = reinterpret_cast<u8*>(&v)

#if DSHLIB_ENDIAN == DSHLIB_ENDIAN_LITTLE
return (Write(p,sizeof(T)) == sizeof(T))
#elif DSHLIB_ENDIAN == DSHLIB_ENDIAN_BIG
int i;
for(i = sizeof(T)-1; i >= 0; --i)
{
if(!Write(&p[i],1))
return false;
}
return true;
#else
#error "dshlib: Unknown system endianness in FileBase::PutFlt"
#endif
}



I then realized this code would work for integral types, too. And in a way it's simpler than my non #if'd GetInt/PutInt functions (which do a bunch of bitshifting inside a loop). Perhaps I'll rename these float functions to just Get and Put and then you can use the same function for all types.




myfile->Put<float>(2.5f)
myfile->Put<double>(3.14)
myfile->Put<u16>(1234) // etc



Maybe Get/Put is too generic for something that should only be used on basic type.

GetNum/PutNum? I'll think of something.
Hiryuu

Level: 206


Posts: 11407/14435
EXP: 127485540
For next: 127839

Since: 07-06-07


Since last post: 11.8 years
Last activity: 11.7 years

Posted on 07-03-09 12:53:30 AM Link
How goes things on this?

____________________
Tyty

Level: 165


Posts: 3920/8599
EXP: 58610713
For next: 324968

Since: 07-07-07


Since last post: 9.8 years
Last activity: 9.8 years

Posted on 07-03-09 12:56:09 AM Link
I'm just trying to decide on a 4th boss to use, then I'll make a huge write-up like yours on the characters Hiryuu. :|

____________________
Hiryuu

Level: 206


Posts: 11410/14435
EXP: 127485540
For next: 127839

Since: 07-06-07


Since last post: 11.8 years
Last activity: 11.7 years

Posted on 07-03-09 12:57:49 AM Link
Gee...you make it sound like a marathon and I just took four hours straight to write it out.

It really isn't that big a deal, honestly.

____________________
Tyty

Level: 165


Posts: 3922/8599
EXP: 58610713
For next: 324968

Since: 07-07-07


Since last post: 9.8 years
Last activity: 9.8 years

Posted on 07-03-09 12:59:47 AM Link
It's not a big deal. I'm just saying it's big.

Besides, I'll need something to do.

So uh, boss brainstorming go? :x

____________________
Hiryuu

Level: 206


Posts: 11411/14435
EXP: 127485540
For next: 127839

Since: 07-06-07


Since last post: 11.8 years
Last activity: 11.7 years

Posted on 07-03-09 01:08:21 AM Link
Stick what fits I guess...

Only reason mine turned out as easy as they did was because I was working with the concepts for some time.

____________________
Sukasa

Level: 123


Posts: 1134/4326
EXP: 20913309
For next: 317957

Since: 07-07-07


Since last post: 1.1 years
Last activity: 1.0 years

Posted on 07-03-09 01:12:12 AM Link
Me PM
New computer get. Expect me to be online and able to work on this again Sat-Sun

____________________
Hiryuu

Level: 206


Posts: 11412/14435
EXP: 127485540
For next: 127839

Since: 07-06-07


Since last post: 11.8 years
Last activity: 11.7 years

Posted on 07-03-09 01:16:00 AM Link
Originally posted by Sukasa
New computer get. Expect me to be online and able to work on this again Sat-Sun


Awesome.

____________________
Miasmir
Member

Level: 50


Posts: 110/528
EXP: 890151
For next: 57166

Since: 07-26-07

From: Lavastone (don't tell the pirate orcs)

Since last post: 75 days
Last activity: 27 days

Posted on 07-03-09 04:03:45 PM Link
I only wish I were so free of other obligations that I could spend the 4th of July programming.

Most of my issues are resolved, I just need to get off my lazy ass and read what's already been coded so I don't do anything exceptionally stupid. But I have to wait until family stuff is over, .
Pandaren
Still something.
Level: 108


Posts: 1444/3196
EXP: 13229768
For next: 290731

Since: 08-17-07

From: Finland

Since last post: 1.3 years
Last activity: 93 days

Posted on 07-03-09 06:20:34 PM Link
fffffffff, the whole voiceacting exploded. Forgive me

Anyway, has anyone yet touched the graphics of this thing?
Disch
User
Level: 9


Posts: 7/11
EXP: 2498
For next: 664

Since: 06-18-09


Since last post: 12.4 years
Last activity: 12.2 years

Posted on 07-04-09 02:17:17 AM (last edited by Disch at 07-04-09 11:18 AM) Link
may as well give a dshlib update too whynot:

- .zip saving appears to be working so far (did a few simple tests). So files in a .zip can now be read/written/whatever just as if they were normal files on the disk:




ZipArchive zip("myfile.zip",FileBase::FL_RW) // open the zip with read+write permissions

FilePtr file = zip.OpenFile( "test.txt", FileBase::FL_RW ) // open a file in the zip

file->Write( /* */ ) // write to it

// file is compressed and the .zip file is automatically updated when archive is closed



- made an abstract HashBase class for which you can do things like CRCs or other checksums hashes. Currently I just have CRC32 (needed it for .zip), but MD5 and whatnot could easily be applied to the same interface.

- in the process of doing all that I fixed a few bugs and stuff


Still some stuff I need to do to make the archive stuff totally done. Creating new files/folders and deleting files/folders can't be done yet, but that's really all that's left. (and that's really simple since it doesn't involve messing with the file at all -- just internal state changes).

Fun stuff!


EDIT --

Also I thought of a way to sort of automate the resampling process that doesn't interfere with the current library design. Rather than using DSPSound (which modifies the sound output), you can use DSPSoundSource (which modifies the source file: aka the .ogg or whathaveyou). I can combine a resampling option with the smart loader to give you a DSPSoundSource which resamples the real sound source to the appropriate samplerate

Basically it would look like so:




// old:
SoundPtr snd = new StreamedSound( SoundSource::Load( "file.ogg" ) )

// new:
SoundPtr snd = new StreamedSound( SoundSource::Load( "file.ogg", desired_sample_rate ) )



desired_sample_rate would be optional -- leaving it empty would result in no automatic resampling.

This has yet to be written though. I'll have to work on this after I finish up the last bits of archive stuff.

EDIT2:

Well that DSPSoundSource idea isn't as straightforward as I thought due to some conflicting types (SoundSource needs to output sample_t, DSP effects output mix_t). I could require DSP effects output either mix_t or sample_t, but that'd be a huge pain in the ass for writing them (and it already is kind of a pain).

I'll have to think about it more.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Next newer thread | Next older thread
Jul - NO! GO TO STAR! - Okay guys, I had an idea for a game New poll - New thread - Thread closed


Rusted Logic

Acmlmboard - commit 47be4dc [2021-08-23]
©2000-2022 Acmlm, Xkeeper, Kaito Sinclaire, et al.

32 database queries, 8 query cache hits.
Query execution time:  0.094228 seconds
Script execution time:  0.037807 seconds
Total render time:  0.132035 seconds


TidyHTML vomit below
line 1 column 1 - Warning: missing <!DOCTYPE> declaration
line 2 column 220 - Warning: unescaped & or unknown entity "&page"
line 119 column 11 - Warning: <form> isn't allowed in <table> elements
line 118 column 10 - Info: <table> previously mentioned
line 120 column 11 - Warning: missing <tr>
line 120 column 119 - Warning: missing </font> before </td>
line 124 column 16 - Warning: plain text isn't allowed in <tr> elements
line 120 column 11 - Info: <tr> previously mentioned
line 125 column 68 - Warning: missing </nobr> before </td>
line 141 column 68 - Warning: missing </nobr> before <tr>
line 147 column 35 - Warning: missing <tr>
line 147 column 50 - Warning: missing </font> before </td>
line 148 column 37 - Warning: unescaped & or unknown entity "&id"
line 147 column 199 - Warning: missing </font> before </table>
line 149 column 35 - Warning: missing <tr>
line 149 column 94 - Warning: unescaped & or unknown entity "&page"
line 149 column 126 - Warning: unescaped & or unknown entity "&page"
line 149 column 158 - Warning: unescaped & or unknown entity "&page"
line 149 column 190 - Warning: unescaped & or unknown entity "&page"
line 149 column 222 - Warning: unescaped & or unknown entity "&page"
line 149 column 254 - Warning: unescaped & or unknown entity "&page"
line 149 column 286 - Warning: unescaped & or unknown entity "&page"
line 149 column 318 - Warning: unescaped & or unknown entity "&page"
line 149 column 350 - Warning: unescaped & or unknown entity "&page"
line 149 column 382 - Warning: unescaped & or unknown entity "&page"
line 149 column 415 - Warning: unescaped & or unknown entity "&page"
line 149 column 449 - Warning: unescaped & or unknown entity "&page"
line 149 column 483 - Warning: unescaped & or unknown entity "&page"
line 149 column 520 - Warning: unescaped & or unknown entity "&page"
line 149 column 554 - Warning: unescaped & or unknown entity "&page"
line 149 column 588 - Warning: unescaped & or unknown entity "&page"
line 149 column 622 - Warning: unescaped & or unknown entity "&page"
line 149 column 656 - Warning: unescaped & or unknown entity "&page"
line 149 column 690 - Warning: unescaped & or unknown entity "&page"
line 149 column 50 - Warning: missing </font> before </td>
line 149 column 727 - Warning: missing </font> before </table>
line 156 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 158 column 9 - Warning: missing <tr>
line 176 column 13 - Warning: missing <tr>
line 246 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 248 column 9 - Warning: missing <tr>
line 266 column 13 - Warning: missing <tr>
line 269 column 74 - Warning: <style> isn't allowed in <td> elements
line 269 column 9 - Info: <td> previously mentioned
line 269 column 1369 - Warning: missing <tr>
line 271 column 1945 - Warning: missing <tr>
line 274 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 276 column 9 - Warning: missing <tr>
line 294 column 13 - Warning: missing <tr>
line 300 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 302 column 9 - Warning: missing <tr>
line 320 column 13 - Warning: missing <tr>
line 335 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 337 column 9 - Warning: missing <tr>
line 355 column 13 - Warning: missing <tr>
line 361 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 363 column 9 - Warning: missing <tr>
line 381 column 13 - Warning: missing <tr>
line 402 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 404 column 9 - Warning: missing <tr>
line 422 column 13 - Warning: missing <tr>
line 457 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 459 column 9 - Warning: missing <tr>
line 477 column 13 - Warning: missing <tr>
line 489 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 491 column 9 - Warning: missing <tr>
line 509 column 13 - Warning: missing <tr>
line 524 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 526 column 9 - Warning: missing <tr>
line 544 column 13 - Warning: missing <tr>
line 567 column 1278 - Warning: unescaped & or unknown entity "&dummy"
line 570 column 1348 - Warning: unescaped & or unknown entity "&ret"
line 579 column 1600 - Warning: unescaped & or unknown entity "&p"
line 594 column 1928 - Warning: unescaped & or unknown entity "&v"
line 602 column 2158 - Warning: unescaped & or unknown entity "&p"
line 625 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 627 column 9 - Warning: missing <tr>
line 645 column 13 - Warning: missing <tr>
line 648 column 74 - Warning: <style> isn't allowed in <td> elements
line 648 column 9 - Info: <td> previously mentioned
line 648 column 1369 - Warning: missing <tr>
line 648 column 1853 - Warning: missing <tr>
line 651 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 653 column 9 - Warning: missing <tr>
line 671 column 13 - Warning: missing <tr>
line 677 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 679 column 9 - Warning: missing <tr>
line 697 column 13 - Warning: missing <tr>
line 700 column 74 - Warning: <style> isn't allowed in <td> elements
line 700 column 9 - Info: <td> previously mentioned
line 700 column 1369 - Warning: missing <tr>
line 702 column 2027 - Warning: missing <tr>
line 705 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 707 column 9 - Warning: missing <tr>
line 725 column 13 - Warning: missing <tr>
line 735 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 737 column 9 - Warning: missing <tr>
line 755 column 13 - Warning: missing <tr>
line 758 column 74 - Warning: <style> isn't allowed in <td> elements
line 758 column 9 - Info: <td> previously mentioned
line 758 column 1369 - Warning: missing <tr>
line 760 column 1969 - Warning: missing <tr>
line 763 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 765 column 9 - Warning: missing <tr>
line 783 column 13 - Warning: missing <tr>
line 789 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 791 column 9 - Warning: missing <tr>
line 809 column 13 - Warning: missing <tr>
line 812 column 74 - Warning: <style> isn't allowed in <td> elements
line 812 column 9 - Info: <td> previously mentioned
line 812 column 1369 - Warning: missing <tr>
line 814 column 2017 - Warning: missing <tr>
line 817 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 819 column 9 - Warning: missing <tr>
line 837 column 13 - Warning: missing <tr>
line 845 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 847 column 9 - Warning: missing <tr>
line 865 column 13 - Warning: missing <tr>
line 868 column 74 - Warning: missing </div>
line 873 column 9 - Warning: <div> isn't allowed in <table> elements
line 152 column 17 - Info: <table> previously mentioned
line 875 column 9 - Warning: missing <tr>
line 893 column 13 - Warning: missing <tr>
line 945 column 17 - Warning: missing <tr>
line 945 column 17 - Warning: discarding unexpected <table>
line 948 column 35 - Warning: missing <tr>
line 948 column 94 - Warning: unescaped & or unknown entity "&page"
line 948 column 126 - Warning: unescaped & or unknown entity "&page"
line 948 column 158 - Warning: unescaped & or unknown entity "&page"
line 948 column 190 - Warning: unescaped & or unknown entity "&page"
line 948 column 222 - Warning: unescaped & or unknown entity "&page"
line 948 column 254 - Warning: unescaped & or unknown entity "&page"
line 948 column 286 - Warning: unescaped & or unknown entity "&page"
line 948 column 318 - Warning: unescaped & or unknown entity "&page"
line 948 column 350 - Warning: unescaped & or unknown entity "&page"
line 948 column 382 - Warning: unescaped & or unknown entity "&page"
line 948 column 415 - Warning: unescaped & or unknown entity "&page"
line 948 column 449 - Warning: unescaped & or unknown entity "&page"
line 948 column 483 - Warning: unescaped & or unknown entity "&page"
line 948 column 520 - Warning: unescaped & or unknown entity "&page"
line 948 column 554 - Warning: unescaped & or unknown entity "&page"
line 948 column 588 - Warning: unescaped & or unknown entity "&page"
line 948 column 622 - Warning: unescaped & or unknown entity "&page"
line 948 column 656 - Warning: unescaped & or unknown entity "&page"
line 948 column 690 - Warning: unescaped & or unknown entity "&page"
line 948 column 50 - Warning: missing </font> before </td>
line 948 column 727 - Warning: missing </font> before </table>
line 950 column 35 - Warning: missing <tr>
line 950 column 50 - Warning: missing </font> before </td>
line 951 column 37 - Warning: unescaped & or unknown entity "&id"
line 950 column 199 - Warning: missing </font> before </table>
line 952 column 17 - Warning: discarding unexpected </textarea>
line 952 column 28 - Warning: discarding unexpected </form>
line 952 column 35 - Warning: discarding unexpected </embed>
line 952 column 43 - Warning: discarding unexpected </noembed>
line 952 column 53 - Warning: discarding unexpected </noscript>
line 952 column 64 - Warning: discarding unexpected </noembed>
line 952 column 74 - Warning: discarding unexpected </embed>
line 952 column 82 - Warning: discarding unexpected </table>
line 952 column 90 - Warning: discarding unexpected </table>
line 954 column 9 - Warning: missing </font> before <table>
line 966 column 25 - Warning: discarding unexpected </font>
line 975 column 57 - Warning: discarding unexpected </font>
line 953 column 1 - Warning: missing </center>
line 120 column 63 - Warning: <img> lacks "alt" attribute
line 125 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 125 column 93 - Warning: <img> lacks "alt" attribute
line 141 column 19 - Warning: <td> attribute "width" has invalid value "120px"
line 141 column 98 - Warning: <img> lacks "alt" attribute
line 148 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 148 column 216 - Warning: <img> proprietary attribute value "absmiddle"
line 161 column 21 - Warning: <img> lacks "alt" attribute
line 161 column 62 - Warning: <img> lacks "alt" attribute
line 161 column 111 - Warning: <img> lacks "alt" attribute
line 161 column 161 - Warning: <img> lacks "alt" attribute
line 162 column 11 - Warning: <img> lacks "alt" attribute
line 172 column 15 - Warning: <img> lacks "alt" attribute
line 235 column 7073 - Warning: <img> proprietary attribute value "absmiddle"
line 235 column 7073 - Warning: <img> lacks "alt" attribute
line 251 column 23 - Warning: <img> lacks "alt" attribute
line 251 column 64 - Warning: <img> lacks "alt" attribute
line 251 column 113 - Warning: <img> lacks "alt" attribute
line 251 column 162 - Warning: <img> lacks "alt" attribute
line 262 column 15 - Warning: <img> lacks "alt" attribute
line 269 column 1458 - Warning: <td> attribute "valign" has invalid value "center"
line 269 column 1552 - Warning: <img> proprietary attribute value "absmiddle"
line 269 column 1552 - Warning: <img> lacks "alt" attribute
line 271 column 1777 - Warning: <img> lacks "alt" attribute
line 278 column 11 - Warning: <img> lacks "alt" attribute
line 279 column 23 - Warning: <img> lacks "alt" attribute
line 279 column 64 - Warning: <img> lacks "alt" attribute
line 279 column 113 - Warning: <img> lacks "alt" attribute
line 279 column 163 - Warning: <img> lacks "alt" attribute
line 290 column 15 - Warning: <img> lacks "alt" attribute
line 305 column 21 - Warning: <img> lacks "alt" attribute
line 305 column 62 - Warning: <img> lacks "alt" attribute
line 305 column 111 - Warning: <img> lacks "alt" attribute
line 305 column 161 - Warning: <img> lacks "alt" attribute
line 306 column 11 - Warning: <img> lacks "alt" attribute
line 316 column 15 - Warning: <img> lacks "alt" attribute
line 339 column 11 - Warning: <img> lacks "alt" attribute
line 340 column 23 - Warning: <img> lacks "alt" attribute
line 340 column 64 - Warning: <img> lacks "alt" attribute
line 340 column 113 - Warning: <img> lacks "alt" attribute
line 340 column 163 - Warning: <img> lacks "alt" attribute
line 351 column 15 - Warning: <img> lacks "alt" attribute
line 358 column 306 - Warning: <img> proprietary attribute value "absmiddle"
line 358 column 306 - Warning: <img> lacks "alt" attribute
line 366 column 21 - Warning: <img> lacks "alt" attribute
line 366 column 62 - Warning: <img> lacks "alt" attribute
line 366 column 111 - Warning: <img> lacks "alt" attribute
line 366 column 161 - Warning: <img> lacks "alt" attribute
line 367 column 11 - Warning: <img> lacks "alt" attribute
line 377 column 15 - Warning: <img> lacks "alt" attribute
line 407 column 22 - Warning: <img> lacks "alt" attribute
line 407 column 63 - Warning: <img> lacks "alt" attribute
line 407 column 112 - Warning: <img> lacks "alt" attribute
line 407 column 162 - Warning: <img> lacks "alt" attribute
line 418 column 15 - Warning: <img> lacks "alt" attribute
line 427 column 716 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 429 column 818 - Warning: <font> attribute "color" had invalid value "007F00" and has been replaced
line 430 column 903 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 430 column 945 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 430 column 993 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 431 column 1047 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 432 column 1107 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 433 column 1148 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 435 column 1209 - Warning: <font> attribute "color" had invalid value "007F00" and has been replaced
line 438 column 1300 - Warning: <font> attribute "color" had invalid value "007F00" and has been replaced
line 443 column 1458 - Warning: <font> attribute "color" had invalid value "007F00" and has been replaced
line 444 column 1531 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 445 column 1590 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 446 column 1649 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 448 column 1709 - Warning: <font> attribute "color" had invalid value "007F00" and has been replaced
line 449 column 1776 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 450 column 1853 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 452 column 1913 - Warning: <font> attribute "color" had invalid value "007F00" and has been replaced
line 453 column 1962 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 453 column 1996 - Warning: <font> attribute "color" had invalid value "0000FF" and has been replaced
line 462 column 21 - Warning: <img> lacks "alt" attribute
line 462 column 62 - Warning: <img> lacks "alt" attribute
line 462 column 111 - Warning: <img> lacks "alt" attribute
line 462 column 161 - Warning: <img> lacks "alt" attribute
line 463 column 11 - Warning: <img> lacks "alt" attribute
line 473 column 15 - Warning: <img> lacks "alt" attribute
line 494 column 22 - Warning: <img> lacks "alt" attribute
line 494 column 63 - Warning: <img> lacks "alt" attribute
line 494 column 112 - Warning: <img> lacks "alt" attribute
line 494 column 162 - Warning: <img> lacks "alt" attribute
line 505 column 15 - Warning: <img> lacks "alt" attribute
line 529 column 21 - Warning: <img> lacks "alt" attribute
line 529 column 62 - Warning: <img> lacks "alt" attribute
line 529 column 111 - Warning: <img> lacks "alt" attribute
line 529 column 161 - Warning: <img> lacks "alt" attribute
line 530 column 11 - Warning: <img> lacks "alt" attribute
line 540 column 15 - Warning: <img> lacks "alt" attribute
line 630 column 23 - Warning: <img> lacks "alt" attribute
line 630 column 64 - Warning: <img> lacks "alt" attribute
line 630 column 113 - Warning: <img> lacks "alt" attribute
line 630 column 162 - Warning: <img> lacks "alt" attribute
line 641 column 15 - Warning: <img> lacks "alt" attribute
line 648 column 1458 - Warning: <td> attribute "valign" has invalid value "center"
line 648 column 1685 - Warning: <img> lacks "alt" attribute
line 656 column 23 - Warning: <img> lacks "alt" attribute
line 656 column 64 - Warning: <img> lacks "alt" attribute
line 656 column 113 - Warning: <img> lacks "alt" attribute
line 656 column 163 - Warning: <img> lacks "alt" attribute
line 667 column 15 - Warning: <img> lacks "alt" attribute
line 674 column 74 - Warning: <table> attribute "bgcolor" had invalid value "FFFFFF" and has been replaced
line 674 column 540 - Warning: <img> lacks "alt" attribute
line 682 column 23 - Warning: <img> lacks "alt" attribute
line 682 column 64 - Warning: <img> lacks "alt" attribute
line 682 column 113 - Warning: <img> lacks "alt" attribute
line 682 column 162 - Warning: <img> lacks "alt" attribute
line 693 column 15 - Warning: <img> lacks "alt" attribute
line 700 column 1458 - Warning: <td> attribute "valign" has invalid value "center"
line 700 column 1613 - Warning: <img> proprietary attribute value "absmiddle"
line 700 column 1613 - Warning: <img> lacks "alt" attribute
line 702 column 1859 - Warning: <img> lacks "alt" attribute
line 710 column 23 - Warning: <img> lacks "alt" attribute
line 710 column 64 - Warning: <img> lacks "alt" attribute
line 710 column 113 - Warning: <img> lacks "alt" attribute
line 710 column 163 - Warning: <img> lacks "alt" attribute
line 721 column 15 - Warning: <img> lacks "alt" attribute
line 728 column 74 - Warning: <table> attribute "bgcolor" had invalid value "FFFFFF" and has been replaced
line 732 column 551 - Warning: <img> lacks "alt" attribute
line 740 column 23 - Warning: <img> lacks "alt" attribute
line 740 column 64 - Warning: <img> lacks "alt" attribute
line 740 column 113 - Warning: <img> lacks "alt" attribute
line 740 column 162 - Warning: <img> lacks "alt" attribute
line 751 column 15 - Warning: <img> lacks "alt" attribute
line 758 column 1458 - Warning: <td> attribute "valign" has invalid value "center"
line 760 column 1801 - Warning: <img> lacks "alt" attribute
line 767 column 11 - Warning: <img> lacks "alt" attribute
line 768 column 23 - Warning: <img> lacks "alt" attribute
line 768 column 64 - Warning: <img> lacks "alt" attribute
line 768 column 113 - Warning: <img> lacks "alt" attribute
line 768 column 163 - Warning: <img> lacks "alt" attribute
line 779 column 15 - Warning: <img> lacks "alt" attribute
line 794 column 23 - Warning: <img> lacks "alt" attribute
line 794 column 64 - Warning: <img> lacks "alt" attribute
line 794 column 113 - Warning: <img> lacks "alt" attribute
line 794 column 162 - Warning: <img> lacks "alt" attribute
line 805 column 15 - Warning: <img> lacks "alt" attribute
line 812 column 1458 - Warning: <td> attribute "valign" has invalid value "center"
line 814 column 1849 - Warning: <img> lacks "alt" attribute
line 821 column 21 - Warning: <img> lacks "alt" attribute
line 822 column 22 - Warning: <img> lacks "alt" attribute
line 822 column 63 - Warning: <img> lacks "alt" attribute
line 822 column 111 - Warning: <img> lacks "alt" attribute
line 822 column 161 - Warning: <img> lacks "alt" attribute
line 823 column 11 - Warning: <img> lacks "alt" attribute
line 833 column 15 - Warning: <img> lacks "alt" attribute
line 842 column 372 - Warning: <img> proprietary attribute value "absmiddle"
line 842 column 372 - Warning: <img> lacks "alt" attribute
line 850 column 23 - Warning: <img> lacks "alt" attribute
line 850 column 64 - Warning: <img> lacks "alt" attribute
line 850 column 113 - Warning: <img> lacks "alt" attribute
line 850 column 163 - Warning: <img> lacks "alt" attribute
line 851 column 11 - Warning: <img> lacks "alt" attribute
line 861 column 15 - Warning: <img> lacks "alt" attribute
line 868 column 236 - Warning: <img> proprietary attribute value "absmiddle"
line 868 column 236 - Warning: <img> lacks "alt" attribute
line 878 column 21 - Warning: <img> lacks "alt" attribute
line 878 column 62 - Warning: <img> lacks "alt" attribute
line 878 column 111 - Warning: <img> lacks "alt" attribute
line 878 column 161 - Warning: <img> lacks "alt" attribute
line 879 column 11 - Warning: <img> lacks "alt" attribute
line 889 column 15 - Warning: <img> lacks "alt" attribute
line 951 column 44 - Warning: <img> proprietary attribute value "absmiddle"
line 951 column 142 - Warning: <img> proprietary attribute value "absmiddle"
line 951 column 216 - Warning: <img> proprietary attribute value "absmiddle"
line 960 column 25 - Warning: <img> lacks "alt" attribute
line 965 column 267 - Warning: <img> lacks "alt" attribute
line 945 column 17 - Warning: trimming empty <tr>
line 125 column 68 - Warning: <nobr> is not approved by W3C
line 141 column 68 - Warning: <nobr> is not approved by W3C
line 177 column 27 - Warning: <nobr> is not approved by W3C
line 267 column 27 - Warning: <nobr> is not approved by W3C
line 269 column 1308 - Warning: <table> proprietary attribute "height"
line 269 column 1411 - Warning: <table> proprietary attribute "height"
line 271 column 1901 - Warning: <table> proprietary attribute "height"
line 295 column 27 - Warning: <nobr> is not approved by W3C
line 321 column 27 - Warning: <nobr> is not approved by W3C
line 356 column 27 - Warning: <nobr> is not approved by W3C
line 382 column 27 - Warning: <nobr> is not approved by W3C
line 423 column 27 - Warning: <nobr> is not approved by W3C
line 478 column 27 - Warning: <nobr> is not approved by W3C
line 510 column 27 - Warning: <nobr> is not approved by W3C
line 545 column 27 - Warning: <nobr> is not approved by W3C
line 646 column 27 - Warning: <nobr> is not approved by W3C
line 648 column 1308 - Warning: <table> proprietary attribute "height"
line 648 column 1411 - Warning: <table> proprietary attribute "height"
line 648 column 1809 - Warning: <table> proprietary attribute "height"
line 672 column 27 - Warning: <nobr> is not approved by W3C
line 674 column 74 - Warning: <table> proprietary attribute "height"
line 698 column 27 - Warning: <nobr> is not approved by W3C
line 700 column 1308 - Warning: <table> proprietary attribute "height"
line 700 column 1411 - Warning: <table> proprietary attribute "height"
line 702 column 1983 - Warning: <table> proprietary attribute "height"
line 726 column 27 - Warning: <nobr> is not approved by W3C
line 728 column 74 - Warning: <table> proprietary attribute "height"
line 756 column 27 - Warning: <nobr> is not approved by W3C
line 758 column 1308 - Warning: <table> proprietary attribute "height"
line 758 column 1411 - Warning: <table> proprietary attribute "height"
line 760 column 1925 - Warning: <table> proprietary attribute "height"
line 784 column 27 - Warning: <nobr> is not approved by W3C
line 810 column 27 - Warning: <nobr> is not approved by W3C
line 812 column 1308 - Warning: <table> proprietary attribute "height"
line 812 column 1411 - Warning: <table> proprietary attribute "height"
line 814 column 1973 - Warning: <table> proprietary attribute "height"
line 838 column 27 - Warning: <nobr> is not approved by W3C
line 866 column 27 - Warning: <nobr> is not approved by W3C
line 894 column 27 - Warning: <nobr> is not approved by W3C
Info: Document content looks like HTML5
Info: No system identifier in emitted doctype
Tidy found 367 warnings and 0 errors!


The alt attribute should be used to give a short description
of an image; longer descriptions should be given with the
longdesc attribute which takes a URL linked to the description.
These measures are needed for people using non-graphical browsers.

For further advice on how to make your pages accessible
see http://www.w3.org/WAI/GL.
You are recommended to use CSS to specify the font and
properties such as its size and color. This will reduce
the size of HTML files and make them easier to maintain
compared with using <FONT> elements.

You are recommended to use CSS to control line wrapping.
Use "white-space: nowrap" to inhibit wrapping in place
of inserting <NOBR>...</NOBR> into the markup.

About HTML Tidy: https://github.com/htacg/tidy-html5
Bug reports and comments: https://github.com/htacg/tidy-html5/issues
Official mailing list: https://lists.w3.org/Archives/Public/public-htacg/
Latest HTML specification: http://dev.w3.org/html5/spec-author-view/
Validate your HTML documents: http://validator.w3.org/nu/
Lobby your company to join the W3C: http://www.w3.org/Consortium

Do you speak a language other than English, or a different variant of
English? Consider helping us to localize HTML Tidy. For details please see
https://github.com/htacg/tidy-html5/blob/master/README/LOCALIZE.md