mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-04 18:29:23 +02:00
CSS: bold & italic
This commit is contained in:
parent
094afe8652
commit
74434ce274
6 changed files with 98 additions and 27 deletions
2
TODO.1.5
2
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
|
||||
|
|
|
@ -156,6 +156,7 @@ shared_ptr<ZLTextStyleEntry> StyleSheetTable::createControl(const AttributeMap &
|
|||
|
||||
const std::vector<std::string> &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<ZLTextStyleEntry> StyleSheetTable::createControl(const AttributeMap &
|
|||
const std::vector<std::string> &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<std::string> &fontSize = values(styles, "font-size");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue