aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/textblock.cc4
-rw-r--r--dw/textblock.hh8
-rw-r--r--dw/textblock_linebreaking.cc27
-rw-r--r--test/Anna_Karenina_1.html25
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>На третий день после ссоры князь Степан Аркадьич Облонский&#160;— Стива, как его звали в свете,&#160;— в обычный час, то есть в восемь часов утра, проснулся не в спальне жены, а в своем кабинете, на сафьянном диване. Он повернул свое полное, выхоленное тело на пружинах дивана, как бы желая опять заснуть надолго, с другой стороны крепко обнял подушку и прижался к ней щекой; но вдруг вскочил, сел на диван и открыл глаза.</p>
+<p>«Да, да, как это было?&#160;— думал он, вспоминая сон.&#160;— Да,
+как это было? Да! Алабин давал обед в Дармштадте; нет, не в
+Дармштадте, а что-то американское. Да, но там Дармштадт был в
+Америке. Да, Алабин давал обед на стеклянных столах, да,&#160;— и
+столы пели: <span lang="it">Il mio tesoro</span>, и
+не <span lang="it">Il mio tesoro</span>, а что-то лучше, и какие-то
+маленькие графинчики, и они же женщины»,&#160;— вспоминал он.</p>
+
+<p>Глаза Степана Аркадьича весело заблестели, и он задумался, улыбаясь. «Да, хорошо было, очень хорошо. Много еще что-то там было отличного, да не скажешь словами и мыслями даже наяву не выразишь». И, заметив полосу света, пробившуюся сбоку одной из суконных стор, он весело скинул ноги с дивана, отыскал ими шитые женой (подарок ко дню рождения в прошлом году), обделанные в золотистый сафьян туфли и по старой, девятилетней привычке, не вставая, потянулся рукой к тому месту, где в спальне у него висел халат. И тут он вспомнил вдруг, как и почему он спит не в спальне жены, а в кабинете; улыбка исчезла с его лица, он сморщил лоб.</p>
+<p>«Ах, ах, ах! Ааа!..»&#160;— замычал он, вспоминая все, что было. И его воображению представились опять все подробности ссоры с женою, вся безвыходность его положения и мучительнее всего собственная вина его.</p>
+<p>«Да! она не простит и не может простить. И всего ужаснее то, что виной всему я, виной я, а не виноват. В этом-то вся драма,&#160;— думал он.&#160;— Ах, ах, ах!»&#160;— приговаривал он с отчаянием, вспоминая самые тяжелые для себя впечатления из этой ссоры.</p>
+<p>Неприятнее всего была та первая минута, когда он, вернувшись из театра, веселым и довольным, с огромною грушей для жены в руке, не нашел жены в гостиной; к удивлению, не нашел ее и в кабинете и, наконец, увидал ее в спальне с несчастною, открывшею все, запиской в руке.</p>
+<p>Она, эта вечно озабоченная, и хлопотливая, и недалекая, какою он считал ее, Долли, неподвижно сидела с запиской в руке и с выражением ужаса, отчаяния и гнева смотрела на него.</p>
+<p>— Что это? это?&#160;— спрашивала она, указывая на записку.</p>
+
+<p>И при этом воспоминании, как это часто бывает, мучало Степана Аркадьича не столько самое событие, сколько то, как он ответил на эти слова жены.</p>
+<p>С ним случилось в эту минуту то, что случается с людьми, когда они неожиданно уличены в чем-нибудь слишком постыдном. Он не сумел приготовить свое лицо к тому положению, в которое он становился пред женой после открытия его вины. Вместо того чтоб оскорбиться, отрекаться, оправдываться, просить прощения, оставаться даже равнодушным&#160;— все было бы лучше того, что он сделал!&#160;— его лицо совершенно невольно («рефлексы головного мозга»,&#160;— подумал Степан Аркадьич, который любил физиологию), совершенно невольно вдруг улыбнулось привычною, доброю и потому глупою улыбкой.</p>
+<p>Эту глупую улыбку он не мог простить себе. Увидав эту улыбку, Долли вздрогнула, как от физической боли, разразилась, со свойственною ей горячностью, потоком жестоких слов и выбежала из комнаты. С тех пор она не хотела видеть мужа.</p>
+<p>«Всему виной эта глупая улыбка»,&#160;— думал Степан Аркадьич.</p>
+<p>«Но что ж делать? что ж делать?»&#160;— с отчаянием говорил он себе и не находил ответа.</p>
+</div>