diff --git a/jni/NativeFormats/JavaNativeFormatPlugin.cpp b/jni/NativeFormats/JavaNativeFormatPlugin.cpp index 7745b4fae..2ffa6acdc 100644 --- a/jni/NativeFormats/JavaNativeFormatPlugin.cpp +++ b/jni/NativeFormats/JavaNativeFormatPlugin.cpp @@ -313,7 +313,6 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin env->DeleteLocalRef(javaFootnoteModel); } - // TODO: synchronize FontManager const std::vector > familyLists = model->fontManager().familyLists(); for (std::vector >::const_iterator it = familyLists.begin(); it != familyLists.end(); ++it) { const std::vector &lst = *it; @@ -327,6 +326,28 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin env->DeleteLocalRef(jList); } + const std::map > entries = model->fontManager().entries(); + for (std::map >::const_iterator it = entries.begin(); it != entries.end(); ++it) { + if (it->second.isNull()) { + continue; + } + jstring family = AndroidUtil::createJavaString(env, it->first); + jstring normal = AndroidUtil::createJavaString(env, it->second->Normal); + jstring bold = AndroidUtil::createJavaString(env, it->second->Bold); + jstring italic = AndroidUtil::createJavaString(env, it->second->Italic); + jstring boldItalic = AndroidUtil::createJavaString(env, it->second->BoldItalic); + + AndroidUtil::Method_NativeBookModel_registerFontEntry->call( + javaModel, family, normal, bold, italic, boldItalic + ); + + if (boldItalic != 0) env->DeleteLocalRef(boldItalic); + if (italic != 0) env->DeleteLocalRef(italic); + if (bold != 0) env->DeleteLocalRef(bold); + if (normal != 0) env->DeleteLocalRef(normal); + env->DeleteLocalRef(family); + } + return 0; } diff --git a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetParser.cpp b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetParser.cpp index 3742cb02c..74df25d95 100644 --- a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetParser.cpp +++ b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetParser.cpp @@ -280,7 +280,7 @@ static std::string value(const StyleSheetTable::AttributeMap &map, const std::st } void StyleSheetMultiStyleParser::processAtRule(const std::string &name, const StyleSheetTable::AttributeMap &attributes) { - ZLLogger::Instance().registerClass("FONT"); + //ZLLogger::Instance().registerClass("FONT"); if (name == "@font-face") { std::string family = value(attributes, "font-family"); if (family.empty()) { diff --git a/jni/NativeFormats/util/AndroidUtil.cpp b/jni/NativeFormats/util/AndroidUtil.cpp index 71614c3d9..9c5a0f3a2 100644 --- a/jni/NativeFormats/util/AndroidUtil.cpp +++ b/jni/NativeFormats/util/AndroidUtil.cpp @@ -124,6 +124,7 @@ shared_ptr AndroidUtil::Method_NativeBookModel_setBookTextModel; shared_ptr AndroidUtil::Method_NativeBookModel_setFootnoteModel; shared_ptr AndroidUtil::Method_NativeBookModel_addImage; shared_ptr AndroidUtil::Method_NativeBookModel_registerFontFamilyList; +shared_ptr AndroidUtil::Method_NativeBookModel_registerFontEntry; //shared_ptr AndroidUtil::StaticMethod_BookReadingException_throwForFile; @@ -206,6 +207,7 @@ bool AndroidUtil::init(JavaVM* jvm) { Method_NativeBookModel_setFootnoteModel = new VoidMethod(Class_NativeBookModel, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); Method_NativeBookModel_addImage = new VoidMethod(Class_NativeBookModel, "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)"); Method_NativeBookModel_registerFontFamilyList = new VoidMethod(Class_NativeBookModel, "registerFontFamilyList", "([Ljava/lang/String;)"); + Method_NativeBookModel_registerFontEntry = new VoidMethod(Class_NativeBookModel, "registerFontEntry", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)"); /* Class_BookReadingException = new JavaClass(env, "org/geometerplus/fbreader/bookmodel/BookReadingException"); @@ -286,6 +288,10 @@ std::string AndroidUtil::fromJavaString(JNIEnv *env, jstring from) { return result; } +jstring AndroidUtil::createJavaString(JNIEnv* env, shared_ptr str) { + return str.isNull() ? 0 : createJavaString(env, *str); +} + jstring AndroidUtil::createJavaString(JNIEnv* env, const std::string &str) { if (str.empty()) { return 0; diff --git a/jni/NativeFormats/util/AndroidUtil.h b/jni/NativeFormats/util/AndroidUtil.h index 0a55ec358..4b4e306b2 100644 --- a/jni/NativeFormats/util/AndroidUtil.h +++ b/jni/NativeFormats/util/AndroidUtil.h @@ -146,6 +146,7 @@ public: static shared_ptr Method_NativeBookModel_setFootnoteModel; static shared_ptr Method_NativeBookModel_addImage; static shared_ptr Method_NativeBookModel_registerFontFamilyList; + static shared_ptr Method_NativeBookModel_registerFontEntry; //static shared_ptr StaticMethod_BookReadingException_throwForFile; @@ -154,6 +155,7 @@ public: static JNIEnv *getEnv(); static std::string fromJavaString(JNIEnv *env, jstring from); + static jstring createJavaString(JNIEnv* env, shared_ptr); static jstring createJavaString(JNIEnv* env, const std::string &str); static std::string convertNonUtfString(const std::string &str); diff --git a/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.cpp b/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.cpp index 688913727..05451742e 100644 --- a/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.cpp +++ b/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.cpp @@ -22,13 +22,13 @@ #include "FontManager.h" std::string FontManager::put(const std::string &family, shared_ptr entry) { - shared_ptr existing = myMap[family]; + shared_ptr existing = myEntries[family]; if (existing.isNull() || *existing == *entry) { - myMap[family] = entry; + myEntries[family] = entry; return family; } - for (std::map >::const_iterator it = myMap.begin(); it != myMap.end(); ++it) { + for (std::map >::const_iterator it = myEntries.begin(); it != myEntries.end(); ++it) { if (*it->second == *entry) { return it->first; } @@ -37,8 +37,8 @@ std::string FontManager::put(const std::string &family, shared_ptr en for (int i = 1; i < 1000; ++i) { std::string indexed = family + "#"; ZLStringUtil::appendNumber(indexed, i); - if (myMap[indexed].isNull()) { - myMap[indexed] = entry; + if (myEntries[indexed].isNull()) { + myEntries[indexed] = entry; return indexed; } } @@ -57,6 +57,10 @@ int FontManager::familyListIndex(const std::vector &familyList) { } } +const std::map > &FontManager::entries() const { + return myEntries; +} + const std::vector > &FontManager::familyLists() const { return myFamilyLists; } diff --git a/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.h b/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.h index 105c14fd5..5d7c24168 100644 --- a/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.h +++ b/jni/NativeFormats/zlibrary/text/src/fonts/FontManager.h @@ -33,10 +33,12 @@ class FontManager { public: std::string put(const std::string &family, shared_ptr entry); int familyListIndex(const std::vector &familyList); + + const std::map > &entries() const; const std::vector > &familyLists() const; private: - std::map > myMap; + std::map > myEntries; std::vector > myFamilyLists; }; diff --git a/src/org/geometerplus/fbreader/bookmodel/BookModel.java b/src/org/geometerplus/fbreader/bookmodel/BookModel.java index d1c0de705..9ff473a36 100644 --- a/src/org/geometerplus/fbreader/bookmodel/BookModel.java +++ b/src/org/geometerplus/fbreader/bookmodel/BookModel.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.List; import org.geometerplus.zlibrary.text.model.*; +import org.geometerplus.zlibrary.text.fonts.FontEntry; import org.geometerplus.zlibrary.text.fonts.FontManager; import org.geometerplus.fbreader.book.Book; @@ -100,4 +101,12 @@ public abstract class BookModel { public void registerFontFamilyList(String[] families) { FontManager.index(Arrays.asList(families)); } + + public void registerFontEntry(String family, FontEntry entry) { + FontManager.Entries.put(family, entry); + } + + public void registerFontEntry(String family, String normal, String bold, String italic, String boldItalic) { + registerFontEntry(family, new FontEntry(normal, bold, italic, boldItalic)); + } } diff --git a/src/org/geometerplus/zlibrary/text/fonts/FontEntry.java b/src/org/geometerplus/zlibrary/text/fonts/FontEntry.java new file mode 100644 index 000000000..cbe4c9400 --- /dev/null +++ b/src/org/geometerplus/zlibrary/text/fonts/FontEntry.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2007-2014 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.zlibrary.text.fonts; + +public class FontEntry { + public final String Normal; + public final String Bold; + public final String Italic; + public final String BoldItalic; + + public FontEntry(String normal, String bold, String italic, String boldItalic) { + Normal = normal; + Bold = bold; + Italic = italic; + BoldItalic = boldItalic; + } + + @Override + public String toString() { + return "FontEntry[" + Normal + ";" + Bold + ";" + Italic + ";" + BoldItalic + "]"; + } +} diff --git a/src/org/geometerplus/zlibrary/text/fonts/FontManager.java b/src/org/geometerplus/zlibrary/text/fonts/FontManager.java index f331f32a3..d5495e814 100644 --- a/src/org/geometerplus/zlibrary/text/fonts/FontManager.java +++ b/src/org/geometerplus/zlibrary/text/fonts/FontManager.java @@ -23,6 +23,8 @@ import java.util.*; public class FontManager { private final ArrayList> myFamilyLists = new ArrayList>(); + public final Map Entries = + Collections.synchronizedMap(new HashMap()); public synchronized int index(List families) { for (int i = 0; i < myFamilyLists.size(); ++i) { @@ -35,6 +37,7 @@ public class FontManager { } public synchronized List getFamilyList(int index) { - return index < myFamilyLists.size() ? myFamilyLists.get(index) : Collections.emptyList(); + return index < myFamilyLists.size() + ? myFamilyLists.get(index) : Collections.emptyList(); } } diff --git a/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java b/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java index 43ef1292d..7b4dc2f56 100644 --- a/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java +++ b/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java @@ -147,6 +147,10 @@ public abstract class ZLTextStyleEntry { return myFontFamilies; } + public final FontManager getFontManager() { + return myFontManager; + } + final void setFontModifiers(byte supported, byte values) { myFeatureMask |= 1 << Feature.FONT_STYLE_MODIFIER; mySupportedFontModifiers = supported; diff --git a/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java b/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java index 364bf796f..2a2c34027 100644 --- a/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java @@ -35,8 +35,9 @@ public class ZLTextExplicitlyDecoratedStyle extends ZLTextDecoratedStyle impleme @Override protected String getFontFamilyInternal() { if (myEntry.isFeatureSupported(FONT_FAMILY)) { - System.err.println("FONT FAMILIES LIST = " + myEntry.getFontFamilies()); - // TODO: implement + for (String family : myEntry.getFontFamilies()) { + System.err.println("FAMILY = " + family + " => " + myEntry.getFontManager().Entries.get(family)); + } } return Parent.getFontFamily(); }