diff --git a/.gitignore b/.gitignore
index ae3a8a2..68b179e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,31 @@ dist
*.mngl
*.cbz
*.bat
+.idea/
+
+*.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
\ No newline at end of file
diff --git a/mangle/book.py b/mangle/book.py
index fe8edfa..e4d545a 100644
--- a/mangle/book.py
+++ b/mangle/book.py
@@ -45,7 +45,7 @@ def natural_key(string_):
class Book(object):
- DefaultDevice = 'Kindle Paperwhite'
+ DefaultDevice = 'Kindle Paperwhite 3/Voyage/Oasis'
DefaultOutputFormat = 'CBZ only'
DefaultOverwrite = True
DefaultImageFlags = ImageFlags.Orient | ImageFlags.Resize | ImageFlags.Quantize
diff --git a/mangle/convert.py b/mangle/convert.py
index 6366daa..8c9c92e 100644
--- a/mangle/convert.py
+++ b/mangle/convert.py
@@ -36,6 +36,7 @@ class DialogConvert(QtGui.QProgressDialog):
self.setWindowTitle('Exporting book...')
self.setMaximum(len(self.book.images))
self.setValue(0)
+ self.increment = 0
self.archive = None
if 'CBZ' in self.book.outputFormat:
@@ -79,7 +80,8 @@ class DialogConvert(QtGui.QProgressDialog):
def onTimer(self):
index = self.value()
- target = os.path.join(self.bookPath, '%05d.png' % index)
+ pages_split = self.increment
+ target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split))
source = unicode(self.book.images[index])
if index == 0:
@@ -121,30 +123,34 @@ class DialogConvert(QtGui.QProgressDialog):
archive = self.archive
pdf = self.pdf
- # Maybe the user ask for a split, but the picture is not a large one, so skip
- # it but only for this picture
- if (flags & ImageFlags.Split) or (flags & ImageFlags.SplitInverse):
+ # Check if page wide enough to split
+ if (flags & ImageFlags.SplitRightLeft) or (flags & ImageFlags.SplitLeftRight):
if not image.isSplitable(source):
# remove split flags
- splitFlags= [ImageFlags.Split, ImageFlags.SplitInverse, ImageFlags.SplitRight, ImageFlags.SplitLeft]
+ splitFlags = [ImageFlags.SplitRightLeft, ImageFlags.SplitLeftRight, ImageFlags.SplitRight,
+ ImageFlags.SplitLeft]
for f in splitFlags:
flags &= ~f
# For right page (if requested in options and need for this image)
- if (flags & ImageFlags.Split):
- # New path based on modified index
- target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 0))
- self.convertAndSave(source, target, device, flags ^ ImageFlags.Split | ImageFlags.SplitRight, archive, pdf)
- # Change target once again for left page
- target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 1))
+ if flags & ImageFlags.SplitRightLeft:
+ self.convertAndSave(source, target, device,
+ flags ^ ImageFlags.SplitRightLeft | ImageFlags.SplitRight,
+ archive, pdf)
+
+ # Change target for left page
+ target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split + 1))
+ self.increment += 1
# For right page (if requested), but in inverted mode
- if (flags & ImageFlags.SplitInverse):
- # New path based on modified index
- target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 0))
- self.convertAndSave(source, target, device, flags ^ ImageFlags.SplitInverse | ImageFlags.SplitLeft, archive, pdf)
- # Change target once again for left page
- target = os.path.join(self.bookPath, '%05d.png' % (index * 2 + 1))
+ if flags & ImageFlags.SplitLeftRight:
+ self.convertAndSave(source, target, device,
+ flags ^ ImageFlags.SplitLeftRight | ImageFlags.SplitLeft,
+ archive, pdf)
+
+ # Change target for left page
+ target = os.path.join(self.bookPath, '%05d.png' % (index + pages_split + 1))
+ self.increment += 1
# Convert page
self.convertAndSave(source, target, device, flags, archive, pdf)
diff --git a/mangle/image.py b/mangle/image.py
index dcd6563..b9ba9e5 100644
--- a/mangle/image.py
+++ b/mangle/image.py
@@ -20,16 +20,16 @@ from PIL import Image, ImageDraw, ImageStat, ImageChops
class ImageFlags:
- Orient = 1 << 0
- Resize = 1 << 1
- Frame = 1 << 2
- Quantize = 1 << 3
- Stretch = 1 << 4
- Split = 1 << 5 # split right then left
- SplitRight = 1 << 6 # split only the right page
- SplitLeft = 1 << 7 # split only the left page
- SplitInverse = 1 << 8 # split left then right page
- AutoCrop = 1 << 9 # split left then right page
+ Orient = 1 << 0
+ Resize = 1 << 1
+ Frame = 1 << 2
+ Quantize = 1 << 3
+ Stretch = 1 << 4
+ SplitRightLeft = 1 << 5 # split right then left
+ SplitRight = 1 << 6 # split only the right page
+ SplitLeft = 1 << 7 # split only the left page
+ SplitLeftRight = 1 << 8 # split left then right page
+ AutoCrop = 1 << 9
class KindleData:
@@ -78,16 +78,17 @@ class KindleData:
Profiles = {
'Kindle 1': ((600, 800), Palette4),
- 'Kindle 2': ((600, 800), Palette15a),
- 'Kindle 3': ((600, 800), Palette15a),
- 'Kindle 4': ((600, 800), Palette15b),
- 'Kindle 5': ((600, 800), Palette15b),
- 'Kindle DX': ((824, 1200), Palette15a),
- 'Kindle DXG': ((824, 1200), Palette15a),
- 'Kindle Touch': ((600, 800), Palette15a),
- 'Kindle Paperwhite': ((758, 1024), Palette15b), # resolution given in manual, see http://kindle.s3.amazonaws.com/Kindle_Paperwhite_Users_Guide.pdf
- 'Kindle Paperwhite 3': ((1072, 1448), Palette15b),
- 'KoBo Aura H2o': ((1080, 1430), Palette15a), # resolution from http://www.fnac.com/Liseuse-Numerique-Kobo-by-Fnac-Kobo-Aura-H2O-Noir/a7745120/w-4
+ 'Kindle 2/3/Touch': ((600, 800), Palette15a),
+ 'Kindle 4 & 5': ((600, 800), Palette15b),
+ 'Kindle DX/DXG': ((824, 1200), Palette15a),
+ 'Kindle Paperwhite 1 & 2': ((758, 1024), Palette15b),
+ 'Kindle Paperwhite 3/Voyage/Oasis': ((1072, 1448), Palette15b),
+ 'Kobo Mini/Touch': ((600, 800), Palette15b),
+ 'Kobo Glo': ((768, 1024), Palette15b),
+ 'Kobo Glo HD': ((1072, 1448), Palette15b),
+ 'Kobo Aura': ((758, 1024), Palette15b),
+ 'Kobo Aura HD': ((1080, 1440), Palette15b),
+ 'Kobo Aura H2O': ((1080, 1430), Palette15a),
}
@@ -102,12 +103,14 @@ def protect_bad_image(func):
return func(*args, **kwargs)
except IOError: # Exception from PIL about bad image
return args[0]
+
return func_wrapper
@protect_bad_image
def splitLeft(image):
widthImg, heightImg = image.size
+
return image.crop((0, 0, widthImg / 2, heightImg))
@@ -188,6 +191,7 @@ def autoCropImage(image):
except TypeError: # bad image, specific to chops
return image
image = image.crop((x0, y0, xend, yend))
+
return image
@@ -253,29 +257,22 @@ def convertImage(source, target, device, flags):
# Load image from source path
image = loadImage(source)
-
-
# Format according to palette
image = formatImage(image)
- # Apply flag transforms
- # Second pass of first split
+ # Apply flag transforms
if flags & ImageFlags.SplitRight:
image = splitRight(image)
- # First pass of first split option
- if (flags & ImageFlags.Split):
+ if flags & ImageFlags.SplitRightLeft:
image = splitLeft(image)
- # First pass of second splitting option
if flags & ImageFlags.SplitLeft:
image = splitLeft(image)
- # second pass of second splitting option
- if (flags & ImageFlags.SplitInverse):
+ if flags & ImageFlags.SplitLeftRight:
image = splitRight(image)
# Auto crop the image, but before manage size and co, clean the source so
if flags & ImageFlags.AutoCrop:
image = autoCropImage(image)
-
if flags & ImageFlags.Orient:
image = orientImage(image, size)
if flags & ImageFlags.Resize:
@@ -284,10 +281,7 @@ def convertImage(source, target, device, flags):
image = stretchImage(image, size)
if flags & ImageFlags.Frame:
image = frameImage(image, tuple(palette[:3]), tuple(palette[-3:]), size)
-
-
-
if flags & ImageFlags.Quantize:
image = quantizeImage(image, palette)
- saveImage(image, target)
\ No newline at end of file
+ saveImage(image, target)
diff --git a/mangle/options.py b/mangle/options.py
index 08a29dd..c2437bc 100644
--- a/mangle/options.py
+++ b/mangle/options.py
@@ -69,9 +69,9 @@ class DialogOptions(QtGui.QDialog):
if self.checkboxFrame.isChecked():
imageFlags |= ImageFlags.Frame
if self.checkboxSplit.isChecked():
- imageFlags |= ImageFlags.Split
+ imageFlags |= ImageFlags.SplitRightLeft
if self.checkboxSplitInverse.isChecked():
- imageFlags |= ImageFlags.SplitInverse
+ imageFlags |= ImageFlags.SplitLeftRight
if self.checkboxAutoCrop.isChecked():
imageFlags |= ImageFlags.AutoCrop
diff --git a/mangle/ui/options.ui b/mangle/ui/options.ui
index 3619bbb..dded245 100644
--- a/mangle/ui/options.ui
+++ b/mangle/ui/options.ui
@@ -63,52 +63,57 @@
-
- Kindle 2
+ Kindle 2/3/Touch
-
- Kindle 3
+ Kindle 4 & 5
-
- Kindle 4
+ Kindle DX/DXG
-
- Kindle 5
+ Kindle Paperwhite 1 & 2
-
- Kindle DX
+ Kindle Paperwhite 3/Voyage/Oasis
-
- Kindle DXG
+ Kobo Mini/Touch
-
- Kindle Touch
+ Kobo Glo
-
- Kindle Paperwhite
+ Kobo Glo HD
-
- Kindle Paperwhite 3
+ Kobo Aura
-
- KoBo Aura H2o
+ Kobo Aura HD
+
+
+ -
+
+ Kobo Aura H2O