diff --git a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp index d8c3c38ba..17e64255e 100644 --- a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp +++ b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp @@ -123,6 +123,13 @@ void BookReader::addControl(FBTextKind kind, bool start) { } } +void BookReader::addStyleEntry(const ZLTextStyleEntry &entry, const std::vector &fontFamilies) { + if (paragraphIsOpen()) { + flushTextBufferToParagraph(); + myCurrentTextModel->addStyleEntry(entry, fontFamilies); + } +} + void BookReader::addStyleEntry(const ZLTextStyleEntry &entry) { if (paragraphIsOpen()) { flushTextBufferToParagraph(); diff --git a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.h b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.h index d545924ed..8478a4439 100644 --- a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.h +++ b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.h @@ -61,6 +61,7 @@ public: bool paragraphIsOpen() const; void addControl(FBTextKind kind, bool start); void addStyleEntry(const ZLTextStyleEntry &entry); + void addStyleEntry(const ZLTextStyleEntry &entry, const std::vector &fontFamilies); void addStyleCloseEntry(); void addHyperlinkControl(FBTextKind kind, const std::string &label); void addHyperlinkLabel(const std::string &label); diff --git a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp index ac2f968c9..cf5ad1a1a 100644 --- a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp +++ b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp @@ -194,11 +194,7 @@ shared_ptr StyleSheetTable::createControl(const AttributeMap & const std::string &fontFamily = value(styles, "font-family"); if (!fontFamily.empty()) { - std::vector families = StyleSheetUtil::splitCommaSeparatedList(fontFamily); - // TODO: use all families - if (!families.empty()) { - entry->setFontFamily(families[0]); - } + entry->setFontFamilies(StyleSheetUtil::splitCommaSeparatedList(fontFamily)); } const std::string &fontSize = value(styles, "font-size"); diff --git a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetUtil.cpp b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetUtil.cpp index 12f0e4896..0a0ba0096 100644 --- a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetUtil.cpp +++ b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetUtil.cpp @@ -64,6 +64,9 @@ std::vector StyleSheetUtil::splitCommaSeparatedList(const std::stri break; } } + if (data.size() > start) { + split.push_back(strip(data.substr(start))); + } return split; } diff --git a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp index 79c6bfe26..e6e5a0465 100644 --- a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp +++ b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp @@ -671,17 +671,40 @@ bool XHTMLReader::addTextStyleEntry(const std::string tag, const std::string aCl } void XHTMLReader::addTextStyleEntry(const ZLTextStyleEntry &entry) { - if (entry.isFeatureSupported(ZLTextStyleEntry::FONT_FAMILY)) { - ZLLogger::Instance().println("FONT", "Requested font family: " + entry.fontFamily()); - shared_ptr fontEntry = myFontMap->get(entry.fontFamily()); - if (fontEntry.isNull()) { - ZLLogger::Instance().println("FONT", "Font entry not found for " + entry.fontFamily()); - } else { - const std::string realFamily = myFinalFontMap.put(entry.fontFamily(), fontEntry); - ZLLogger::Instance().println("FONT", "Entry for " + entry.fontFamily() + " stored as " + realFamily); + if (!entry.isFeatureSupported(ZLTextStyleEntry::FONT_FAMILY)) { + myModelReader.addStyleEntry(entry); + } + + bool doFixFamiliesList = false; + + const std::vector &families = entry.fontFamilies(); + for (std::vector::const_iterator it = families.begin(); it != families.end(); ++it) { + ZLLogger::Instance().println("FONT", "Requested font family: " + *it); + shared_ptr fontEntry = myFontMap->get(*it); + if (!fontEntry.isNull()) { + const std::string realFamily = myFinalFontMap.put(*it, fontEntry); + if (realFamily != *it) { + ZLLogger::Instance().println("FONT", "Entry for " + *it + " stored as " + realFamily); + doFixFamiliesList = true; + break; + } } } - myModelReader.addStyleEntry(entry); + + if (!doFixFamiliesList) { + myModelReader.addStyleEntry(entry); + } else { + std::vector realFamilies; + for (std::vector::const_iterator it = families.begin(); it != families.end(); ++it) { + shared_ptr fontEntry = myFontMap->get(*it); + if (!fontEntry.isNull()) { + realFamilies.push_back(myFinalFontMap.put(*it, fontEntry)); + } else { + realFamilies.push_back(*it); + } + } + myModelReader.addStyleEntry(entry, realFamilies); + } } void XHTMLReader::startElementHandler(const char *tag, const char **attributes) { diff --git a/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.cpp b/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.cpp index 097278ecd..1124a681f 100644 --- a/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.cpp +++ b/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.cpp @@ -237,6 +237,10 @@ void ZLTextModel::addControl(ZLTextKind textKind, bool isStart) { //static int EntryLen = 0; void ZLTextModel::addStyleEntry(const ZLTextStyleEntry &entry) { + addStyleEntry(entry, entry.fontFamilies()); +} + +void ZLTextModel::addStyleEntry(const ZLTextStyleEntry &entry, const std::vector &fontFamilies) { // +++ calculating entry size std::size_t len = 4; // entry type + feature mask for (int i = 0; i < ZLTextStyleEntry::NUMBER_OF_LENGTHS; ++i) { @@ -247,10 +251,10 @@ void ZLTextModel::addStyleEntry(const ZLTextStyleEntry &entry) { if (entry.isFeatureSupported(ZLTextStyleEntry::ALIGNMENT_TYPE)) { len += 2; } - ZLUnicodeUtil::Ucs2String fontFamily; + ZLUnicodeUtil::Ucs2String fontFamilyUcs2; if (entry.isFeatureSupported(ZLTextStyleEntry::FONT_FAMILY)) { - ZLUnicodeUtil::utf8ToUcs2(fontFamily, entry.fontFamily()); - len += 2 + fontFamily.size() * 2; + ZLUnicodeUtil::utf8ToUcs2(fontFamilyUcs2, fontFamilies[0]); + len += 2 + fontFamilyUcs2.size() * 2; } if (entry.isFeatureSupported(ZLTextStyleEntry::FONT_STYLE_MODIFIER)) { len += 2; @@ -288,7 +292,7 @@ void ZLTextModel::addStyleEntry(const ZLTextStyleEntry &entry) { *address++ = 0; } if (entry.isFeatureSupported(ZLTextStyleEntry::FONT_FAMILY)) { - address = ZLCachedMemoryAllocator::writeString(address, fontFamily); + address = ZLCachedMemoryAllocator::writeString(address, fontFamilyUcs2); } if (entry.isFeatureSupported(ZLTextStyleEntry::FONT_STYLE_MODIFIER)) { *address++ = entry.mySupportedFontModifier; diff --git a/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.h b/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.h index fa828b976..f3eb05283 100644 --- a/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.h +++ b/jni/NativeFormats/zlibrary/text/src/model/ZLTextModel.h @@ -67,6 +67,7 @@ public: */ void addControl(ZLTextKind textKind, bool isStart); void addStyleEntry(const ZLTextStyleEntry &entry); + void addStyleEntry(const ZLTextStyleEntry &entry, const std::vector &fontFamilies); void addStyleCloseEntry(); void addHyperlinkControl(ZLTextKind textKind, ZLHyperlinkType hyperlinkType, const std::string &label); void addText(const std::string &text); diff --git a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h index 37f8c8f67..9b1a0f69d 100644 --- a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h +++ b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h @@ -21,6 +21,7 @@ #define __ZLTEXTSTYLEENTRY_H__ #include +#include #include #include @@ -95,8 +96,8 @@ public: ZLBoolean3 fontModifier(FontModifier modifier) const; void setFontModifier(FontModifier modifier, bool on); - const std::string &fontFamily() const; - void setFontFamily(const std::string &fontFamily); + const std::vector &fontFamilies() const; + void setFontFamilies(const std::vector &fontFamilies); private: const unsigned char myEntryKind; @@ -106,7 +107,7 @@ private: ZLTextAlignmentType myAlignmentType; unsigned char mySupportedFontModifier; unsigned char myFontModifier; - std::string myFontFamily; + std::vector myFontFamilies; friend class ZLTextModel; }; @@ -151,10 +152,12 @@ inline void ZLTextStyleEntry::setFontModifier(FontModifier modifier, bool on) { } } -inline const std::string &ZLTextStyleEntry::fontFamily() const { return myFontFamily; } -inline void ZLTextStyleEntry::setFontFamily(const std::string &fontFamily) { - myFeatureMask |= 1 << FONT_FAMILY; - myFontFamily = fontFamily; +inline const std::vector &ZLTextStyleEntry::fontFamilies() const { return myFontFamilies; } +inline void ZLTextStyleEntry::setFontFamilies(const std::vector &fontFamilies) { + if (!fontFamilies.empty()) { + myFeatureMask |= 1 << FONT_FAMILY; + myFontFamilies = fontFamilies; + } } #endif /* __ZLTEXTSTYLEENTRY_H__ */