bool WrittenFontCFF::HasEnoughSpaceForGlyphs(const GlyphUnicodeMappingListList& inGlyphsList) { GlyphUnicodeMappingListList::const_iterator itList = inGlyphsList.begin(); GlyphUnicodeMappingList::const_iterator it; int glyphsToAddCount = 0; for(; itList != inGlyphsList.end(); ++itList) { it = itList->begin(); for(; it != itList->end(); ++it) if(mANSIRepresentation->mGlyphIDToEncodedChar.find(it->mGlyphCode) == mANSIRepresentation->mGlyphIDToEncodedChar.end()) ++glyphsToAddCount; } return glyphsToAddCount <= mAvailablePositionsCount; }
bool WrittenFontCFF::AddToANSIRepresentation( const GlyphUnicodeMappingListList& inGlyphsList, UShortListList& outEncodedCharacters) { // categorically do not allow an ANSI representation if the font is CID if(!mIsCID && HasEnoughSpaceForGlyphs(inGlyphsList)) { GlyphUnicodeMappingListList::const_iterator itList = inGlyphsList.begin(); GlyphUnicodeMappingList::const_iterator it; UShortList encodedCharacters; for(; itList != inGlyphsList.end(); ++itList) { it = itList->begin(); for(; it != itList->end(); ++it) encodedCharacters.push_back(EncodeGlyph(it->mGlyphCode,it->mUnicodeValues)); outEncodedCharacters.push_back(encodedCharacters); encodedCharacters.clear(); } return true; } else return false; }
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; }