From 74434ce274db8fe0def84efad55f406ffab9544d Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 8 May 2012 20:18:58 +0100 Subject: [PATCH] CSS: bold & italic --- TODO.1.5 | 2 +- .../src/formats/css/StyleSheetTable.cpp | 2 +- .../text/src/model/ZLTextStyleEntry.h | 6 +- .../zlibrary/text/model/ZLTextPlainModel.java | 4 +- .../zlibrary/text/model/ZLTextStyleEntry.java | 57 +++++++++++++++---- .../style/ZLTextExplicitlyDecoratedStyle.java | 54 +++++++++++++++--- 6 files changed, 98 insertions(+), 27 deletions(-) diff --git a/TODO.1.5 b/TODO.1.5 index 0bd6dcf79..4f2102d64 100644 --- a/TODO.1.5 +++ b/TODO.1.5 @@ -28,7 +28,7 @@ DONE Chinese/Tamil UTF16 files DONE encodings list for native plugins * native: CSS! * CSS: parse tag lists like 'h1,h2,h3' -* embedded fonts (ePub) +* CSS: embedded fonts * предупреждение "не могу открыть зашифрованный файл" * API от Paragon * Two-page view diff --git a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp index 23128d2f3..898f44985 100644 --- a/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp +++ b/jni/NativeFormats/fbreader/src/formats/css/StyleSheetTable.cpp @@ -156,6 +156,7 @@ shared_ptr StyleSheetTable::createControl(const AttributeMap & const std::vector &bold = values(styles, "font-weight"); if (!bold.empty()) { + ZLLogger::Instance().println(ZLLogger::DEFAULT_CLASS, "bold: " + bold[0]); int num = -1; if (bold[0] == "bold") { num = 700; @@ -186,7 +187,6 @@ shared_ptr StyleSheetTable::createControl(const AttributeMap & const std::vector &fontFamily = values(styles, "font-family"); if (!fontFamily.empty() && !fontFamily[0].empty()) { entry->setFontFamily(fontFamily[0]); - ZLLogger::Instance().println(ZLLogger::DEFAULT_CLASS, "font family: " + fontFamily[0]); } const std::vector &fontSize = values(styles, "font-size"); diff --git a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h index 9bc0754b5..9babe08e8 100644 --- a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h +++ b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h @@ -137,7 +137,7 @@ inline ZLBoolean3 ZLTextStyleEntry::fontModifier(FontModifier modifier) const { return (myFontModifier & modifier) == 0 ? B3_FALSE : B3_TRUE; } inline void ZLTextStyleEntry::setFontModifier(FontModifier modifier, bool on) { - myFeatureMask |= FONT_STYLE_MODIFIER; + myFeatureMask |= 1 << FONT_STYLE_MODIFIER; mySupportedFontModifier |= modifier; if (on) { myFontModifier |= modifier; @@ -148,13 +148,13 @@ inline void ZLTextStyleEntry::setFontModifier(FontModifier modifier, bool on) { inline signed char ZLTextStyleEntry::fontSizeMagnification() const { return myFontSizeMagnification; } inline void ZLTextStyleEntry::setFontSizeMagnification(signed char fontSizeMagnification) { - myFeatureMask |= FONT_SIZE_MAGNIFICATION; + myFeatureMask |= 1 << FONT_SIZE_MAGNIFICATION; myFontSizeMagnification = fontSizeMagnification; } inline const std::string &ZLTextStyleEntry::fontFamily() const { return myFontFamily; } inline void ZLTextStyleEntry::setFontFamily(const std::string &fontFamily) { - myFeatureMask |= FONT_FAMILY; + myFeatureMask |= 1 << FONT_FAMILY; myFontFamily = fontFamily; } diff --git a/src/org/geometerplus/zlibrary/text/model/ZLTextPlainModel.java b/src/org/geometerplus/zlibrary/text/model/ZLTextPlainModel.java index 5a9d8f20e..35b821b5a 100644 --- a/src/org/geometerplus/zlibrary/text/model/ZLTextPlainModel.java +++ b/src/org/geometerplus/zlibrary/text/model/ZLTextPlainModel.java @@ -209,8 +209,8 @@ public class ZLTextPlainModel implements ZLTextModel, ZLTextStyleEntry.Feature { dataOffset += familyLength; } if (ZLTextStyleEntry.isFeatureSupported(mask, FONT_STYLE_MODIFIER)) { - // TODO: read font modifiers - dataOffset += 1; + final short value = (short)data[dataOffset++]; + entry.setFontModifiers((byte)(value & 0xFF), (byte)((value >> 8) & 0xFF)); } myStyleEntry = entry; diff --git a/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java b/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java index caa172fe2..fce8703d5 100644 --- a/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java +++ b/src/org/geometerplus/zlibrary/text/model/ZLTextStyleEntry.java @@ -19,24 +19,36 @@ package org.geometerplus.zlibrary.text.model; +import org.geometerplus.zlibrary.core.util.ZLBoolean3; + public final class ZLTextStyleEntry { public interface Feature { - int LENGTH_LEFT_INDENT = 0; - int LENGTH_RIGHT_INDENT = 1; - int LENGTH_FIRST_LINE_INDENT_DELTA = 2; - int LENGTH_SPACE_BEFORE = 3; - int LENGTH_SPACE_AFTER = 4; - int NUMBER_OF_LENGTHS = 5; - int ALIGNMENT_TYPE = NUMBER_OF_LENGTHS; - int FONT_SIZE_MAGNIFICATION = NUMBER_OF_LENGTHS + 1; - int FONT_FAMILY = NUMBER_OF_LENGTHS + 2; - int FONT_STYLE_MODIFIER = NUMBER_OF_LENGTHS + 3; + int LENGTH_LEFT_INDENT = 0; + int LENGTH_RIGHT_INDENT = 1; + int LENGTH_FIRST_LINE_INDENT_DELTA = 2; + int LENGTH_SPACE_BEFORE = 3; + int LENGTH_SPACE_AFTER = 4; + int NUMBER_OF_LENGTHS = 5; + int ALIGNMENT_TYPE = NUMBER_OF_LENGTHS; + int FONT_SIZE_MAGNIFICATION = NUMBER_OF_LENGTHS + 1; + int FONT_FAMILY = NUMBER_OF_LENGTHS + 2; + int FONT_STYLE_MODIFIER = NUMBER_OF_LENGTHS + 3; + } + + public interface FontModifier { + byte FONT_MODIFIER_BOLD = 1 << 0; + byte FONT_MODIFIER_ITALIC = 1 << 1; + byte FONT_MODIFIER_UNDERLINED = 1 << 2; + byte FONT_MODIFIER_STRIKEDTHROUGH = 1 << 3; + byte FONT_MODIFIER_SMALLCAPS = 1 << 4; } private short myFeatureMask; private byte myAlignmentType; private byte myFontSizeMagnification; private String myFontFamily; + private byte mySupportedFontModifiers; + private byte myFontModifiers; static boolean isFeatureSupported(short mask, int featureId) { return (mask & (1 << featureId)) != 0; @@ -82,11 +94,34 @@ public final class ZLTextStyleEntry { void setFontFamily(String fontFamily) { myFeatureMask |= 1 << Feature.FONT_FAMILY; - System.err.println("setting font family to " + fontFamily); myFontFamily = fontFamily; } public String getFontFamily() { return myFontFamily; } + + void setFontModifiers(byte supported, byte values) { + System.err.println("setting font modifiers to " + supported + "/" + values); + myFeatureMask |= 1 << Feature.FONT_STYLE_MODIFIER; + mySupportedFontModifiers = supported; + myFontModifiers = values; + } + + void setFontModifier(byte modifier, boolean on) { + myFeatureMask |= 1 << Feature.FONT_STYLE_MODIFIER; + mySupportedFontModifiers |= modifier; + if (on) { + myFontModifiers |= modifier; + } else { + myFontModifiers &= ~modifier; + } + } + + public ZLBoolean3 getFontModifier(byte modifier) { + if ((mySupportedFontModifiers & modifier) == 0) { + return ZLBoolean3.B3_UNDEFINED; + } + return (myFontModifiers & modifier) == 0 ? ZLBoolean3.B3_FALSE : ZLBoolean3.B3_TRUE; + } } diff --git a/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java b/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java index 2929a3122..b0816ac9e 100644 --- a/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java @@ -22,7 +22,7 @@ package org.geometerplus.zlibrary.text.view.style; import org.geometerplus.zlibrary.text.view.ZLTextStyle; import org.geometerplus.zlibrary.text.model.ZLTextStyleEntry; -public class ZLTextExplicitlyDecoratedStyle extends ZLTextStyle implements ZLTextStyleEntry.Feature { +public class ZLTextExplicitlyDecoratedStyle extends ZLTextStyle implements ZLTextStyleEntry.Feature, ZLTextStyleEntry.FontModifier { private final ZLTextStyleEntry myEntry; public ZLTextExplicitlyDecoratedStyle(ZLTextStyle base, ZLTextStyleEntry entry) { @@ -40,20 +40,56 @@ public class ZLTextExplicitlyDecoratedStyle extends ZLTextStyle implements ZLTex } public boolean isBold() { - // TODO: implement - return Base.isBold(); + if (!myEntry.isFeatureSupported(FONT_STYLE_MODIFIER)) { + return Base.isBold(); + } + switch (myEntry.getFontModifier(FONT_MODIFIER_BOLD)) { + case B3_TRUE: + return true; + case B3_FALSE: + return false; + default: + return Base.isBold(); + } } public boolean isItalic() { - // TODO: implement - return Base.isItalic(); + if (!myEntry.isFeatureSupported(FONT_STYLE_MODIFIER)) { + return Base.isItalic(); + } + switch (myEntry.getFontModifier(FONT_MODIFIER_ITALIC)) { + case B3_TRUE: + return true; + case B3_FALSE: + return false; + default: + return Base.isItalic(); + } } public boolean isUnderline() { - // TODO: implement - return Base.isUnderline(); + if (!myEntry.isFeatureSupported(FONT_STYLE_MODIFIER)) { + return Base.isUnderline(); + } + switch (myEntry.getFontModifier(FONT_MODIFIER_UNDERLINED)) { + case B3_TRUE: + return true; + case B3_FALSE: + return false; + default: + return Base.isUnderline(); + } } public boolean isStrikeThrough() { - // TODO: implement - return Base.isStrikeThrough(); + if (!myEntry.isFeatureSupported(FONT_STYLE_MODIFIER)) { + return Base.isStrikeThrough(); + } + switch (myEntry.getFontModifier(FONT_MODIFIER_STRIKEDTHROUGH)) { + case B3_TRUE: + return true; + case B3_FALSE: + return false; + default: + return Base.isStrikeThrough(); + } } public int getLeftIndent() {