Это снова Игорь, автор данного топика и первой версии фонт-фикса для К3/К4, который эту всю кашу и заварил. Интересно было увидеть через два года что тема развивалась дальше.
Позвольте спросить всех, кто это сообщение видит: а это добро работает на Paperwhite 2? Кто-нибудь пробовал ставить?
А то я отцу купил Paperwhite, хочу шрифты поменять. И что-то так не хочется начинать разрабатывать по новой...
Текущий метод замены шрифтов и полей не отличается изяществом, живёт тут (также готовый фонтхак см. пункт 9 в первом сообщении темы): libroom.net/viewtopic.php?p=1114264#1114264 Реализовано тупо-в-лоб, но по крайней мере нужные параметры и подводные камни уже найдены.
Переезжайте в последнюю тему, или если наработки по замене уже есть - создавайте новую в разделе Paperwhite...
PS: Кстати, а как опрашиваются jar-файлы с ресурсами для локализации? Я вот знаю, что file_ln.jar будет перекрыт файлом file_ln_LN.jar, а вот в каком порядке опрашиваются всевозможные комбинации ln_LN и символов "-" / "_"? file_ln_LN.jar file-ln_LN.jar file_ln-LN.jar file-ln-LN.jar ... _________________ Kobo Glo HD, Kobo Aura H2O, Kindle Paperwhite 2
И с ним тоже ничего не работает. bin файл, который получается, успешно автоматически удаляется устройством. В wiki написано, что для моего девайса нужна версия KindleTool 1.6.3 - пока его не нашел.
Что-то я совсем ничего не понимаю: Вы людям предлагаете отредактировать бинарник? А почему не дать им отредактировать текстовый файл fontfix.pref - как это было у меня в моей версии? Есть какие-то технические ограничения?
Позвольте еще вопрос.
Я так понимаю, что подход у них поменялся. Раньше были framework-api_en_US.jar и MobiReader_en_US.jar, в которых надо было сделать исправления - отдать массивы с другими значениями.
А что в paperwhite киндле? Другие названия ресурсных файлов только, или что-то посложнее?
с ним тоже ничего не работает. bin файл, который получается, успешно автоматически удаляется устройством. в wiki написано, что для моего девайса нужна версия kindletool 1.6.3
В wiki указаны финальные версии, а я дал ссылку на самый свежий снапшот, который скорее всего и станет 1.6.3. Мне пока не попадались PW2, которые этот KindleTool (1.6.2.20) не понимает. Ну или первые 4 цифры серийника своего Paperwhite - в студию. И да, надо сначала откатить прошивку до 5.4.3.2, поставить джейлбрэк (тоже крайний снапшот), а уж потом...
Ihor wrote:
вы людям предлагаете отредактировать бинарник? А почему не дать им отредактировать текстовый файл fontfix.pref - как это было у меня в моей версии? Есть какие-то технические ограничения?
И ещё какие - там... у меня в голове. (с) Я Java знаю более чем посредственно, поэтому сделал как сумел - по минимуму, зато работает.
Ihor wrote:
А что в paperwhite киндле? Другие названия ресурсных файлов только, или что-то посложнее?
Ну я же все названия файлов, и что где править, привёл в этом сообщении. Там же и архив с исходниками под прошивку 5.4.5 (в архиве с готовыми бинарниками сорцы только на сам установщик).
Ihor wrote:
я этот путь уже раз проходил, то второй раз не хочется проходить его с нуля.
С нуля и не надо. Собственно, основная проблема - получение параметров из внешнего файла. Java-потроха в новых прошивках от старых отличаются весьма сильно... _________________ Kobo Glo HD, Kobo Aura H2O, Kindle Paperwhite 2
А Вы можете сорсы своих файлов Mobi-drawing-en_GB.jar HTMLReader-impl-en_GB.jar Reader-plugin-en_GB.jar ReaderSDK-impl-en_GB.jar сюда дать?
Или Вы их правили тем редактором бинарников?
Я понял в чем фокус. Файлы поменялись (по сравнению с KDX и K3), java код поменялся. Но принцип остался прежним: список размеров сидит в ресурсах. А раз так, то я просто могу сделать такую же штуку, какую делал два года назад: написать кусок кода, который будет читать текстовый файл fontfix.pref. И людям будет счастье.
За основу для правки я брал en_GB-ресурсы, они в папке "en_GB_orig". В ней же, в "Class" лежат нужные class-файлы, которые и надо менять (я использовал байткод-редактор JBE, параметры по файлам тут):
HTMLReaderImplResources_en_GB.class отвечает за размер шрифтов в новых KF8/AZW3 книгах.
MobiDrawingResources_en_GB.class отвечает за размер шрифтов в старых MOBI/AZW книгах.
PDFResources_en_GB.class отвечает за рефлоу PDF-файлов.
ReaderResources_en_GB.class отвечает за размер полей во всех книгах. В нём же можно исправить отображаемый размер шрифтов в самом меню "Аа", но глючит это отчаянно.
ScrubberUIResources_en_GB.class отвечает за миниатюрное окно быстрого перехода по тексту слайдером - при изменении полей пропорции искажаются.
SearchResultsPaneResources_en_GB.class и YJReaderImplResources_en_GB.class тоже отвечают за размер шрифтов, но где именно, я не знаю.
В папке "Bookmark" лежит картинка закладок, которая при уменьшении полей наползает на текст.
Ihor wrote:
принцип остался прежним: список размеров сидит в ресурсах.
Да, подход к размещению параметров у Амазонок не изменился... _________________ Kobo Glo HD, Kobo Aura H2O, Kindle Paperwhite 2
Теперь понятно: Вы ломали сам class-файл (бинарник), не декомпилируя это в java и не пытаясь сделать по тому принципу, по которому я тогда сделал (с текстовым файлом настроек).
Так тоже можно, но заставлять простых смертных работать с байт-кодом (если им надо поменять) - это конечно жестоко. Бессовестный Вы.
Кроме того, сами шрифты в окне выбора шрифтов отображаются отвратительно: визуально размер в окне один, а когда выбираешь - применяется действительный размер (что во взломанном файле). Значит Вы где-то недоломали.
Помните, в K3 было два файла - ReaderResources_en_US.java и UIResources_en_US.java: один из них отдавал ресурс - mobireader.default.font.size.list второй - fontmenu.displaystring и fontmenu.default.font.size.list
Как думаете почему так? Потому что один использовала сама читалка, а второй - программа-морда.
И они оба должны были быть синхронизированы. А у вас полный десинхрон. Я понимаю, что оно работает, однако почему-то мне кажется, что можно сделать лучше. Надо только найти где ресурсы морды. Вот не верю, что они их зашили в коде - должен быть где-то еще один ресурсный файл.
Но в любом случае спасибо за то, что направление указали. Двигаться дальше (делать нормальный пак с текстовым конфигом) или нет - этого я уже не знаю; зависит от наличия свободного времени.
И они оба должны были быть синхронизированы. А у вас полный десинхрон. Я понимаю, что оно работает, однако почему-то мне кажется, что можно сделать лучше. Надо только найти где ресурсы морды. Вот не верю, что они их зашили в коде - должен быть где-то еще один ресурсный файл.
А чего искать-то? Туточки: ReaderSDK-impl-en_GB.jar -> ReaderResources_en_GB.class
Вот только просто поменять размеры мало - помните, я же предупредил: "В нём же можно исправить отображаемый размер шрифтов в самом меню "Аа", но глючит это отчаянно."
Во первых, похоже что как-то разнесены сами шрифты в меню и тап-области, им соответствующие.
Во вторых, стоит только тронуть размеры, как моментально ломается изменение размеров, за которое отвечает HTMLReaderImplResources_en_GB.class, т.е. новые KF8-книги. А поскольку это почти ePub со всем богатством форматирования и иногда даже переносами, то становится особенно обидно... _________________ Kobo Glo HD, Kobo Aura H2O, Kindle Paperwhite 2
просто поменять размеры мало - помните, я же предупредил: "В нём же можно исправить отображаемый размер шрифтов в самом меню "Аа", но глючит это отчаянно."
Значит надо сидеть и читать java код, который формирует это окно, контролы для выбора шрифтов и т.д., и который рассчитывает значения высоты и ширины этих контролов. А также их количества и всего прочего.
Тоже почему-то слабо верю, что в этом коде хардкод, но вполне может быть, что там зашит рассчет, что в массиве ровно 9 значений.
К сожалению посмотреть смогу на следующей недели, так как сейчас завал по времени.
Но вот сделать то, чтобы править эти настройки можно было в текстовом файле (а не в бинарнике) - это то, что я бы хотел сделать. Я думаю многим было бы куда приятнее править текстовый файл.
После достижения определённого порога вкладываемых усилий подобное занятие перестаёт приносить какое-либо удовольствие. А поскольку вид меню шрифтов меня совсем не напрягает, то и копать вглубь категорически лень.
Вот брать настройки из внешнего файла - это да, сверхполезно. Меню же - так, красявости... _________________ Kobo Glo HD, Kobo Aura H2O, Kindle Paperwhite 2
Такого не было в class файлах от Kindle DX, например.
Так что я не знаю что тут делать. Наверное редактирование бинарников - это единственный путь.
Если кто-то даст нормальный декомпилятор - сделаю вторую попытку.
Posted after 1 hour 35 minutes 27 seconds:
Кстати, описанные тут манипуляции с ReaderSDK-impl-ln_LN.jar (ReaderResources_ln_LN.class) у меня не работают: поля со всех сторон какие были, такие и остаются.
Я сделал jar-ы испанские (у отца киндл на испанском языке), вначале сделал HTMLReader-impl-es_ES.jar и Mobi-drawing-es_ES.jar для изменения набора шрифтов - через редактор JBE. Все сработало хорошо, с размерами порядок.
Потом я поменял ReaderSDK-impl-ln_LN.jar для установки полей - по тому же алгоритму. И ФИГ!
При этом я на 100% уверен, что менял все правильно, потому что изменения записывал в текстовый файл, а потом компаратором сравнивал оригинал с модификацией, и смотрел внимательно в ваше описание - ничего ли не забыл. А еще повторно в JBE открыл уже свой class (замененный ранее) чтобы убедиться, что изменения есть. ОНИ ТАМ ЕСТЬ - 100%. Но вот поля не поменялись. Девайс перегружал.
Я конечно был бы очень счастлив, если бы нашел где-то нормальный декомпилятор (желательно такой, который запускается с командной строки), чтобы можно было:
1) переписать ВСЕ jar файлы на комп 2) распаковать архиватором каждый в отдельную папку - одной операцией 3) запустить команду powershell, которая переберет все папки рекурсивно и все файлы class, декомпилирует их:
этот пример - вообще строго говоря не декомпиляция. Это просто отображение инструкций байт-кода в текстовом виде (ближайший аналог - любой однопроходной дизассемблер, например Hiew). У JAD'а явно слетела крыша, о чем он недвусмысленно сигнализирует в конце листинга. Ну и он, мягко скажем, староват: Copyright 2001 Pavel Kouznetsov. Вот как выглядит тот же модуль, декопмилированный приличным современным Ява-декомпилятором AndroChef Java Decompiler <...>
public class HTMLReaderImplResources_es extends com.amazon.ebook.util.KindleResourceBundle { public HTMLReaderImplResources_es() { super(); Object[][] a = new Object[12][]; Object[] a0 = new Object[2]; a0[0] = "font.html.linespacing.values"; int[] a1 = new int[3]; a1[0] = 1; a1[1] = 2; a1[2] = 3; a0[1] = a1; a[0] = a0; Object[] a2 = new Object[2]; a2[0] = "htmlreader.default.font.size.list"; int[] a3 = new int[8]; a3[0] = 7; a3[1] = 8; a3[2] = 9; a3[3] = 11; a3[4] = 13; a3[5] = 16; a3[6] = 25; a3[7] = 37; a2[1] = a3; a[1] = a2; Object[] a4 = new Object[2]; a4[0] = "htmlreader.default.font.size.list.cjk"; int[] a5 = new int[8]; a5[0] = 7; a5[1] = 8; a5[2] = 9; a5[3] = 11; a5[4] = 13; a5[5] = 16; a5[6] = 25; a5[7] = 37; a4[1] = a5; a[2] = a4; Object[] a6 = new Object[2]; a6[0] = "html.fixedlayout.region.overlap.ratio"; a6[1] = new Double(0.2); a[3] = a6; Object[] a7 = new Object[2]; a7[0] = "html.fixedlayout.panel.icon.background"; a7[1] = com.amazon.agui.swing.KindleColor.white; a[4] = a7; Object[] a8 = new Object[2]; a8[0] = "html.fixedlayout.panel.icon.foreground"; a8[1] = com.amazon.agui.swing.KindleColor.black; a[5] = a8; Object[] a9 = new Object[2]; a9[0] = "html.fixedlayout.blank.indicator.color"; a9[1] = com.amazon.agui.swing.KindleColor.GRAY_08; a[6] = a9; Object[] a10 = new Object[2]; a10[0] = "html.fixedlayout.flash.timer.intial"; a10[1] = new Integer(400); a[7] = a10; Object[] a11 = new Object[2]; a11[0] = "html.fixedlayout.flash.timer.repeat"; a11[1] = new Integer(200); a[8] = a11; Object[] a12 = new Object[2]; a12[0] = "html.fixedlayout.flash.indicator.background"; a12[1] = com.amazon.agui.swing.KindleColor.white; a[9] = a12; Object[] a13 = new Object[2]; a13[0] = "html.fixedlayout.flash.indicator.foreground"; a13[1] = com.amazon.agui.swing.KindleColor.black; a[10] = a13; Object[] a14 = new Object[2]; a14[0] = "html.fixedlayout.max.stretched.ratio"; a14[1] = new Integer(120); a[11] = a14; this.CONTENTS_DEFAULT = a; Object[][] a15 = new Object[21][]; Object[] a16 = new Object[2]; a16[0] = "html.fixedlayout.panel.icon.bg.border.location.offset"; a16[1] = new Integer(1); a15[0] = a16; Object[] a17 = new Object[2]; a17[0] = "html.fixedlayout.panel.icon.bg.border.dimension.offset"; a17[1] = new Integer(3); a15[1] = a17; Object[] a18 = new Object[2]; a18[0] = "html.fixedlayout.panel.icon.portrait.rectangle"; a18[1] = new java.awt.Rectangle(560, 752, 22, 30); a15[2] = a18; Object[] a19 = new Object[2]; a19[0] = "html.fixedlayout.panel.icon.landscape.rectangle"; a19[1] = new java.awt.Rectangle(752, 560, 30, 22); a15[3] = a19; Object[] a20 = new Object[2]; a20[0] = "html.fixedlayout.closebutton.icon.filename"; a20[1] = "/com/amazon/ebook/booklet/reader/impl/ui/resources/assets/yoshi/iconC lose.png"; a15[4] = a20; Object[] a21 = new Object[2]; a21[0] = "html.fixedlayout.closebutton.icon.portrait.point"; a21[1] = new java.awt.Point(487, 75); a15[5] = a21; Object[] a22 = new Object[2]; a22[0] = "html.fixedlayout.closebutton.icon.landscape.point"; a22[1] = new java.awt.Point(687, 75); a15[6] = a22; Object[] a23 = new Object[2]; a23[0] = "html.fixedlayout.closebutton.tapzone.portrait.rectangle"; a23[1] = new java.awt.Rectangle(487, 75, 38, 38); a15[7] = a23; Object[] a24 = new Object[2]; a24[0] = "html.fixedlayout.closebutton.tapzone.landscape.rectangle"; a24[1] = new java.awt.Rectangle(687, 75, 38, 38); a15[8] = a24; Object[] a25 = new Object[2]; a25[0] = "html.fixedlayout.blank.indicator.portrait.center.point"; a25[1] = new java.awt.Point(300, 785); a15[9] = a25; Object[] a26 = new Object[2]; a26[0] = "html.fixedlayout.blank.indicator.landscape.center.point"; a26[1] = new java.awt.Point(400, 585); a15[10] = a26; Object[] a27 = new Object[2]; a27[0] = "html.fixedlayout.blank.indicator.landscape.leftpage.center.point"; a27[1] = new java.awt.Point(200, 585); a15[11] = a27; Object[] a28 = new Object[2]; a28[0] = "html.fixedlayout.blank.indicator.landscape.rightpage.center.point"; a28[1] = new java.awt.Point(600, 585); a15[12] = a28; Object[] a29 = new Object[2]; a29[0] = "html.fixedlayout.blank.indicator.width"; a29[1] = new Integer(8); a15[13] = a29; Object[] a30 = new Object[2]; a30[0] = "html.fixedlayout.blank.indicator.xoffset"; a30[1] = new Integer(38); a15[14] = a30; Object[] a31 = new Object[2]; a31[0] = "html.fixedlayout.flash.indicator.portrait.point"; a31[1] = new java.awt.Point(488, 688); a15[15] = a31; Object[] a32 = new Object[2]; a32[0] = "html.fixedlayout.flash.indicator.landscape.point"; a32[1] = new java.awt.Point(688, 488); a15[16] = a32; Object[] a33 = new Object[2]; a33[0] = "html.fixedlayout.flash.indicator.width"; a33[1] = new Integer(15); a15[17] = a33; Object[] a34 = new Object[2]; a34[0] = "html.fixedlayout.flash.indicator.border"; a34[1] = new Integer(1); a15[18] = a34; Object[] a35 = new Object[2]; a35[0] = "htmlreader.font.size.list"; float[] a36 = new float[8]; a36[0] = 7f; a36[1] = 8f; a36[2] = 9f; a36[3] = 11f; a36[4] = 13f; a36[5] = 16f; a36[6] = 25f; a36[7] = 37f; a35[1] = a36; a15[19] = a35; Object[] a37 = new Object[2]; a37[0] = "htmlreader.font.size.list.cjk"; float[] a38 = new float[8]; a38[0] = 7f; a38[1] = 8f; a38[2] = 9f; a38[3] = 11f; a38[4] = 13f; a38[5] = 16f; a38[6] = 25f; a38[7] = 37f; a37[1] = a38; a15[20] = a37; this.CONTENTS_DPI_167 = a15; Object[][] a39 = new Object[21][]; Object[] a40 = new Object[2]; a40[0] = "html.fixedlayout.panel.icon.bg.border.location.offset"; a40[1] = new Integer(1); a39[0] = a40; Object[] a41 = new Object[2]; a41[0] = "html.fixedlayout.panel.icon.bg.border.dimension.offset"; a41[1] = new Integer(3); a39[1] = a41; Object[] a42 = new Object[2]; a42[0] = "html.fixedlayout.panel.icon.portrait.rectangle"; a42[1] = new java.awt.Rectangle(704, 960, 30, 40); a39[2] = a42; Object[] a43 = new Object[2]; a43[0] = "html.fixedlayout.panel.icon.landscape.rectangle"; a43[1] = new java.awt.Rectangle(960, 704, 40, 30); a39[3] = a43; Object[] a44 = new Object[2]; a44[0] = "html.fixedlayout.closebutton.icon.filename"; a44[1] = "/com/amazon/ebook/booklet/reader/impl/ui/resources/assets/yoshime3/ic onClose.png"; a39[4] = a44; Object[] a45 = new Object[2]; a45[0] = "html.fixedlayout.closebutton.icon.portrait.point"; a45[1] = new java.awt.Point(608, 100); a39[5] = a45; Object[] a46 = new Object[2]; a46[0] = "html.fixedlayout.closebutton.icon.landscape.point"; a46[1] = new java.awt.Point(874, 100); a39[6] = a46; Object[] a47 = new Object[2]; a47[0] = "html.fixedlayout.closebutton.tapzone.portrait.rectangle"; a47[1] = new java.awt.Rectangle(608, 100, 50, 50); a39[7] = a47; Object[] a48 = new Object[2]; a48[0] = "html.fixedlayout.closebutton.tapzone.landscape.rectangle"; a48[1] = new java.awt.Rectangle(874, 100, 50, 50); a39[8] = a48; Object[] a49 = new Object[2]; a49[0] = "html.fixedlayout.blank.indicator.portrait.center.point"; a49[1] = new java.awt.Point(379, 1004); a39[9] = a49; Object[] a50 = new Object[2]; a50[0] = "html.fixedlayout.blank.indicator.landscape.center.point"; a50[1] = new java.awt.Point(512, 738); a39[10] = a50; Object[] a51 = new Object[2]; a51[0] = "html.fixedlayout.blank.indicator.landscape.leftpage.center.point"; a51[1] = new java.awt.Point(256, 738); a39[11] = a51; Object[] a52 = new Object[2]; a52[0] = "html.fixedlayout.blank.indicator.landscape.rightpage.center.point"; a52[1] = new java.awt.Point(768, 738); a39[12] = a52; Object[] a53 = new Object[2]; a53[0] = "html.fixedlayout.blank.indicator.width"; a53[1] = new Integer(10); a39[13] = a53; Object[] a54 = new Object[2]; a54[0] = "html.fixedlayout.blank.indicator.xoffset"; a54[1] = new Integer(50); a39[14] = a54; Object[] a55 = new Object[2]; a55[0] = "html.fixedlayout.flash.indicator.portrait.point"; a55[1] = new java.awt.Point(608, 874); a39[15] = a55; Object[] a56 = new Object[2]; a56[0] = "html.fixedlayout.flash.indicator.landscape.point"; a56[1] = new java.awt.Point(874, 608); a39[16] = a56; Object[] a57 = new Object[2]; a57[0] = "html.fixedlayout.flash.indicator.width"; a57[1] = new Integer(20); a39[17] = a57; Object[] a58 = new Object[2]; a58[0] = "html.fixedlayout.flash.indicator.border"; a58[1] = new Integer(1); a39[18] = a58; Object[] a59 = new Object[2]; a59[0] = "htmlreader.font.size.list"; float[] a60 = new float[8]; a60[0] = 7.13f; a60[1] = 7.81f; a60[2] = 8.49f; a60[3] = 9.17f; a60[4] = 10.53f; a60[5] = 12.56f; a60[6] = 16.98f; a60[7] = 29.2f; a59[1] = a60; a39[19] = a59; Object[] a61 = new Object[2]; a61[0] = "htmlreader.font.size.list.cjk"; float[] a62 = new float[8]; a62[0] = 7.13f; a62[1] = 8.15f; a62[2] = 8.83f; a62[3] = 9.51f; a62[4] = 10.19f; a62[5] = 11.88f; a62[6] = 16.98f; a62[7] = 29.2f; a61[1] = a62; a39[20] = a61; this.CONTENTS_DPI_212 = a39; } }
Работает из коммандной строки, powershell'ом я не пользовался, мне было удобнее запускать из под cygwin, так как там есть python прямо во флаконе, но все остальное весьма похоже. Вот так примерно декомпилируется вся Java из киндловского firmware:
decomp_all.sh
:
Code:
AMAZON=$1/amazon/ebook
if [ "${AMAZON}" = "/amazon/ebook" ]; then echo "Please, specify source /opt directory" exit 1 fi
DESTDIR=$2
if [ "x${DESTDIR}" = "x" ]; then echo "Please, specify destination directory" exit 2 fi
if [ ! -d "${DESTDIR}" ]; then mkdir "${DESTDIR}" fi
for f in `ls ${AMAZON}/lib/*.jar` do file_jar=`basename ${f}` file_name=${file_jar%%.*} dest_dir=${DESTDIR}/lib/${file_name}
if [ -d "${dest_dir}" ]; then echo "${file_jar} has been processed before, skipping" else echo "decompiling ${file_jar} into ${dest_dir}" mkdir "${dest_dir}" ./decomp_lib.sh "${1}" "${file_jar}" "${dest_dir}" > "${dest_dir}/all.log" fi done
for f in `ls ${AMAZON}/booklet/*.jar` do file_jar=`basename ${f}` file_name=${file_jar%%.*} dest_dir=${DESTDIR}/booklet/${file_name}
if [ -d "${dest_dir}" ]; then echo "${file_jar} has been processed before, skipping" else echo "decompiling ${file_jar} into ${dest_dir}" mkdir "${dest_dir}" ./decomp.sh "${1}" "${file_jar}" "${dest_dir}" > "${dest_dir}/all.log" fi done
Barafu Это частное решение только для шрифта - на Kindle 3/4 и поля можно было настраивать... _________________ Kobo Glo HD, Kobo Aura H2O, Kindle Paperwhite 2
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum