| 744 | } |
| 745 | |
| 746 | bool GFont::write(Stream& stream) |
| 747 | { |
| 748 | // Handle versioning |
| 749 | stream.write(csm_fileVersion); |
| 750 | |
| 751 | // Write font info |
| 752 | stream.write(mFaceName); |
| 753 | stream.write(mSize); |
| 754 | stream.write(mCharSet); |
| 755 | |
| 756 | stream.write(mHeight); |
| 757 | stream.write(mBaseline); |
| 758 | stream.write(mAscent); |
| 759 | stream.write(mDescent); |
| 760 | |
| 761 | // Write char info list |
| 762 | stream.write(U32(mCharInfoList.size())); |
| 763 | U32 i; |
| 764 | for(i = 0; i < mCharInfoList.size(); i++) |
| 765 | { |
| 766 | const PlatformFont::CharInfo *ci = &mCharInfoList[i]; |
| 767 | stream.write(ci->bitmapIndex); |
| 768 | stream.write(ci->xOffset); |
| 769 | stream.write(ci->yOffset); |
| 770 | stream.write(ci->width); |
| 771 | stream.write(ci->height); |
| 772 | stream.write(ci->xOrigin); |
| 773 | stream.write(ci->yOrigin); |
| 774 | stream.write(ci->xIncrement); |
| 775 | } |
| 776 | |
| 777 | stream.write(mTextureSheets.size()); |
| 778 | for(i = 0; i < mTextureSheets.size(); i++) |
| 779 | mTextureSheets[i].getBitmap()->writeBitmap("png", stream); |
| 780 | |
| 781 | stream.write(mCurX); |
| 782 | stream.write(mCurY); |
| 783 | stream.write(mCurSheet); |
| 784 | |
| 785 | // Get the min/max we have values for, and only write that range out. |
| 786 | S32 minGlyph = S32_MAX, maxGlyph = 0; |
| 787 | |
| 788 | for(i = 0; i < 65536; i++) |
| 789 | { |
| 790 | if(mRemapTable[i] != -1) |
| 791 | { |
| 792 | if(i>maxGlyph) maxGlyph = i; |
| 793 | if(i<minGlyph) minGlyph = i; |
| 794 | } |
| 795 | } |
| 796 | |
| 797 | stream.write(minGlyph); |
| 798 | stream.write(maxGlyph); |
| 799 | |
| 800 | // Skip it if we don't have any glyphs to do... |
| 801 | if(maxGlyph >= minGlyph) |
| 802 | { |
| 803 | // Put everything big endian, to be consistent. Do this inplace. |