Timeline: define better internal zoom-out limit

The value used previously was too conservative, and prevented ZommWindow
from zooming out to the complete Time domain. This was due to missing the
Time::SCALE denominator, which increaded the limit by factor 1e6

In fact the code is able to handle even this extremely reduced limit,
but doing so seems over the top, since now detox() kicks in on several
calculations, leading to rather coarse grained errors.

Thus I decided to use a compromise: lower the limit only by factor 1000;
with typical screen pixel widths, we can reach the full time domain,
while most scaling and zoom calculations can be performed precisely,
without detox() kicking in. Obviously this change requires adjusting
a lot of the test case expectations, since we can now zoom out maximally.
This commit is contained in:
Fischlurch 2022-12-10 04:26:22 +01:00
parent 40f003a962
commit c31522c236
5 changed files with 197 additions and 40 deletions

View file

@ -185,7 +185,7 @@ namespace util {
f128 frac = f128(r) / den;
int64_t res = d*u + int64_t(frac*u * ROUND_ULP);
ENSURE (abs (f128(res)/u - rational_cast<f128>(Rat{num,den})) <= 1.0/abs(u)
,"Requantisation error exceeded num=%lu / den=%lu -> res=%lu / quant=%lu"
,"Requantisation error exceeded num=%li / den=%li -> res=%li / quant=%li"
, num, den, res, u);
return res;
}

View file

@ -475,7 +475,6 @@ namespace time {
: Duration{Offset{timeSpec}}
{ }
explicit
Duration (FSecs const& timeSpan_in_secs)
: Duration{Offset{timeSpan_in_secs}}
{ }

View file

@ -706,13 +706,14 @@ namespace model {
return px1 + px2 + pxr;
}
/** window size beyond that limit would yield
* numerically dangerous zoom factors */
/** window size beyond that limit would lead to
* numerically dangerous zoom factors (pixel/duration) */
static FSecs
maxSaneWinExtension (uint pxWidth)
{
return FSecs{LIM_HAZARD * pxWidth, Time::SCALE};
}
return min (FSecs{LIM_HAZARD * pxWidth, 1000}, MAX_TIMESPAN);
} // Note: denominator 1000 is additional safety margin
// wouldn't be necessary, but makes detox(largeTime) more precise
static Rat
establishMetric (uint pxWidth, Time startWin, Time afterWin)
@ -763,13 +764,13 @@ namespace model {
dur = min (dur, MAX_TIMESPAN);
dur = max (dur, MICRO_TICK); // prevent window going void
dur = detox (dur); // prevent integer wrap in time conversion
TimeVar timeDur{dur};
TimeVar timeDur{Duration{dur}};
// prefer bias towards increased window instead of increased metric
if (not isMicroGridAligned (dur))
timeDur = timeDur + TimeValue(1);
// resize window relative to anchor point
placeWindowRelativeToAnchor (dur);
establishWindowDuration (timeDur);
establishWindowDuration (Duration{timeDur});
// re-check metric to maintain precise pxWidth
px_per_sec_ = conformMetricToWindow (pxWidth);
ENSURE (_FSecs(afterWin_-startWin_) < MAX_TIMESPAN);
@ -799,7 +800,7 @@ namespace model {
conformWindowToCanvas()
{
FSecs dur{afterWin_-startWin_};
REQUIRE (dur < MAX_TIMESPAN);
REQUIRE (dur <= MAX_TIMESPAN);
REQUIRE (Time::MIN <= startWin_);
REQUIRE (afterWin_ <= Time::MAX);
startAll_ = max (startAll_, Time::MIN);
@ -989,7 +990,7 @@ namespace model {
}
void
establishWindowDuration (TimeVar duration)
establishWindowDuration (Duration duration)
{
if (startWin_<= Time::MAX - duration)
afterWin_ = startWin_ + duration;

View file

@ -696,60 +696,65 @@ namespace test {
win.setMetric (bruteZoom); // zoom out beyond what is possible and to a toxic factor
CHECK (_raw(win.overallSpan().duration()) == 614891469123651720); // canvas size not changed
CHECK (_raw(win.visible().duration()) == 3298534883328); // window was expanded,
CHECK (_raw(win.visible().duration()) == 3298534883328000); // window was expanded,
CHECK (_raw(win.visible().duration()) < int64_t{1}<<60 ); // ...but not as much as demanded
CHECK (_raw(win.visible().duration()) == 3 * LIM_HAZARD); // In fact it was capped at a built-in limit based on pixel size,
CHECK (_raw(win.visible().duration()) == 3* LIM_HAZARD*1000); // In fact it was capped at a built-in limit based on pixel size,
// to prevent formation of dangerous numbers within metric calculations
CHECK (win.visible().start() == - win.visible().end()); // window has been expanded symmetrically to existing position
CHECK (win.px_per_sec() > bruteZoom); // the actual zoom factor also reflects the applied limitation,
CHECK (win.px_per_sec() == 15625_r/17179869184); // to ensure the denominator does not exceed LIM_HAZARD
CHECK (win.px_per_sec() == 1000000_r/LIM_HAZARD);
CHECK (win.px_per_sec() == 125_r/137438953472); // to ensure the denominator does not exceed LIM_HAZARD
CHECK (win.px_per_sec() == 1000_r/LIM_HAZARD);
CHECK (win.px_per_sec() == 3 / _FSecs(win.visible().duration())); // and this value also conforms with the pixel size and window duration
CHECK (win.pxWidth() == 3);
/*--Test-3-----------*/
win.setMetric (5_r/std::numeric_limits<int64_t>::max()); // same limiting applies to even more nasty values
CHECK (_raw(win.visible().duration()) == 3298534883328); // still unchanged at limit
CHECK (win.px_per_sec() == 15625_r/17179869184);
CHECK (_raw(win.visible().duration()) == 3298534883328000); // still unchanged at limit
CHECK (win.px_per_sec() == 125_r/137438953472);
CHECK (win.pxWidth() == 3);
/*--Test-4-----------*/
win.setMetric (1000001_r/LIM_HAZARD); // but zooming in more than that limit will be honored
CHECK (_raw(win.visible().duration()) == 3298531584796); // ...window now slightly reduced in size
CHECK (_raw(win.visible().duration()) < 3 * LIM_HAZARD);
CHECK (win.px_per_sec() = 750000_r/824632896199); // ...yet effective zoom factor was still marginally adjusted for safety
CHECK (win.px_per_sec() > 1000000_r/LIM_HAZARD);
CHECK (win.px_per_sec() > 1000001_r/LIM_HAZARD); // (this is what was requested)
CHECK (win.px_per_sec() < 1000002_r/LIM_HAZARD); // (thus result was slightly adjusted upwards)
win.setMetric (1001_r/LIM_HAZARD); // but zooming in more than that limit will be honored
CHECK (_raw(win.visible().duration()) == 3295239643684000); // ...window now slightly reduced in size
CHECK (_raw(win.visible().duration()) < 3 * LIM_HAZARD*1000);
CHECK (win.px_per_sec() == 750_r/823809910921); // ...yet effective zoom factor was still marginally adjusted for safety
CHECK (win.px_per_sec() > 1000_r/LIM_HAZARD);
CHECK (win.px_per_sec() > 1001_r/LIM_HAZARD); // (this is what was requested)
CHECK (win.px_per_sec() < 1002_r/LIM_HAZARD); // (thus result was slightly adjusted upwards)
CHECK (win.pxWidth() == 3);
/*--Test-5-----------*/
win.calibrateExtension (1'000'000'000); // implicit drastic zoom-out by increasing the number of pixels
CHECK (win.pxWidth() < 1'000'000'000); // however: this number is capped at a fixed maximum
CHECK (win.pxWidth() == MAX_PX_WIDTH); // (which „should be enough“ for the time being...)
CHECK (win.px_per_sec() == 508631_r/559239974093); // the zoom metric has been adapted, but to a sanitised value
CHECK (win.px_per_sec() == 16062_r/98763149723); // the zoom metric has been adapted, but to a sanitised value
CHECK (_raw(win.overallSpan().duration()) == 614891469123651720); // overall canvas duration not changed
CHECK (_raw(win.visible().duration()) == 109951052826533333); // window duration now drastically increased
CHECK (win.overallSpan().end() == TimeValue{307445734561825860}); // window is somewhere within canvas
CHECK (win.visible().end() == TimeValue{109949403560740935}); // but was expanded to the right,
CHECK (win.visible().start() == TimeValue{ -1649265792398}); // ... retaining the start value
CHECK (_raw(win.overallSpan().duration()) == 614891469123651720); // overall canvas duration not changed
CHECK (_raw(win.visible().duration()) == 614891469123651720); // window duration now expanded to the maximum possible value
CHECK (win.overallSpan().end() == TimeValue{ 307445734561825860}); // window now spans the complete time domain
CHECK (win.visible().end() == TimeValue{ 307445734561825860});
CHECK (win.visible().start() == TimeValue{-307445734561825860});
// Note: these parameters build up to really »poisonous« values....
CHECK (MAX_PX_WIDTH / _FSecs(win.visible().duration()) == 100000000000_r/109951052826533333);
CHECK (MAX_PX_WIDTH / _FSecs(win.visible().duration()) == 2500000000_r/15372286728091293);
CHECK (MAX_PX_WIDTH * 1000000_r/614891469123651720 == 2500000000_r/15372286728091293);
CHECK (win.px_per_sec() * _FSecs(win.visible().duration()) < 0); // we can't even calculate the resulting pxWidth() naively
CHECK (rational_cast<float>(win.px_per_sec()) // ...while effectively these values are still correct
* rational_cast<float>(_FSecs(win.visible().duration())) == 100000.914f);
CHECK (rational_cast<float>(100000000000_r/109951052826533333) == 9.09495611e-07f); // theoretical value
CHECK (rational_cast<float>(win.px_per_sec()) == 9.09503967e-07f); // value actually chosen
CHECK (win.px_per_sec() == 508631_r/559239974093);
* rational_cast<float>(_FSecs(win.visible().duration())) == 100000.727f);
CHECK (rational_cast<float>(MAX_PX_WIDTH*1000000_r/614891469123651720) == 1.62630329e-07f); // theoretical value
CHECK (rational_cast<float>(win.px_per_sec()) == 1.62631508e-07f); // value actually chosen
CHECK (win.px_per_sec() == 16062_r/98763149723);
/*--Test-6-----------*/
win.setMetric (bruteZoom); // And now put one on top by requesting excessive zoom-out:
CHECK (_raw(win.overallSpan().duration()) == 614891469123651720); // overall canvas duration not changed
CHECK (_raw(win.visible().duration()) == 109951162777600000); // window duration only slightly increased
CHECK (508631_r/559239974093 > 15625_r/17179869184); // zoom factor slightly reduced
CHECK (win.px_per_sec() == 15625_r/17179869184); // and now hitting again the minimum limit
SHOW_EXPR(_raw(win.overallSpan().duration()))
SHOW_EXPR(_raw(win.visible().duration()))
CHECK (_raw(win.visible().duration()) == 614891469123640625); // window duration was slightly decreased -- WHY?? (TODO)
CHECK (16062_r/98763149723 > 200000_r/1229782938247); // zoom factor numerically slightly reduced
SHOW_EXPR(win.px_per_sec())
CHECK (win.px_per_sec() == 200000_r/1229782938247); // and now hitting again the minimum limit
SHOW_EXPR(MAX_PX_WIDTH /(614891469123651720_r/1000000))
CHECK (win.pxWidth() == MAX_PX_WIDTH); // pixel count unchanged at maximum
}

View file

@ -40522,21 +40522,173 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1670620383399" ID="ID_674544235" MODIFIED="1670620401994" TEXT="h&#xe4;tte Zoom auf gesamten Canvas erwartet">
<node COLOR="#435e98" CREATED="1670620383399" ID="ID_674544235" MODIFIED="1670642115198" TEXT="h&#xe4;tte Zoom auf gesamten Canvas erwartet">
<icon BUILTIN="yes"/>
<node CREATED="1670620405080" ID="ID_1202192964" MODIFIED="1670620418967" TEXT="...nachdem jetzt die Zahl der Pixel so drastisch erh&#xf6;ht wurde"/>
<node CREATED="1670621505792" ID="ID_645635162" MODIFIED="1670621528305" TEXT="aber der definierte Grenzfaktor verhindert das">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1670621532941" ID="ID_1641685049" MODIFIED="1670621550148" TEXT="ist der Grenzfaktor korrekt berechnet?">
<node COLOR="#435e98" CREATED="1670621532941" ID="ID_1641685049" MODIFIED="1670641908692" TEXT="ist der Grenzfaktor korrekt berechnet?">
<icon BUILTIN="help"/>
<node CREATED="1670621551706" ID="ID_804263127" MODIFIED="1670621631745" TEXT="konzeptionell hatte ich etwas Anderes in Erinnerung">
<arrowlink COLOR="#6ca8d7" DESTINATION="ID_735928158" ENDARROW="Default" ENDINCLINATION="-761;71;" ID="Arrow_ID_907454112" STARTARROW="None" STARTINCLINATION="1521;-73;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1670623877667" ID="ID_1836625419" MODIFIED="1670623900060" TEXT="m&#xf6;glicherweise genau um Time::SCALE zu klein?">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1670623877667" ID="ID_1836625419" MODIFIED="1670641911673" TEXT="m&#xf6;glicherweise genau um Time::SCALE zu klein?">
<icon BUILTIN="idea"/>
<node CREATED="1670629795767" ID="ID_1040393126" MODIFIED="1670629827889" TEXT="der Nenner Time::SCALE ist n&#xe4;mlich in dem Fall harmlos (da pxWidth limitiert ist)"/>
<node CREATED="1670629829067" ID="ID_1784755741" MODIFIED="1670629843428" TEXT="aber er macht das Ergebnis um den Fakror 1Mio gr&#xf6;&#xdf;er"/>
<node CREATED="1670629845864" ID="ID_1290369344" MODIFIED="1670629860659" TEXT="und limitiert genau dadurch den minimalen Zoom"/>
<node CREATED="1670629897993" ID="ID_652419307" MODIFIED="1670629969742" TEXT="1 / LIM_HAZARD w&#xe4;re das Extremum">
<arrowlink COLOR="#549dd2" DESTINATION="ID_1085901724" ENDARROW="Default" ENDINCLINATION="53;-82;" ID="Arrow_ID_292029179" STARTARROW="None" STARTINCLINATION="-212;16;"/>
<icon BUILTIN="forward"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1670629923629" ID="ID_1085901724" MODIFIED="1670641895675" TEXT="versuchen, das Limit um 1e-6 abzusenken">
<linktarget COLOR="#549dd2" DESTINATION="ID_1085901724" ENDARROW="Default" ENDINCLINATION="53;-82;" ID="Arrow_ID_292029179" SOURCE="ID_652419307" STARTARROW="None" STARTINCLINATION="-212;16;"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="button_cancel"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1670629990253" ID="ID_1122755361" MODIFIED="1670629998128" TEXT="ENSURE_matchesExpectedPixWidth scheitert">
<icon BUILTIN="broken-line"/>
<node CREATED="1670629999164" ID="ID_1312554244" MODIFIED="1670630059800" TEXT="und zwar mit interessanten (realistischen) Werten">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
ZoomWindow: established size or metric misses expectation by more than 1px. 3px != 0.279620 expected pixel.
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#435e98" CREATED="1670631017435" ID="ID_1279940239" MODIFIED="1670634674575" TEXT="Beobachtung">
<icon BUILTIN="info"/>
<node CREATED="1670634343385" ID="ID_284249821" MODIFIED="1670634414906" TEXT="detox(changedMetric) macht nix">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
da die Metrik ja limitiert wurde und damit per definitionem auch sauber
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1670631027193" ID="ID_1715093187" MODIFIED="1670631034852" TEXT="dur = 3* LIM_HAZARD"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1670631036152" ID="ID_824462335" MODIFIED="1670634653392" TEXT="ist gr&#xf6;&#xdf;er als MAX_TIMESPAN und wird limitiert">
<linktarget COLOR="#de3b4d" DESTINATION="ID_824462335" ENDARROW="Default" ENDINCLINATION="507;0;" ID="Arrow_ID_79951922" SOURCE="ID_1912544646" STARTARROW="Default" STARTINCLINATION="507;0;"/>
<icon BUILTIN="clanbomber"/>
</node>
<node CREATED="1670631144522" ID="ID_1178539358" MODIFIED="1670631160644" TEXT="detox(dur) l&#xe4;uft dann in das untere Limit f&#xfc;r den quantiser = 64"/>
<node CREATED="1670631354782" ID="ID_1215630500" MODIFIED="1670633662153" TEXT="der Fehler dadurch ist kleiner als 1 sec und relativ irre klein (1e-14)"/>
<node COLOR="#435e98" CREATED="1670631820765" ID="ID_1612035545" MODIFIED="1670632327145" TEXT="aber TimeVar limitiert">
<icon BUILTIN="broken-line"/>
<node CREATED="1670631831417" ID="ID_1807731566" MODIFIED="1670631837782" TEXT="umgewandelter Wert: 614891469123640625"/>
<node CREATED="1670631861403" ID="ID_1701766180" MODIFIED="1670631953102" TEXT="theoretischer Wert: 614891469123651720"/>
<node CREATED="1670631996436" ID="ID_327677153" MODIFIED="1670632023685" TEXT="limitierter Zeitpunkt: 307445734561825860"/>
<node COLOR="#338800" CREATED="1670632336743" ID="ID_769313456" MODIFIED="1670632349302" TEXT="Fix: Umwandlung &#xfc;ber Duration(FSecs)">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1670633143989" ID="ID_1654804140" MODIFIED="1670633155150" TEXT="conformWindowToMetric(3px)">
<node CREATED="1670633164402" ID="ID_208283454" MODIFIED="1670633165812" TEXT="Rat adjMetric = detox (Rat(pxWidth) / dur);"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1670633167112" ID="ID_404249260" MODIFIED="1670633316053" TEXT="detox() f&#xfc;hrt hier einen starken Fehler ein">
<icon BUILTIN="broken-line"/>
<node CREATED="1670633198943" ID="ID_1237559681" MODIFIED="1670633230283" TEXT="vorher: 192/39353054023913"/>
<node CREATED="1670633202891" ID="ID_34394013" MODIFIED="1670633262719" TEXT="nachher: 5/1229782938247"/>
<node CREATED="1670633305726" ID="ID_841098021" MODIFIED="1670633311104" TEXT="16% Fehler"/>
<node CREATED="1670633355551" ID="ID_86750972" MODIFIED="1670633370881" TEXT="Grund: der kleine Z&#xe4;hler wegen kleiner Pixelzahl"/>
</node>
<node CREATED="1670633496181" ID="ID_1991750411" MODIFIED="1670633509494" TEXT="nachjustierte Metrik">
<node CREATED="1670633510314" ID="ID_474285004" MODIFIED="1670633512214" TEXT="6/1229782938247"/>
<node CREATED="1670633548900" ID="ID_1038736733" MODIFIED="1670633568254" TEXT="viel n&#xe4;her am Wert vor detox()"/>
<node CREATED="1670633579125" ID="ID_330672165" MODIFIED="1670633590883" TEXT="Fehlerfaktor: nur noch 1e-13"/>
</node>
</node>
<node CREATED="1670634446738" ID="ID_335582946" MODIFIED="1670634451077" TEXT="Gesamtresultat">
<node CREATED="1670634452282" ID="ID_695823259" MODIFIED="1670634564479" TEXT="geforderte Metrik: 1/1099511627776 = 9.09e-13"/>
<node CREATED="1670634484934" ID="ID_186085154" MODIFIED="1670634549193" TEXT="resultiernde Metrik: 6/1229782938247 = 1.87e-12"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1670634566275" ID="ID_16315489" MODIFIED="1670634586577" TEXT="das ist nat&#xfc;rlich viel zu weit weg">
<icon BUILTIN="stop-sign"/>
<node CREATED="1670634593967" ID="ID_213992089" MODIFIED="1670634599258" TEXT="Fehler 430%"/>
<node CREATED="1670634622307" ID="ID_1912544646" MODIFIED="1670634640149" TEXT="Grund ist aber kein Rechenfehler....">
<arrowlink COLOR="#de3b4d" DESTINATION="ID_824462335" ENDARROW="Default" ENDINCLINATION="507;0;" ID="Arrow_ID_79951922" STARTARROW="Default" STARTINCLINATION="507;0;"/>
</node>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1670634676452" ID="ID_829552595" MODIFIED="1670642079860">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<b>Grund</b>&#160;sind die expliziten <i>Limitierungen </i>in dieser Funktion
</p>
</body>
</html></richcontent>
<linktarget COLOR="#6d669c" DESTINATION="ID_829552595" ENDARROW="Default" ENDINCLINATION="299;14;" ID="Arrow_ID_166387953" SOURCE="ID_1376379301" STARTARROW="None" STARTINCLINATION="107;-4;"/>
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1670635244880" ID="ID_873866162" MODIFIED="1670635272173" TEXT="nicht klar ob man diese Assertion aufrecht erhalten kann">
<icon BUILTIN="help"/>
</node>
</node>
<node CREATED="1670634800459" ID="ID_1764699375" MODIFIED="1670634819881" TEXT="abgesehen davon w&#xfc;rde die Rechnung sogar mit diesen extremen Werten funktionieren">
<icon BUILTIN="idea"/>
<node CREATED="1670634821458" ID="ID_343578534" MODIFIED="1670634835363" TEXT="das liegt vor allem an dem Nachjustieren per Newton"/>
<node CREATED="1670634842378" ID="ID_1192611860" MODIFIED="1670635459431" TEXT="detox() w&#xfc;rde hier wegen dem kleinen Z&#xe4;hler schon zu extremen Fehlern f&#xfc;hren">
<arrowlink COLOR="#f9ffa8" DESTINATION="ID_1107044319" ENDARROW="Default" ENDINCLINATION="291;11;" ID="Arrow_ID_1783361555" STARTARROW="None" STARTINCLINATION="-36;103;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1670635294357" ID="ID_1940319351" MODIFIED="1670642085976" TEXT="Kompromi&#xdf;: Faktor 1000">
<icon BUILTIN="button_ok"/>
<node CREATED="1670635326013" ID="ID_1487818131" MODIFIED="1670635342383" TEXT="liegt zwischen den ausgetesteten Grenzen"/>
<node CREATED="1670635343499" ID="ID_641939740" MODIFIED="1670635360580" TEXT="w&#xe4;re immer noch grade ausreichend gro&#xdf;">
<node CREATED="1670635361856" ID="ID_1028559962" MODIFIED="1670635368331" TEXT="wenige Pixel: beschr&#xe4;nkte Dom&#xe4;ne"/>
<node CREATED="1670635369111" ID="ID_733591685" MODIFIED="1670635384681" TEXT="1000 Pixel : kann ganze Zeitdom&#xe4;ne darstellen"/>
</node>
<node CREATED="1670635388270" ID="ID_1107044319" MODIFIED="1670635464001" TEXT="Abstand vom Quantisierer 1000 mal gr&#xf6;&#xdf;er &#x27f9; detox() arbeitet geschmeidiger">
<linktarget COLOR="#f9ffa8" DESTINATION="ID_1107044319" ENDARROW="Default" ENDINCLINATION="291;11;" ID="Arrow_ID_1783361555" SOURCE="ID_1192611860" STARTARROW="None" STARTINCLINATION="-36;103;"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1670638029954" ID="ID_1190734639" MODIFIED="1670638077699" TEXT="maxSaneWindowExtension(MAX_PX_WIDTH) wird zu gro&#xdf;">
<icon BUILTIN="broken-line"/>
<node CREATED="1670638079529" ID="ID_1748017185" MODIFIED="1670638086064" TEXT="als FSecs noch darstellbar"/>
<node CREATED="1670638086722" ID="ID_1899582755" MODIFIED="1670638102317" TEXT="aber die Umwandlung in TimeValue scheitert"/>
</node>
<node COLOR="#338800" CREATED="1670641927167" ID="ID_623913340" MODIFIED="1670641959044" TEXT="direkt hier die Limitierung auf MAX_TIMESPAN">
<icon BUILTIN="button_ok"/>
<node CREATED="1670641960810" ID="ID_1647554495" MODIFIED="1670641975196" TEXT="damit gef&#xe4;hrliche Werte &#xfc;berhaupt nirgends mehr in die Rechnung kommen"/>
<node CREATED="1670641975904" ID="ID_977206807" MODIFIED="1670641988890" TEXT="sollte sich unter dem Strich genauso verhalten (wie wenn wir sp&#xe4;ter limitieren)"/>
<node CREATED="1670641992206" ID="ID_1376379301" MODIFIED="1670642079860" TEXT="das Problem mit der nachtr&#xe4;glichen Domain-Beschr&#xe4;nkung ist &#x201e;unter den Teppich gekehrt&#x201c;">
<arrowlink COLOR="#6d669c" DESTINATION="ID_829552595" ENDARROW="Default" ENDINCLINATION="299;14;" ID="Arrow_ID_166387953" STARTARROW="None" STARTINCLINATION="107;-4;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#338800" CREATED="1670642102191" ID="ID_1301915764" MODIFIED="1670642109934" TEXT="nun geht der Zoom auf den ganzen Canvas">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1670642126767" ID="ID_235330604" MODIFIED="1670642131347" TEXT="Testdaten anpassen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1670642140314" ID="ID_846585763" MODIFIED="1670642165125" TEXT="bruteZoom verh&#xe4;lt sich aber sonderbar">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1670642186191" ID="ID_1230929067" MODIFIED="1670642222176" TEXT="Fenster vorher auf Max">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1670642203289" ID="ID_415548658" MODIFIED="1670642219593" TEXT="danach Fenster minimal verkleinert">
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>