コード例 #1
0
	bool KFont::Load(std::istream& kfont_input)
	{
		if (kfont_input)
		{
			kfont_header header;
			kfont_input.read(reinterpret_cast<char*>(&header), sizeof(header));
			LittleEndianToNative<sizeof(header.fourcc)>(&header.fourcc);
			LittleEndianToNative<sizeof(header.version)>(&header.version);
			LittleEndianToNative<sizeof(header.start_ptr)>(&header.start_ptr);
			LittleEndianToNative<sizeof(header.validate_chars)>(&header.validate_chars);
			LittleEndianToNative<sizeof(header.non_empty_chars)>(&header.non_empty_chars);
			LittleEndianToNative<sizeof(header.char_size)>(&header.char_size);
			LittleEndianToNative<sizeof(header.base)>(&header.base);
			LittleEndianToNative<sizeof(header.scale)>(&header.scale);
			if ((MakeFourCC<'K', 'F', 'N', 'T'>::value == header.fourcc) && (KFONT_VERSION == header.version))
			{
				char_size_ = header.char_size;
				dist_base_ = header.base;
				dist_scale_ = header.scale;

				kfont_input.seekg(header.start_ptr, std::ios_base::beg);

				std::vector<std::pair<int32_t, int32_t> > temp_char_index(header.non_empty_chars);
				kfont_input.read(reinterpret_cast<char*>(&temp_char_index[0]), static_cast<std::streamsize>(temp_char_index.size() * sizeof(temp_char_index[0])));
				std::vector<std::pair<int32_t, uint32_t> > temp_char_advance(header.validate_chars);
				kfont_input.read(reinterpret_cast<char*>(&temp_char_advance[0]), static_cast<std::streamsize>(temp_char_advance.size() * sizeof(temp_char_advance[0])));

				typedef KLAYGE_DECLTYPE(temp_char_index) TCIType;
				KLAYGE_FOREACH(TCIType::reference ci, temp_char_index)
				{
					LittleEndianToNative<sizeof(ci.first)>(&ci.first);
					LittleEndianToNative<sizeof(ci.second)>(&ci.second);

					char_index_advance_.insert(std::make_pair(ci.first, std::make_pair(ci.second, 0)));
				}
				typedef KLAYGE_DECLTYPE(temp_char_advance) TCAType;
				KLAYGE_FOREACH(TCAType::reference ca, temp_char_advance)
				{
					LittleEndianToNative<sizeof(ca.first)>(&ca.first);
					LittleEndianToNative<sizeof(ca.second)>(&ca.second);

					KLAYGE_AUTO(iter, char_index_advance_.find(ca.first));
					if (iter != char_index_advance_.end())
					{
						iter->second.second = ca.second;
					}
					else
					{
						char_index_advance_[ca.first] = std::make_pair(-1, ca.second);
					}
				}
コード例 #2
0
ファイル: kfont.cpp プロジェクト: ImNaohaing/KlayGE
	bool KFont::Load(ResIdentifierPtr const & kfont_input)
	{
		if (kfont_input)
		{
			kfont_input_ = kfont_input;

			kfont_header header;
			kfont_input->read(&header, sizeof(header));
			header.fourcc = LE2Native(header.fourcc);
			header.version = LE2Native(header.version);
			header.start_ptr = LE2Native(header.start_ptr);
			header.validate_chars = LE2Native(header.validate_chars);
			header.non_empty_chars = LE2Native(header.non_empty_chars);
			header.char_size = LE2Native(header.char_size);
			header.base = LE2Native(header.base);
			header.scale = LE2Native(header.scale);
			if ((MakeFourCC<'K', 'F', 'N', 'T'>::value == header.fourcc) && (KFONT_VERSION == header.version))
			{
				char_size_ = header.char_size;
				dist_base_ = header.base;
				dist_scale_ = header.scale;

				kfont_input->seekg(header.start_ptr, std::ios_base::beg);

				std::vector<std::pair<int32_t, int32_t>> temp_char_index(header.non_empty_chars);
				kfont_input->read(&temp_char_index[0], temp_char_index.size() * sizeof(temp_char_index[0]));
				std::vector<std::pair<int32_t, uint32_t>> temp_char_advance(header.validate_chars);
				kfont_input->read(&temp_char_advance[0], temp_char_advance.size() * sizeof(temp_char_advance[0]));

				for (auto& ci : temp_char_index)
				{
					ci.first = LE2Native(ci.first);
					ci.second = LE2Native(ci.second);

					KLAYGE_EMPLACE(char_index_advance_, ci.first, std::make_pair(ci.second, 0));
				}
				for (auto& ca : temp_char_advance)
				{
					ca.first = LE2Native(ca.first);
					ca.second = LE2Native(ca.second);

					auto iter = char_index_advance_.find(ca.first);
					if (iter != char_index_advance_.end())
					{
						iter->second.second = ca.second;
					}
					else
					{
						char_index_advance_[ca.first] = std::make_pair(-1, ca.second);
					}
				}

				char_info_.resize(header.non_empty_chars);
				kfont_input->read(&char_info_[0], char_info_.size() * sizeof(char_info_[0]));

				for (auto& ci : char_info_)
				{
					ci.left = LE2Native(ci.left);
					ci.top = LE2Native(ci.top);
					ci.width = LE2Native(ci.width);
					ci.height = LE2Native(ci.height);
				}

				distances_addr_.resize(header.non_empty_chars + 1);
				distances_lzma_start_ = kfont_input->tellg();
				size_t distances_lzma_size = 0;

				for (uint32_t i = 0; i < header.non_empty_chars; ++ i)
				{
					distances_addr_[i] = distances_lzma_size;

					uint64_t len;
					kfont_input->read(&len, sizeof(len));
					len = LE2Native(len);
					distances_lzma_size += static_cast<size_t>(len);

					kfont_input->seekg(len, std::ios_base::cur);
				}

				distances_addr_[header.non_empty_chars] = distances_lzma_size;

				return true;
			}
		}

		return false;
	}