Просмотр исходного кода

Добавил опцию imageFitWidth

Book Pauk 6 лет назад
Родитель
Сommit
3e90277e1e

+ 4 - 1
client/components/Reader/SettingsPage/SettingsPage.vue

@@ -211,9 +211,12 @@
                                     </el-tooltip>
                                 </el-col>
                             </el-form-item>
+                            <el-form-item label="">
+                                <el-checkbox v-model="imageFitWidth">Ширина не более размера экрана</el-checkbox>
+                            </el-form-item>
                             <el-form-item label="">
                                     <el-col :span="12">
-                                        Размер не более
+                                        Высота не более
                                     </el-col>
                                     <el-tooltip :open-delay="500" effect="light" placement="top">
                                         <template slot="content">

+ 5 - 10
client/components/Reader/TextPage/DrawHelper.js

@@ -100,23 +100,18 @@ export default class DrawHelper {
                 space = (part.style.space > space ? part.style.space : space);
 
                 //избражения
-                //image: {local: Boolean, inline: Boolean, id: String, imageLine: Number, lineCount: Number, paraIndex: Number},
+                //image: {local: Boolean, inline: Boolean, id: String, imageLine: Number, lineCount: Number, paraIndex: Number, w: Number, h: Number},
                 const img = part.image;
                 if (img && img.id && !img.inline && !imageDrawn.has(img.paraIndex)) {
                     const bin = this.parsed.binary[img.id];
                     if (bin) {
-                        let imgH = img.lineCount*this.lineHeight;
-                        imgH = (imgH <= bin.h ? imgH : bin.h);
-                        let imgW = bin.w;
-
                         let resize = '';                        
-                        if (bin.h > imgH) {
-                            resize = `height: ${imgH}px`;
-                            imgW = imgW*imgH/bin.h;
+                        if (bin.h > img.h) {
+                            resize = `height: ${img.h}px`;
                         }
 
-                        const left = (this.w - imgW)/2;
-                        const top = ((img.lineCount*this.lineHeight - imgH)/2) + (i - img.imageLine)*this.lineHeight;
+                        const left = (this.w - img.w)/2;
+                        const top = ((img.lineCount*this.lineHeight - img.h)/2) + (i - img.imageLine)*this.lineHeight;
                         if (img.local) {
                             lineText += `<img src="data:${bin.type};base64,${bin.data}" style="position: absolute; left: ${left}px; top: ${top}px; ${resize}"/>`;
                         } else {

+ 1 - 0
client/components/Reader/TextPage/TextPage.vue

@@ -221,6 +221,7 @@ class TextPage extends Vue {
             this.parsed.showImages = this.showImages;
             this.parsed.showInlineImagesInCenter = this.showInlineImagesInCenter;
             this.parsed.imageHeightLines = this.imageHeightLines;
+            this.parsed.imageFitWidth = this.imageFitWidth;
         }
 
         //statusBar

+ 21 - 5
client/components/Reader/share/BookParser.js

@@ -609,7 +609,8 @@ export default class BookParser {
             para.parsed.cutEmptyParagraphs === this.cutEmptyParagraphs &&
             para.parsed.addEmptyParagraphs === this.addEmptyParagraphs &&
             para.parsed.showImages === this.showImages &&
-            para.parsed.imageHeightLines === this.imageHeightLines
+            para.parsed.imageHeightLines === this.imageHeightLines &&
+            para.parsed.imageFitWidth === this.imageFitWidth
             )
             return para.parsed;
 
@@ -623,6 +624,7 @@ export default class BookParser {
             addEmptyParagraphs: this.addEmptyParagraphs,
             showImages: this.showImages,
             imageHeightLines: this.imageHeightLines,
+            imageFitWidth: this.imageFitWidth,
             visible: !(
                 (this.cutEmptyParagraphs && para.cut) ||
                 (para.addIndex > this.addEmptyParagraphs)
@@ -638,7 +640,7 @@ export default class BookParser {
             last: Boolean,
             parts: array of {
                 style: {bold: Boolean, italic: Boolean, center: Boolean},
-                image: {local: Boolean, inline: Boolean, id: String, imageLine: Number, lineCount: Number, paraIndex: Number},
+                image: {local: Boolean, inline: Boolean, id: String, imageLine: Number, lineCount: Number, paraIndex: Number, w: Number, h: Number},
                 text: String,
             }
         }*/
@@ -666,8 +668,18 @@ export default class BookParser {
                     bin = {h: 0, w: 0};
 
                 let lineCount = this.imageHeightLines;
-                const c = Math.ceil(bin.h/this.lineHeight);
+                let c = Math.ceil(bin.h/this.lineHeight);
+                if (this.imageFitWidth && bin.w > this.w) {
+                    const newH = bin.h*this.w/bin.w;
+                    c = Math.ceil(newH/this.lineHeight);
+                }
                 lineCount = (c < lineCount ? c : lineCount);
+
+                let imageHeight = lineCount*this.lineHeight;
+                imageHeight = (imageHeight <= bin.h ? imageHeight : bin.h);
+
+                let imageWidth = (bin.h > imageHeight ? bin.w*imageHeight/bin.h : bin.w);
+
                 let i = 0;
                 for (; i < lineCount - 1; i++) {
                     line.end = para.offset + ofs;
@@ -679,7 +691,9 @@ export default class BookParser {
                         id: part.image.id,
                         imageLine: i,
                         lineCount,
-                        paraIndex
+                        paraIndex,
+                        w: imageWidth,
+                        h: imageHeight,
                     }});
                     lines.push(line);
                     line = {begin: line.end + 1, parts: []};
@@ -689,7 +703,9 @@ export default class BookParser {
                 line.first = (j == 0);
                 line.last = true;
                 line.parts.push({style, text: ' ',
-                    image: {local: part.image.local, inline: false, id: part.image.id, imageLine: i, lineCount, paraIndex}});
+                    image: {local: part.image.local, inline: false, id: part.image.id,
+                        imageLine: i, lineCount, paraIndex, w: imageWidth, h: imageHeight}
+                });
                 
                 continue;
             }

+ 1 - 0
client/store/modules/reader.js

@@ -164,6 +164,7 @@ const settingDefaults = {
         showImages: true,
         showInlineImagesInCenter: false,
         imageHeightLines: 100,
+        imageFitWidth: true,
 
         fontShifts: {},
 };