bool WrittenFontTrueType::AddToANSIRepresentation( const GlyphUnicodeMappingListList& inGlyphsList, UShortListList& outEncodedCharacters) { UShortListList candidatesList; UShortList candidates; BoolAndByte encodingResult(true,0); WinAnsiEncoding winAnsiEncoding; GlyphUnicodeMappingListList::const_iterator itList = inGlyphsList.begin(); GlyphUnicodeMappingList::const_iterator it; for(; itList != inGlyphsList.end() && encodingResult.first; ++itList) { it = itList->begin(); for(; it != itList->end() && encodingResult.first; ++it) { // don't bother with characters of more or less than one unicode if(it->mUnicodeValues.size() != 1) { encodingResult.first = false; } else if(0x2022 == it->mUnicodeValues.front()) { // From the reference: // In WinAnsiEncoding, all unused codes greater than 40 map to the bullet character. // However, only code 225 is specifically assigned to the bullet character; other codes are subject to future reassignment. // now i don't know if it's related or not...but acrobat isn't happy when i'm using winansi with bullet. and text coming after that bullet may be // corrupted. // so i'm forcing CID if i hit bullet till i know better. encodingResult.first = false; } else { encodingResult = winAnsiEncoding.Encode(it->mUnicodeValues.front()); if(encodingResult.first) candidates.push_back(encodingResult.second); } } if(encodingResult.first) { candidatesList.push_back(candidates); candidates.clear(); } } if(encodingResult.first) { // for the first time, add also 0,0 mapping if(mANSIRepresentation->mGlyphIDToEncodedChar.size() == 0) mANSIRepresentation->mGlyphIDToEncodedChar.insert(UIntToGlyphEncodingInfoMap::value_type(0,GlyphEncodingInfo(0,0))); GlyphUnicodeMappingListList::const_iterator itGlyphsList = inGlyphsList.begin(); UShortListList::iterator itEncodedList = candidatesList.begin(); GlyphUnicodeMappingList::const_iterator itGlyphs; UShortList::iterator itEncoded; for(; itGlyphsList != inGlyphsList.end(); ++ itGlyphsList,++itEncodedList) { itGlyphs = itGlyphsList->begin(); itEncoded = itEncodedList->begin(); for(; itGlyphs != itGlyphsList->end(); ++ itGlyphs,++itEncoded) { if(mANSIRepresentation->mGlyphIDToEncodedChar.find(itGlyphs->mGlyphCode) == mANSIRepresentation->mGlyphIDToEncodedChar.end()) mANSIRepresentation->mGlyphIDToEncodedChar.insert( UIntToGlyphEncodingInfoMap::value_type(itGlyphs->mGlyphCode,GlyphEncodingInfo(*itEncoded,itGlyphs->mUnicodeValues))); } } outEncodedCharacters = candidatesList; } return encodingResult.first; }
bool WrittenFontTrueType::AddToANSIRepresentation( const GlyphUnicodeMappingListList& inGlyphsList, UShortListList& outEncodedCharacters) { UShortListList candidatesList; UShortList candidates; BoolAndByte encodingResult(true,0); WinAnsiEncoding winAnsiEncoding; GlyphUnicodeMappingListList::const_iterator itList = inGlyphsList.begin(); GlyphUnicodeMappingList::const_iterator it; for(; itList != inGlyphsList.end() && encodingResult.first; ++itList) { it = itList->begin(); for(; it != itList->end() && encodingResult.first; ++it) { // don't bother with characters of more or less than one unicode if(it->mUnicodeValues.size() != 1) { encodingResult.first = false; } else { encodingResult = winAnsiEncoding.Encode(it->mUnicodeValues.front()); if(encodingResult.first) candidates.push_back(encodingResult.second); } } if(encodingResult.first) { candidatesList.push_back(candidates); candidates.clear(); } } if(encodingResult.first) { // for the first time, add also 0,0 mapping if(mANSIRepresentation->mGlyphIDToEncodedChar.size() == 0) mANSIRepresentation->mGlyphIDToEncodedChar.insert(UIntToGlyphEncodingInfoMap::value_type(0,GlyphEncodingInfo(0,0))); GlyphUnicodeMappingListList::const_iterator itGlyphsList = inGlyphsList.begin(); UShortListList::iterator itEncodedList = candidatesList.begin(); GlyphUnicodeMappingList::const_iterator itGlyphs; UShortList::iterator itEncoded; for(; itGlyphsList != inGlyphsList.end(); ++ itGlyphsList,++itEncodedList) { itGlyphs = itGlyphsList->begin(); itEncoded = itEncodedList->begin(); for(; itGlyphs != itGlyphsList->end(); ++ itGlyphs,++itEncoded) { if(mANSIRepresentation->mGlyphIDToEncodedChar.find(itGlyphs->mGlyphCode) == mANSIRepresentation->mGlyphIDToEncodedChar.end()) mANSIRepresentation->mGlyphIDToEncodedChar.insert( UIntToGlyphEncodingInfoMap::value_type(itGlyphs->mGlyphCode,GlyphEncodingInfo(*itEncoded,itGlyphs->mUnicodeValues))); } } outEncodedCharacters = candidatesList; } return encodingResult.first; }