From fc26b2f685a1ef57663ac3fabb0d39829eef57aa Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 10:25:11 +0400 Subject: [PATCH 1/8] Fix status font size issue --- android/src/org/coolreader/crengine/History.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/org/coolreader/crengine/History.java b/android/src/org/coolreader/crengine/History.java index 727705f47d..ef7237869f 100644 --- a/android/src/org/coolreader/crengine/History.java +++ b/android/src/org/coolreader/crengine/History.java @@ -208,9 +208,9 @@ public BitmapDrawable decodeCoverPage( byte[] data ) //BitmapDrawable drawable = new BitmapDrawable(mCoolReader.getResources(), is); //BitmapDrawable drawable = new BitmapDrawable(null, is); Bitmap bmp = Bitmap.createBitmap(coverPageWidth, coverPageHeight, Bitmap.Config.ARGB_8888); - bmp.setDensity(Bitmap.DENSITY_NONE); // mCoolReader.getResources().getDisplayMetrics().densityDpi + //bmp.setDensity(Bitmap.DENSITY_NONE); // mCoolReader.getResources().getDisplayMetrics().densityDpi Canvas canvas = new Canvas(bmp); - canvas.setDensity(Bitmap.DENSITY_NONE); // mCoolReader.getResources().getDisplayMetrics().densityDpi + //canvas.setDensity(Bitmap.DENSITY_NONE); // mCoolReader.getResources().getDisplayMetrics().densityDpi canvas.drawBitmap(srcbmp, new Rect(0, 0, srcbmp.getWidth(), srcbmp.getHeight()), new Rect(0, 0, coverPageWidth, coverPageHeight), null); Log.d("cr3", "cover page format: " + srcbmp.getWidth() + "x" + srcbmp.getHeight()); From 03407b77735df923be6b1d94bf6e5f712f3a7c3c Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 10:25:32 +0400 Subject: [PATCH 2/8] Fix status font size issue --- crengine/src/lvdocview.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crengine/src/lvdocview.cpp b/crengine/src/lvdocview.cpp index ccb5414154..954d9d225f 100644 --- a/crengine/src/lvdocview.cpp +++ b/crengine/src/lvdocview.cpp @@ -1082,7 +1082,7 @@ int LVDocView::GetFullHeight() { int LVDocView::getPageHeaderHeight() { if (!getPageHeaderInfo()) return 0; - return getInfoFont()->getHeight() + HEADER_MARGIN + 3; + return getInfoFont()->getHeight()*12/10 + HEADER_MARGIN + 3; } /// calculate page header rectangle @@ -1547,9 +1547,9 @@ void LVDocView::drawPageHeader(LVDrawBuf * drawbuf, const lvRect & headerRc, pageinfo += L"%"; } if ( batteryPercentNormalFont && m_battery_state>=0 ) { - pageinfo += L" <"; + pageinfo += L" ["; pageinfo += lString16::itoa(m_battery_state)+L"%"; - pageinfo += L">"; + pageinfo += L"]"; } } int piw = 0; @@ -4708,8 +4708,8 @@ void LVDocView::propsUpdateDefaults(CRPropRef props) { static int def_updates[] = { 1, 0, 2, 3, 4, 5, 6, 7 }; props->limitValueList(PROP_DISPLAY_FULL_UPDATE_INTERVAL, def_updates, 8); int fs = props->getIntDef(PROP_STATUS_FONT_SIZE, INFO_FONT_SIZE); - if (fs < 10) - fs = 10; + if (fs < 8) + fs = 8; else if (fs > 32) fs = 32; props->setIntDef(PROP_STATUS_FONT_SIZE, fs); @@ -4878,8 +4878,8 @@ CRPropRef LVDocView::propsApply(CRPropRef props) { } else if (name == PROP_STATUS_FONT_SIZE) { int fontSize = props->getIntDef(PROP_STATUS_FONT_SIZE, INFO_FONT_SIZE); - if (fontSize < 14) - fontSize = 14; + if (fontSize < 8) + fontSize = 8; else if (fontSize > 28) fontSize = 28; setStatusFontSize(fontSize);//cr_font_sizes From b8d1761b2d868869ed88818ad3d5c6cceea9d0db Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 12:33:13 +0400 Subject: [PATCH 3/8] Android: fix 1.5 compatibility, fix status bar battery icon and percent --- android/AndroidManifest.xml | 2 +- android/jni/battery_icons.h | 30 +- android/jni/readerview.cpp | 92 +++-- .../src/org/coolreader/crengine/History.java | 19 + cr3qt/src/cr3widget.cpp | 369 +++++++++++++----- crengine/include/lvstring.h | 4 + crengine/src/lvdocview.cpp | 5 +- crengine/src/lvfntman.cpp | 2 +- crengine/src/lvstring.cpp | 7 + 9 files changed, 373 insertions(+), 157 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 62c0d547a0..65cdeb3ef6 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="3.0.46-6" android:versionCode="136"> icons; - - icons.add( LVCreateXPMImageSource( battery_charge ) ); - - icons.add( LVCreateXPMImageSource( battery0 ) ); - icons.add( LVCreateXPMImageSource( battery1 ) ); - icons.add( LVCreateXPMImageSource( battery2 ) ); - icons.add( LVCreateXPMImageSource( battery3 ) ); - icons.add( LVCreateXPMImageSource( battery4 ) ); - icons.add( LVCreateXPMImageSource( battery5 ) ); - icons.add( LVCreateXPMImageSource( battery6 ) ); - icons.add( LVCreateXPMImageSource( battery7 ) ); - icons.add( LVCreateXPMImageSource( battery8 ) ); - - icons.add( LVCreateXPMImageSource( battery_frame ) ); + const char * * icon_bpm[] = { + battery_charge, + battery0, + battery1, + battery2, + battery3, + battery4, + battery5, + battery6, + battery7, + battery8, + battery_frame, + NULL + }; - return icons; diff --git a/android/jni/readerview.cpp b/android/jni/readerview.cpp index 93f28078e8..977496decb 100644 --- a/android/jni/readerview.cpp +++ b/android/jni/readerview.cpp @@ -138,35 +138,55 @@ DECL_DEF_CR_FONT_SIZES; #define NO_BATTERY_GAUGE 1 -static LVRefVec getBatteryIcons( bool nightMode ) -{ - if ( !nightMode ) { - #define BATTERY_HEADER \ - "28 15 5 1", \ - "0 c #80000000", \ - "X c #80000000", \ - "o c #80AAAAAA", \ - ". c #80FFFFFF", \ - " c None", - #include "battery_icons.h" - } else { - #undef BATTERY_HEADER - #define BATTERY_HEADER \ - "28 15 5 1", \ - "0 c #80000000", \ - "X c #80000000", \ - "o c #80888888", \ - ". c #80AAAAAA", \ - " c None", - #include "battery_icons.h" +static void replaceColor( char * str, lUInt32 color ) +{ + // in line like "0 c #80000000", + // replace value of color + for ( int i=0; i<8; i++ ) { + str[i+5] = toHexDigit((color>>28) & 0xF); + color <<= 4; } } +static LVRefVec getBatteryIcons( lUInt32 color ) +{ + CRLog::debug("Making list of Battery icon bitmats"); + lUInt32 cl1 = 0x00000000|(color&0xFFFFFF); + lUInt32 cl2 = 0x40000000|(color&0xFFFFFF); + lUInt32 cl3 = 0x80000000|(color&0xFFFFFF); + lUInt32 cl4 = 0xF0000000|(color&0xFFFFFF); + + static char color1[] = "0 c #80000000"; + static char color2[] = "X c #80000000"; + static char color3[] = "o c #80AAAAAA"; + static char color4[] = ". c #80FFFFFF"; + #define BATTERY_HEADER \ + "28 15 5 1", \ + color1, \ + color2, \ + color3, \ + color4, \ + " c None", + + #include "battery_icons.h" + + replaceColor( color1, cl1 ); + replaceColor( color2, cl2 ); + replaceColor( color3, cl3 ); + replaceColor( color4, cl4 ); + + LVRefVec icons; + for ( int i=0; icon_bpm[i]; i++ ) + icons.add( LVCreateXPMImageSource( icon_bpm[i] ) ); + + return icons; +} + ReaderViewNative::ReaderViewNative() { _docview = new LVDocView(16); //16bpp - LVRefVec icons = getBatteryIcons( false ); + LVRefVec icons = getBatteryIcons( 0x000000 ); _docview->setBatteryIcons( icons ); LVArray sizes( cr_font_sizes, sizeof(cr_font_sizes)/sizeof(int) ); @@ -425,9 +445,12 @@ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_getPageImageInter LVDrawBuf * drawbuf = BitmapAccessorInterface::getInstance()->lock(env, bitmap); if ( drawbuf!=NULL ) { - //CRLog::trace("getPageImageInternal calling Draw drawbuf width=%d height=%d", drawbuf->GetWidth(), drawbuf->GetHeight()); - p->_docview->Draw( *drawbuf ); - //CRLog::trace("getPageImageInternal calling bitmap->unlock"); + if ( p!=NULL && p->_docview!=NULL ) { + CRLog::trace("getPageImageInternal calling Draw drawbuf width=%d height=%d 0x%x", drawbuf->GetWidth(), drawbuf->GetHeight(), (int)p->_docview); + p->_docview->Draw( *drawbuf ); + } else + CRLog::error("getPageImageInternal : NO DOCVIEW CREATED!!!"); + CRLog::trace("getPageImageInternal calling bitmap->unlock"); BitmapAccessorInterface::getInstance()->unlock(env, bitmap, drawbuf); } else { CRLog::error("bitmap accessor is invalid"); @@ -483,13 +506,22 @@ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_ReaderView_applySettings CRPropRef props = env.fromJavaProperties(_props); CRPropRef oldProps = p->_docview->propsGetCurrent(); p->_docview->propsUpdateDefaults( props ); - bool oldNightMode = oldProps->getBoolDef(PROP_NIGHT_MODE, false); - bool newNightMode = props->getBoolDef(PROP_NIGHT_MODE, false); - if ( oldNightMode!=newNightMode ) { - LVRefVec icons = getBatteryIcons( newNightMode ); + //bool oldNightMode = oldProps->getBoolDef(PROP_NIGHT_MODE, false); + //bool newNightMode = props->getBoolDef(PROP_NIGHT_MODE, false); + p->_docview->propsApply( props ); + bool oldTextColor = oldProps->getColorDef(PROP_FONT_COLOR, 0x000000); + bool newTextColor = props->getColorDef(PROP_FONT_COLOR, 0x000000); + bool oldStatusColor = oldProps->getColorDef(PROP_FONT_COLOR, 0x000000); + bool newStatusColor = props->getColorDef(PROP_FONT_COLOR, 0x000000); + lUInt32 batteryColor = newStatusColor; + if ( batteryColor==0xFF000000 ) + batteryColor = newTextColor; + if ( oldTextColor!=newTextColor || oldStatusColor!=newStatusColor ) { //oldNightMode!=newNightMode + LVRefVec icons = getBatteryIcons( batteryColor ); + CRLog::debug("Setting list of Battery icon bitmats"); p->_docview->setBatteryIcons( icons ); + CRLog::debug("Setting list of Battery icon bitmats - done"); } - p->_docview->propsApply( props ); return JNI_TRUE; } #if 0 diff --git a/android/src/org/coolreader/crengine/History.java b/android/src/org/coolreader/crengine/History.java index ef7237869f..aabeb210d8 100644 --- a/android/src/org/coolreader/crengine/History.java +++ b/android/src/org/coolreader/crengine/History.java @@ -1,6 +1,7 @@ package org.coolreader.crengine; import java.io.ByteArrayInputStream; +import java.lang.reflect.Method; import java.util.ArrayList; import org.coolreader.CoolReader; @@ -200,6 +201,9 @@ synchronized void invalidateImages() } } + private static Method bitmapSetDensityMethod; + private static Method canvasSetDensityMethod; + private static boolean isNewApiChecked; public BitmapDrawable decodeCoverPage( byte[] data ) { try { @@ -207,9 +211,24 @@ public BitmapDrawable decodeCoverPage( byte[] data ) Bitmap srcbmp = BitmapFactory.decodeStream(is); //BitmapDrawable drawable = new BitmapDrawable(mCoolReader.getResources(), is); //BitmapDrawable drawable = new BitmapDrawable(null, is); + + if ( !isNewApiChecked ) { + isNewApiChecked = true; + try { + bitmapSetDensityMethod = Bitmap.class.getMethod("setDensity", new Class[] {int.class}); + canvasSetDensityMethod = Canvas.class.getMethod("setDensity", new Class[] {int.class}); + } catch ( Exception e ) { + L.w("No Bitmap.setDensity() method found"); + } + } + Bitmap bmp = Bitmap.createBitmap(coverPageWidth, coverPageHeight, Bitmap.Config.ARGB_8888); + if ( bitmapSetDensityMethod!=null ) + bitmapSetDensityMethod.invoke(bmp, Bitmap.DENSITY_NONE); //bmp.setDensity(Bitmap.DENSITY_NONE); // mCoolReader.getResources().getDisplayMetrics().densityDpi Canvas canvas = new Canvas(bmp); + if ( canvasSetDensityMethod!=null ) + canvasSetDensityMethod.invoke(canvas, Bitmap.DENSITY_NONE); //canvas.setDensity(Bitmap.DENSITY_NONE); // mCoolReader.getResources().getDisplayMetrics().densityDpi canvas.drawBitmap(srcbmp, new Rect(0, 0, srcbmp.getWidth(), srcbmp.getHeight()), new Rect(0, 0, coverPageWidth, coverPageHeight), null); diff --git a/cr3qt/src/cr3widget.cpp b/cr3qt/src/cr3widget.cpp index 9d98810218..0340efa0da 100644 --- a/cr3qt/src/cr3widget.cpp +++ b/cr3qt/src/cr3widget.cpp @@ -27,6 +27,266 @@ class CR3View::DocViewData DECL_DEF_CR_FONT_SIZES; +static void replaceColor( char * str, lUInt32 color ) +{ + // in line like "0 c #80000000", + // replace value of color + for ( int i=0; i<8; i++ ) { + str[i+5] = toHexDigit((color>>28) & 0xF); + color <<= 4; + } +} + +static LVRefVec getBatteryIcons( lUInt32 color ) +{ + CRLog::debug("Making list of Battery icon bitmats"); + lUInt32 cl1 = 0x00000000|(color&0xFFFFFF); + lUInt32 cl2 = 0x40000000|(color&0xFFFFFF); + lUInt32 cl3 = 0x80000000|(color&0xFFFFFF); + lUInt32 cl4 = 0xF0000000|(color&0xFFFFFF); + + static char color1[] = "0 c #80000000"; + static char color2[] = "X c #80000000"; + static char color3[] = "o c #80AAAAAA"; + static char color4[] = ". c #80FFFFFF"; + #define BATTERY_HEADER \ + "28 15 5 1", \ + color1, \ + color2, \ + color3, \ + color4, \ + " c None", + + static const char * battery8[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0.XXXX.XXXX.XXXX.XXXX.0.", + ".0000.XXXX.XXXX.XXXX.XXXX.0.", + ".0..0.XXXX.XXXX.XXXX.XXXX.0.", + ".0..0.XXXX.XXXX.XXXX.XXXX.0.", + ".0..0.XXXX.XXXX.XXXX.XXXX.0.", + ".0..0.XXXX.XXXX.XXXX.XXXX.0.", + ".0..0.XXXX.XXXX.XXXX.XXXX.0.", + ".0..0.XXXX.XXXX.XXXX.XXXX.0.", + ".0..0.XXXX.XXXX.XXXX.XXXX.0.", + ".0000.XXXX.XXXX.XXXX.XXXX.0.", + "....0.XXXX.XXXX.XXXX.XXXX.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery7[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0.oooo.XXXX.XXXX.XXXX.0.", + ".0000.oooo.XXXX.XXXX.XXXX.0.", + ".0..0.oooo.XXXX.XXXX.XXXX.0.", + ".0..0.oooo.XXXX.XXXX.XXXX.0.", + ".0..0.oooo.XXXX.XXXX.XXXX.0.", + ".0..0.oooo.XXXX.XXXX.XXXX.0.", + ".0..0.oooo.XXXX.XXXX.XXXX.0.", + ".0000.oooo.XXXX.XXXX.XXXX.0.", + "....0.oooo.XXXX.XXXX.XXXX.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery6[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0......XXXX.XXXX.XXXX.0.", + ".0000......XXXX.XXXX.XXXX.0.", + ".0..0......XXXX.XXXX.XXXX.0.", + ".0..0......XXXX.XXXX.XXXX.0.", + ".0..0......XXXX.XXXX.XXXX.0.", + ".0..0......XXXX.XXXX.XXXX.0.", + ".0..0......XXXX.XXXX.XXXX.0.", + ".0000......XXXX.XXXX.XXXX.0.", + "....0......XXXX.XXXX.XXXX.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery5[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0......oooo.XXXX.XXXX.0.", + ".0000......oooo.XXXX.XXXX.0.", + ".0..0......oooo.XXXX.XXXX.0.", + ".0..0......oooo.XXXX.XXXX.0.", + ".0..0......oooo.XXXX.XXXX.0.", + ".0..0......oooo.XXXX.XXXX.0.", + ".0..0......oooo.XXXX.XXXX.0.", + ".0000......oooo.XXXX.XXXX.0.", + "....0......oooo.XXXX.XXXX.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery4[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0...........XXXX.XXXX.0.", + ".0000...........XXXX.XXXX.0.", + ".0..0...........XXXX.XXXX.0.", + ".0..0...........XXXX.XXXX.0.", + ".0..0...........XXXX.XXXX.0.", + ".0..0...........XXXX.XXXX.0.", + ".0..0...........XXXX.XXXX.0.", + ".0000...........XXXX.XXXX.0.", + "....0...........XXXX.XXXX.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery3[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0...........oooo.XXXX.0.", + ".0000...........oooo.XXXX.0.", + ".0..0...........oooo.XXXX.0.", + ".0..0...........oooo.XXXX.0.", + ".0..0...........oooo.XXXX.0.", + ".0..0...........oooo.XXXX.0.", + ".0..0...........oooo.XXXX.0.", + ".0000...........oooo.XXXX.0.", + "....0...........oooo.XXXX.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery2[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0................XXXX.0.", + ".0000................XXXX.0.", + ".0..0................XXXX.0.", + ".0..0................XXXX.0.", + ".0..0................XXXX.0.", + ".0..0................XXXX.0.", + ".0..0................XXXX.0.", + ".0000................XXXX.0.", + "....0................XXXX.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery1[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + " .0................oooo.0.", + ".0000................oooo.0.", + ".0..0................oooo.0.", + ".0..0................oooo.0.", + ".0..0................oooo.0.", + ".0..0................oooo.0.", + ".0..0................oooo.0.", + ".0000................oooo.0.", + " .0................oooo.0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery0[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + " .0.....................0.", + ".0000.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0000.....................0.", + "....0.....................0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; +//#endif + + static const char * battery_charge[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0.....................0.", + ".0000............XX.......0.", + ".0..0...........XXXX......0.", + ".0..0..XX......XXXXXX.....0.", + ".0..0...XXX...XXXX..XX....0.", + ".0..0....XXX..XXXX...XX...0.", + ".0..0.....XXXXXXX.....XX..0.", + ".0000.......XXXX..........0.", + "....0........XX...........0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + static const char * battery_frame[] = { + BATTERY_HEADER + " .........................", + " .00000000000000000000000.", + " .0.....................0.", + "....0.....................0.", + ".0000.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0..0.....................0.", + ".0000.....................0.", + "....0.....................0.", + " .0.....................0.", + " .00000000000000000000000.", + " .........................", + }; + + const char * * icon_bpm[] = { + battery_charge, + battery0, + battery1, + battery2, + battery3, + battery4, + battery5, + battery6, + battery7, + battery8, + battery_frame, + NULL + }; + + replaceColor( color1, cl1 ); + replaceColor( color2, cl2 ); + replaceColor( color3, cl3 ); + replaceColor( color4, cl4 ); + + LVRefVec icons; + for ( int i=0; icon_bpm[i]; i++ ) + icons.add( LVCreateXPMImageSource( icon_bpm[i] ) ); + + return icons; +} + CR3View::CR3View( QWidget *parent) : QWidget( parent, Qt::WindowFlags() ), _scroll(NULL), _propsCallback(NULL) @@ -50,113 +310,8 @@ CR3View::CR3View( QWidget *parent) _selRange.setEnd(p2); LVArray sizes( cr_font_sizes, sizeof(cr_font_sizes)/sizeof(int) ); _docview->setFontSizes( sizes, false ); - LVRefVec icons; - static const char * battery4[] = { - "24 13 4 1", - "0 c #000000", - "o c #A1A1A1", - ". c #FFFFFF", - " c None", - " .....................", - " .0000000000000000000.", - "....0.................0.", - ".0000.000.000.000.000.0.", - ".0..0.000.000.000.000.0.", - ".0..0.000.000.000.000.0.", - ".0..0.000.000.000.000.0.", - ".0..0.000.000.000.000.0.", - ".0..0.000.000.000.000.0.", - ".0000.000.000.000.000.0.", - "....0.................0.", - " .0000000000000000000.", - " .....................", - }; - static const char * battery3[] = { - "24 13 4 1", - "0 c #000000", - "o c #A1A1A1", - ". c #FFFFFF", - " c None", - " .....................", - " .0000000000000000000.", - "....0.................0.", - ".0000.ooo.000.000.000.0.", - ".0..0.ooo.000.000.000.0.", - ".0..0.ooo.000.000.000.0.", - ".0..0.ooo.000.000.000.0.", - ".0..0.ooo.000.000.000.0.", - ".0..0.ooo.000.000.000.0.", - ".0000.ooo.000.000.000.0.", - "....0.................0.", - " .0000000000000000000.", - " .....................", - }; - static const char * battery2[] = { - "24 13 4 1", - "0 c #000000", - "o c #A1A1A1", - ". c #FFFFFF", - " c None", - " .....................", - " .0000000000000000000.", - "....0.................0.", - ".0000.ooo.ooo.000.000.0.", - ".0..0.ooo.ooo.000.000.0.", - ".0..0.ooo.ooo.000.000.0.", - ".0..0.ooo.ooo.000.000.0.", - ".0..0.ooo.ooo.000.000.0.", - ".0..0.ooo.ooo.000.000.0.", - ".0000.ooo.ooo.000.000.0.", - "....0.................0.", - " .0000000000000000000.", - " .....................", - }; - static const char * battery1[] = { - "24 13 4 1", - "0 c #000000", - "o c #A1A1A1", - ". c #FFFFFF", - " c None", - " .....................", - " .0000000000000000000.", - "....0.................0.", - ".0000.ooo.ooo.ooo.000.0.", - ".0..0.ooo.ooo.ooo.000.0.", - ".0..0.ooo.ooo.ooo.000.0.", - ".0..0.ooo.ooo.ooo.000.0.", - ".0..0.ooo.ooo.ooo.000.0.", - ".0..0.ooo.ooo.ooo.000.0.", - ".0000.ooo.ooo.ooo.000.0.", - "....0.................0.", - " .0000000000000000000.", - " .....................", - }; - static const char * battery0[] = { - "24 13 4 1", - "0 c #000000", - "o c #A1A1A1", - ". c #FFFFFF", - " c None", - " .....................", - " .0000000000000000000.", - "....0.................0.", - ".0000.ooo.ooo.ooo.ooo.0.", - ".0..0.ooo.ooo.ooo.ooo.0.", - ".0..0.ooo.ooo.ooo.ooo.0.", - ".0..0.ooo.ooo.ooo.ooo.0.", - ".0..0.ooo.ooo.ooo.ooo.0.", - ".0..0.ooo.ooo.ooo.ooo.0.", - ".0000.ooo.ooo.ooo.ooo.0.", - "....0.................0.", - " .0000000000000000000.", - " .....................", - }; - icons.add( LVCreateXPMImageSource( battery0 ) ); - icons.add( LVCreateXPMImageSource( battery1 ) ); - icons.add( LVCreateXPMImageSource( battery2 ) ); - icons.add( LVCreateXPMImageSource( battery3 ) ); - icons.add( LVCreateXPMImageSource( battery4 ) ); - _docview->setBatteryIcons( icons ); + + _docview->setBatteryIcons( getBatteryIcons(0x000000) ); _docview->setBatteryState( -1 ); // LVStreamRef stream; // stream = LVOpenFileStream("/home/lve/.cr3/textures/old_paper.png", LVOM_READ); diff --git a/crengine/include/lvstring.h b/crengine/include/lvstring.h index 378414b9e9..bef46edccd 100644 --- a/crengine/include/lvstring.h +++ b/crengine/include/lvstring.h @@ -67,6 +67,8 @@ void lStr_lowercase( lChar16 * str, int len ); /// calculates CRC32 for buffer contents lUInt32 lStr_crc32( lUInt32 prevValue, const void * buf, int size ); +// converts 0..15 to 0..f +char toHexDigit( int c ); // returns 0..15 if c is hex digit, -1 otherwise int hexDigit( int c ); // decode LEN hex digits, return decoded number, -1 if invalid @@ -156,6 +158,8 @@ class lString8 public: /// default constrictor explicit lString8() : pchunk(EMPTY_STR_8) { addref(); } + /// constructor of empty string with buffer of specified size + explicit lString8( int size ) : pchunk(EMPTY_STR_8) { addref(); reserve(size); } /// copy constructor lString8(const lString8 & str) : pchunk(str.pchunk) { addref(); } /// constructor from C string diff --git a/crengine/src/lvdocview.cpp b/crengine/src/lvdocview.cpp index 954d9d225f..3d42bdf96d 100644 --- a/crengine/src/lvdocview.cpp +++ b/crengine/src/lvdocview.cpp @@ -1082,7 +1082,7 @@ int LVDocView::GetFullHeight() { int LVDocView::getPageHeaderHeight() { if (!getPageHeaderInfo()) return 0; - return getInfoFont()->getHeight()*12/10 + HEADER_MARGIN + 3; + return getInfoFont()->getHeight()*12/10 + HEADER_MARGIN + 5; } /// calculate page header rectangle @@ -1468,7 +1468,8 @@ void LVDocView::drawPageHeader(LVDrawBuf * drawbuf, const lvRect & headerRc, } lString16 text; - int iy = info.top; // + (info.height() - m_infoFont->getHeight()) * 2 / 3; + //int iy = info.top; // + (info.height() - m_infoFont->getHeight()) * 2 / 3; + int iy = info.top + /*m_infoFont->getHeight() +*/ (info.height() - m_infoFont->getHeight()) / 2; if (!m_pageHeaderOverride.empty()) { text = m_pageHeaderOverride; diff --git a/crengine/src/lvfntman.cpp b/crengine/src/lvfntman.cpp index 185535e510..a7f87cb872 100644 --- a/crengine/src/lvfntman.cpp +++ b/crengine/src/lvfntman.cpp @@ -2491,7 +2491,7 @@ int LVFontDef::CalcMatch( const LVFontDef & def ) const int LVFontDef::CalcFallbackMatch( lString8 face, int size ) const { if (_typeface != face) { - CRLog::trace("'%s'' != '%s'", face.c_str(), _typeface.c_str()); + //CRLog::trace("'%s'' != '%s'", face.c_str(), _typeface.c_str()); return 0; } int size_match = (_size==-1 || size==-1 || _size==size) ? 256 : 0; diff --git a/crengine/src/lvstring.cpp b/crengine/src/lvstring.cpp index c196404c88..d9cfdf1efe 100644 --- a/crengine/src/lvstring.cpp +++ b/crengine/src/lvstring.cpp @@ -847,6 +847,13 @@ int lString16::atoi() const return n; } +static const char * hex_digits = "0123456789abcdef"; +// converts 0..15 to 0..f +char toHexDigit( int c ) +{ + return hex_digits[c&0xf]; +} + // returns 0..15 if c is hex digit, -1 otherwise int hexDigit( int c ) { From fd4355163c175bdb0f3959225759868f3b1aa1d1 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 12:35:33 +0400 Subject: [PATCH 4/8] remove extra logging --- android/jni/readerview.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/android/jni/readerview.cpp b/android/jni/readerview.cpp index 977496decb..f706256476 100644 --- a/android/jni/readerview.cpp +++ b/android/jni/readerview.cpp @@ -444,13 +444,8 @@ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_getPageImageInter //CRLog::trace("getPageImageInternal calling bitmap->lock"); LVDrawBuf * drawbuf = BitmapAccessorInterface::getInstance()->lock(env, bitmap); if ( drawbuf!=NULL ) { - - if ( p!=NULL && p->_docview!=NULL ) { - CRLog::trace("getPageImageInternal calling Draw drawbuf width=%d height=%d 0x%x", drawbuf->GetWidth(), drawbuf->GetHeight(), (int)p->_docview); - p->_docview->Draw( *drawbuf ); - } else - CRLog::error("getPageImageInternal : NO DOCVIEW CREATED!!!"); - CRLog::trace("getPageImageInternal calling bitmap->unlock"); + p->_docview->Draw( *drawbuf ); + //CRLog::trace("getPageImageInternal calling bitmap->unlock"); BitmapAccessorInterface::getInstance()->unlock(env, bitmap, drawbuf); } else { CRLog::error("bitmap accessor is invalid"); @@ -518,9 +513,9 @@ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_ReaderView_applySettings batteryColor = newTextColor; if ( oldTextColor!=newTextColor || oldStatusColor!=newStatusColor ) { //oldNightMode!=newNightMode LVRefVec icons = getBatteryIcons( batteryColor ); - CRLog::debug("Setting list of Battery icon bitmats"); + //CRLog::debug("Setting list of Battery icon bitmats"); p->_docview->setBatteryIcons( icons ); - CRLog::debug("Setting list of Battery icon bitmats - done"); + //CRLog::debug("Setting list of Battery icon bitmats - done"); } return JNI_TRUE; } From a9f14ca265a4e416c68c2c28ab31c1855259f16e Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 15:43:00 +0400 Subject: [PATCH 5/8] Android: fix battery color --- android/AndroidManifest.xml | 2 +- android/jni/readerview.cpp | 12 +++++++----- crengine/src/props.cpp | 15 ++++++++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 65cdeb3ef6..951eabc773 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="3.0.46-7" android:versionCode="137"> _docview->propsUpdateDefaults( props ); //bool oldNightMode = oldProps->getBoolDef(PROP_NIGHT_MODE, false); //bool newNightMode = props->getBoolDef(PROP_NIGHT_MODE, false); + lUInt32 oldTextColor = oldProps->getColorDef(PROP_FONT_COLOR, 0x000000); + lUInt32 newTextColor = props->getColorDef(PROP_FONT_COLOR, 0x000000); + lUInt32 oldStatusColor = oldProps->getColorDef(PROP_STATUS_FONT_COLOR, 0xFF000000); + lUInt32 newStatusColor = props->getColorDef(PROP_STATUS_FONT_COLOR, 0xFF000000); + //CRLog::debug("Text colors: %x->%x, %x->%x", oldTextColor, newTextColor, oldStatusColor, newStatusColor); p->_docview->propsApply( props ); - bool oldTextColor = oldProps->getColorDef(PROP_FONT_COLOR, 0x000000); - bool newTextColor = props->getColorDef(PROP_FONT_COLOR, 0x000000); - bool oldStatusColor = oldProps->getColorDef(PROP_FONT_COLOR, 0x000000); - bool newStatusColor = props->getColorDef(PROP_FONT_COLOR, 0x000000); lUInt32 batteryColor = newStatusColor; if ( batteryColor==0xFF000000 ) batteryColor = newTextColor; - if ( oldTextColor!=newTextColor || oldStatusColor!=newStatusColor ) { //oldNightMode!=newNightMode + if ( 1 || oldTextColor!=newTextColor || oldStatusColor!=newStatusColor ) { //oldNightMode!=newNightMode + //CRLog::debug("%x->%x, %x->%x: Setting Battery icon color = #%06x", oldTextColor, newTextColor, oldStatusColor, newStatusColor, batteryColor); LVRefVec icons = getBatteryIcons( batteryColor ); //CRLog::debug("Setting list of Battery icon bitmats"); p->_docview->setBatteryIcons( icons ); diff --git a/crengine/src/props.cpp b/crengine/src/props.cpp index 48df662490..8437645b21 100644 --- a/crengine/src/props.cpp +++ b/crengine/src/props.cpp @@ -314,13 +314,19 @@ bool CRPropAccessor::getColor( const char * propName, lUInt32 &result ) const { unsigned n = 0; lString16 value; - if ( !getString( propName, value ) || value.empty() || value[0]!='#' ) + if ( !getString( propName, value ) ) { + //CRLog::debug("%s is not found", propName); return false; - for ( unsigned i=1; i='0' && ch<='9' ) n = (n << 4) | (ch - '0'); - else if ( ch>='a' && ch<='F' ) + else if ( ch>='a' && ch<='f' ) n = (n << 4) | (ch - 'a' + 10); else if ( ch>='A' && ch<='F' ) n = (n << 4) | (ch - 'A' + 10); @@ -328,13 +334,16 @@ bool CRPropAccessor::getColor( const char * propName, lUInt32 &result ) const return false; } result = (lUInt32)n; +// CRLog::debug("%s = %s (%08x)", propName, LCSTR(value), n); return true; } + /// get color (#xxxxxx) property by name, returns default value if not found lUInt32 CRPropAccessor::getColorDef( const char * propName, lUInt32 defValue ) const { lUInt32 v = 0; +// CRLog::debug("getColorDef(%s), 0x%06x", propName, defValue); if ( !getColor( propName, v ) ) return defValue; else From 04435130ebe27f87229eb5133cd360443b59a348 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 18:08:12 +0400 Subject: [PATCH 6/8] Android: add more interline space values --- android/src/org/coolreader/crengine/OptionsDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/org/coolreader/crengine/OptionsDialog.java b/android/src/org/coolreader/crengine/OptionsDialog.java index e78e10c468..3311919de6 100644 --- a/android/src/org/coolreader/crengine/OptionsDialog.java +++ b/android/src/org/coolreader/crengine/OptionsDialog.java @@ -69,7 +69,7 @@ public static int findBacklightSettingIndex( int value ) { "10%", "12%", "15%", "20%", "25%", "30%", "35%", "40%", "45%", "50%", "55%", "60%", "65%", "70%", "75%", "80%", "85%", "90%", "95%", "100%", }; int[] mInterlineSpaces = new int[] { - 80, 90, 100, 110, 120, 130, 140, 150 + 80, 90, 100, 105, 110, 115, 120, 130, 140, 150, 160 }; int[] mMargins = new int[] { 0, 1, 2, 3, 4, 5, 8, 10, 12, 15, 20, 25, 30 From 6bb6434ef0d9cba18238cb72b5d20f37c05f2588 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 18:09:29 +0400 Subject: [PATCH 7/8] Android: add more interline space values --- crengine/src/lvdocview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crengine/src/lvdocview.cpp b/crengine/src/lvdocview.cpp index 3d42bdf96d..00067b4119 100644 --- a/crengine/src/lvdocview.cpp +++ b/crengine/src/lvdocview.cpp @@ -4628,7 +4628,7 @@ int LVDocView::doCommand(LVDocCmd cmd, int param) { } //static int cr_font_sizes[] = { 24, 29, 33, 39, 44 }; -static int cr_interline_spaces[] = { 100, 80, 90, 110, 120, 130, 140, 150 }; +static int cr_interline_spaces[] = { 100, 80, 90, 105, 110, 115, 120, 130, 140, 150, 160 }; /// sets default property values if properties not found, checks ranges void LVDocView::propsUpdateDefaults(CRPropRef props) { From a1c5eb389fa4d6f5aaeeef36a5baa95566373f20 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 6 Jun 2011 18:18:07 +0400 Subject: [PATCH 8/8] Android: add more interline space values --- android/src/org/coolreader/crengine/OptionsDialog.java | 2 +- crengine/src/lvdocview.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/org/coolreader/crengine/OptionsDialog.java b/android/src/org/coolreader/crengine/OptionsDialog.java index 3311919de6..fe352eefe2 100644 --- a/android/src/org/coolreader/crengine/OptionsDialog.java +++ b/android/src/org/coolreader/crengine/OptionsDialog.java @@ -69,7 +69,7 @@ public static int findBacklightSettingIndex( int value ) { "10%", "12%", "15%", "20%", "25%", "30%", "35%", "40%", "45%", "50%", "55%", "60%", "65%", "70%", "75%", "80%", "85%", "90%", "95%", "100%", }; int[] mInterlineSpaces = new int[] { - 80, 90, 100, 105, 110, 115, 120, 130, 140, 150, 160 + 80, 90, 100, 105, 110, 115, 120, 130, 140, 150, 160, 180, 200 }; int[] mMargins = new int[] { 0, 1, 2, 3, 4, 5, 8, 10, 12, 15, 20, 25, 30 diff --git a/crengine/src/lvdocview.cpp b/crengine/src/lvdocview.cpp index 00067b4119..7a9fbe708e 100644 --- a/crengine/src/lvdocview.cpp +++ b/crengine/src/lvdocview.cpp @@ -4628,7 +4628,7 @@ int LVDocView::doCommand(LVDocCmd cmd, int param) { } //static int cr_font_sizes[] = { 24, 29, 33, 39, 44 }; -static int cr_interline_spaces[] = { 100, 80, 90, 105, 110, 115, 120, 130, 140, 150, 160 }; +static int cr_interline_spaces[] = { 100, 80, 90, 105, 110, 115, 120, 130, 140, 150, 160, 180, 200 }; /// sets default property values if properties not found, checks ranges void LVDocView::propsUpdateDefaults(CRPropRef props) {