diff options
-rw-r--r-- | dw/textblock.cc | 4 | ||||
-rw-r--r-- | dw/textblock.hh | 8 | ||||
-rw-r--r-- | dw/textblock_linebreaking.cc | 27 | ||||
-rw-r--r-- | test/Anna_Karenina_1.html | 25 |
4 files changed, 46 insertions, 18 deletions
diff --git a/dw/textblock.cc b/dw/textblock.cc index bc7c3444..a2962309 100644 --- a/dw/textblock.cc +++ b/dw/textblock.cc @@ -1573,7 +1573,7 @@ void Textblock::addSpace (core::style::Style *style) int wordIndex = words->size () - 1; if (wordIndex >= 0) { fillSpace (words->getRef(wordIndex), style); - accumulateWordData (wordIndex); + accumulateWordData (wordIndex, lines->size ()); } } @@ -1622,7 +1622,7 @@ void Textblock::addHyphen () // TODO Optimize? Like spaces? word->hyphenWidth = layout->textWidth (word->style->font, "\xc2\xad", 2); - accumulateWordData (wordIndex); + accumulateWordData (wordIndex, lines->size ()); } } diff --git a/dw/textblock.hh b/dw/textblock.hh index d883c1c8..681b4f6c 100644 --- a/dw/textblock.hh +++ b/dw/textblock.hh @@ -383,7 +383,7 @@ protected: inline int lineXOffsetContents (Line *line) { return innerPadding + line->leftOffset + - (line == lines->getRef (0) ? line1OffsetEff : 0); + (line == lines->getFirstRef() ? line1OffsetEff : 0); } /** @@ -441,10 +441,10 @@ protected: virtual void wordWrap (int wordIndex, bool wrapAll); int hyphenateWord (int wordIndex); void accumulateWordForLine (int lineIndex, int wordIndex); - void accumulateWordData(int wordIndex); - int calcAvailWidth (); + void accumulateWordData(int wordIndex, int lineIndex); + int calcAvailWidth (int lineIndex); void initLine1Offset (int wordIndex); - void alignLine (Line *line); + void alignLine (int lineIndex); void sizeRequestImpl (core::Requisition *requisition); void getExtremesImpl (core::Extremes *extremes); diff --git a/dw/textblock_linebreaking.cc b/dw/textblock_linebreaking.cc index d14319ef..d267e358 100644 --- a/dw/textblock_linebreaking.cc +++ b/dw/textblock_linebreaking.cc @@ -326,7 +326,7 @@ Textblock::Line *Textblock::addLine (int firstWord, int lastWord, line->breakSpace = 0; line->leftOffset = 0; - alignLine (line); + alignLine (lineIndex); for (int i = line->firstWord; i < line->lastWord; i++) { Word *word = words->getRef (i); lineWidth += (word->effSpace - word->origSpace); @@ -416,13 +416,13 @@ void Textblock::wordWrap (int wordIndex, bool wrapAll) word = words->getRef (wordIndex); word->effSpace = word->origSpace; - accumulateWordData (wordIndex); + accumulateWordData (wordIndex, lines->size ()); bool newLine; do { bool tempNewLine = false; - int firstIndex = lines->size() == 0 ? - 0 : lines->getRef(lines->size() - 1)->lastWord + 1; + int firstIndex = + lines->size() == 0 ? 0 : lines->getLastRef()->lastWord + 1; int searchUntil; if (wrapAll && wordIndex >= firstIndex && wordIndex == words->size() -1) { @@ -448,7 +448,7 @@ void Textblock::wordWrap (int wordIndex, bool wrapAll) newLine = false; if(newLine) { - accumulateWordData (wordIndex); + accumulateWordData (wordIndex, lines->size() - 1); int wordIndexEnd = wordIndex; bool lineAdded; @@ -543,7 +543,7 @@ void Textblock::wordWrap (int wordIndex, bool wrapAll) PRINTF ("[%p] accumulating again from %d to %d\n", this, breakPos + 1, wordIndexEnd); for(int i = breakPos + 1; i <= wordIndexEnd; i++) - accumulateWordData (i); + accumulateWordData (i, lines->size() - 1); } while(!lineAdded); } @@ -614,7 +614,7 @@ int Textblock::hyphenateWord (int wordIndex) } } - accumulateWordData (wordIndex + i); + accumulateWordData (wordIndex + i, lines->size() - 1); } PRINTF (" finished\n"); @@ -689,12 +689,12 @@ void Textblock::accumulateWordForLine (int lineIndex, int wordIndex) } } -void Textblock::accumulateWordData (int wordIndex) +void Textblock::accumulateWordData (int wordIndex, int lineIndex) { Word *word = words->getRef (wordIndex); PRINTF ("[%p] ACCUMULATE_WORD_DATA (%d): ...\n", this, wordIndex); - int availWidth = calcAvailWidth (); // todo: variable? parameter? + int availWidth = calcAvailWidth (lineIndex); if (wordIndex == 0 || (lines->size () > 0 && @@ -738,7 +738,7 @@ void Textblock::accumulateWordData (int wordIndex) //printf ("\n"); } -int Textblock::calcAvailWidth () +int Textblock::calcAvailWidth (int lineIndex) { int availWidth = this->availWidth - getStyle()->boxDiffWidth() - innerPadding; @@ -746,6 +746,8 @@ int Textblock::calcAvailWidth () layout->getUsesViewport () && availWidth > layout->getWidthViewport () - 10) availWidth = layout->getWidthViewport () - 10; + if (lineIndex == 0) + availWidth -= line1OffsetEff; //PRINTF("[%p] CALC_AVAIL_WIDTH => %d - %d - %d = %d\n", // this, this->availWidth, getStyle()->boxDiffWidth(), innerPadding, @@ -787,9 +789,10 @@ void Textblock::initLine1Offset (int wordIndex) * * \todo Use block's style instead once paragraphs become proper blocks. */ -void Textblock::alignLine (Line *line) +void Textblock::alignLine (int lineIndex) { - int availWidth = calcAvailWidth (); + Line *line = lines->getRef (lineIndex); + int availWidth = calcAvailWidth (lineIndex); Word *firstWord = words->getRef (line->firstWord); Word *lastWord = words->getRef (line->lastWord); diff --git a/test/Anna_Karenina_1.html b/test/Anna_Karenina_1.html new file mode 100644 index 00000000..6deb470d --- /dev/null +++ b/test/Anna_Karenina_1.html @@ -0,0 +1,25 @@ +<div lang="ru" style="text-indent: 0.7cm; text-align: justify"> +<p>Все счастливые семьи похожи друг на друга, каждая несчастливая семья несчастлива по-своему.</p> +<p>Все смешалось в доме Облонских. Жена узнала, что муж был в связи с бывшею в их доме француженкою-гувернанткой, и объявила мужу, что не может жить с ним в одном доме. Положение это продолжалось уже третий день и мучительно чувствовалось и самими супругами, и всеми членами семьи, и домочадцами. Все члены семьи и домочадцы чувствовали, что нет смысла в их сожительстве и что на каждом постоялом дворе случайно сошедшиеся люди более связаны между собой, чем они, члены семьи и домочадцы Облонских. Жена не выходила из своих комнат, мужа третий день не было дома. Дети бегали по всему дому, как потерянные; англичанка поссорилась с экономкой и написала записку приятельнице, прося приискать ей новое место; повар ушел вчера со двора, во время самого обеда; черная кухарка и кучер просили расчета.</p> +<p>На третий день после ссоры князь Степан Аркадьич Облонский — Стива, как его звали в свете, — в обычный час, то есть в восемь часов утра, проснулся не в спальне жены, а в своем кабинете, на сафьянном диване. Он повернул свое полное, выхоленное тело на пружинах дивана, как бы желая опять заснуть надолго, с другой стороны крепко обнял подушку и прижался к ней щекой; но вдруг вскочил, сел на диван и открыл глаза.</p> +<p>«Да, да, как это было? — думал он, вспоминая сон. — Да, +как это было? Да! Алабин давал обед в Дармштадте; нет, не в +Дармштадте, а что-то американское. Да, но там Дармштадт был в +Америке. Да, Алабин давал обед на стеклянных столах, да, — и +столы пели: <span lang="it">Il mio tesoro</span>, и +не <span lang="it">Il mio tesoro</span>, а что-то лучше, и какие-то +маленькие графинчики, и они же женщины», — вспоминал он.</p> + +<p>Глаза Степана Аркадьича весело заблестели, и он задумался, улыбаясь. «Да, хорошо было, очень хорошо. Много еще что-то там было отличного, да не скажешь словами и мыслями даже наяву не выразишь». И, заметив полосу света, пробившуюся сбоку одной из суконных стор, он весело скинул ноги с дивана, отыскал ими шитые женой (подарок ко дню рождения в прошлом году), обделанные в золотистый сафьян туфли и по старой, девятилетней привычке, не вставая, потянулся рукой к тому месту, где в спальне у него висел халат. И тут он вспомнил вдруг, как и почему он спит не в спальне жены, а в кабинете; улыбка исчезла с его лица, он сморщил лоб.</p> +<p>«Ах, ах, ах! Ааа!..» — замычал он, вспоминая все, что было. И его воображению представились опять все подробности ссоры с женою, вся безвыходность его положения и мучительнее всего собственная вина его.</p> +<p>«Да! она не простит и не может простить. И всего ужаснее то, что виной всему я, виной я, а не виноват. В этом-то вся драма, — думал он. — Ах, ах, ах!» — приговаривал он с отчаянием, вспоминая самые тяжелые для себя впечатления из этой ссоры.</p> +<p>Неприятнее всего была та первая минута, когда он, вернувшись из театра, веселым и довольным, с огромною грушей для жены в руке, не нашел жены в гостиной; к удивлению, не нашел ее и в кабинете и, наконец, увидал ее в спальне с несчастною, открывшею все, запиской в руке.</p> +<p>Она, эта вечно озабоченная, и хлопотливая, и недалекая, какою он считал ее, Долли, неподвижно сидела с запиской в руке и с выражением ужаса, отчаяния и гнева смотрела на него.</p> +<p>— Что это? это? — спрашивала она, указывая на записку.</p> + +<p>И при этом воспоминании, как это часто бывает, мучало Степана Аркадьича не столько самое событие, сколько то, как он ответил на эти слова жены.</p> +<p>С ним случилось в эту минуту то, что случается с людьми, когда они неожиданно уличены в чем-нибудь слишком постыдном. Он не сумел приготовить свое лицо к тому положению, в которое он становился пред женой после открытия его вины. Вместо того чтоб оскорбиться, отрекаться, оправдываться, просить прощения, оставаться даже равнодушным — все было бы лучше того, что он сделал! — его лицо совершенно невольно («рефлексы головного мозга», — подумал Степан Аркадьич, который любил физиологию), совершенно невольно вдруг улыбнулось привычною, доброю и потому глупою улыбкой.</p> +<p>Эту глупую улыбку он не мог простить себе. Увидав эту улыбку, Долли вздрогнула, как от физической боли, разразилась, со свойственною ей горячностью, потоком жестоких слов и выбежала из комнаты. С тех пор она не хотела видеть мужа.</p> +<p>«Всему виной эта глупая улыбка», — думал Степан Аркадьич.</p> +<p>«Но что ж делать? что ж делать?» — с отчаянием говорил он себе и не находил ответа.</p> +</div> |