Autor Téma: High-DPI TImageList  (Přečteno 1003 krát)

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 762
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
High-DPI TImageList
« kdy: 11-01-2018, 15:10:19 »
Excellent
Rated 1 time
Poslední tři dny jsem pracoval na posledním dílu High-DPI skládačky - TImageListu.

Popis: https://bugs.freepascal.org/view.php?id=32967
SVN-branch: https://svn.freepascal.org/svn/lazarus/branches/HiDPIImageList

TImageList teď umí uložit obrázky v různých rozlišeních a komponenty je automaticky dostanou. Programátor se nemusí o nic starat. Když je potřeba rozlišení, které není k dispozici, automaticky se vygeneruje - a pozor, pomocí Mitchelovi interpolace a s podporou alpha-transparence, takže se na to dá i koukat.

+ Dmitry začal pracovat na Cocoa interface (Sphere 10 Software to podpřilo Bounty) - u nás to jede :) Jen škoda, že ta Lazarus foundation nějak nenaplnila očekávání...
« Poslední změna: 11-01-2018, 15:16:55 od Ondřej Pokorný »
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 762
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:High-DPI TImageList
« Odpověď #1 kdy: 11-01-2018, 15:15:13 »
A ještě screenshot ImageList editoru a demo aplikace pod Linuxem.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 398
  • Karma: 29
    • Verze Delphi: 10.2
Re:High-DPI TImageList
« Odpověď #2 kdy: 11-01-2018, 16:55:29 »
Kéž tohle fungovalo i v Delphi... Protože pořád nevím, jak obsloužit situaci, kdy má uživatel víc monitorů, každý jiné dpi, část oken na jednom monitoru, část na druhém...

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:High-DPI TImageList
« Odpověď #3 kdy: 11-01-2018, 18:07:30 »
Kéž tohle fungovalo i v Delphi... Protože pořád nevím, jak obsloužit situaci, kdy má uživatel víc monitorů, každý jiné dpi, část oken na jednom monitoru, část na druhém...

Pomoci udalosti OnBeforeMonitorDpiChanged a OnAfterMonitorDpiChanged vyvolanych pri zmene DPI formu (vcetne presunu na monitor s jinym DPI)? Image listu muzes mit vic, nebo je tvorit a plnit z resources za behu (zbytek je o volbe nejblizsi vhodne velikosti).
« Poslední změna: 11-01-2018, 18:13:53 od Delfin »
I'm a soldier, so don't panic!

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 762
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:High-DPI TImageList
« Odpověď #4 kdy: 12-01-2018, 05:08:42 »
Kéž tohle fungovalo i v Delphi...
Třeba si někdo u Embarcadera taky udělá tři dny čas a zapracuje na tom.

Citace
Protože pořád nevím, jak obsloužit situaci, kdy má uživatel víc monitorů, každý jiné dpi, část oken na jednom monitoru, část na druhém...

Jak psal Delphin - jedině synchronizovat více TImageListů a při změně rozlišení je přehazovat, popř. generovat nová rozlišení (a zvětšovat/zmenšovat komponenty) - což je vopruz :/ Lazarus/LCL se ti postará o všechno.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline ps

  • Mladík
  • **
  • Příspěvků: 56
  • Karma: 4
Re:High-DPI TImageList
« Odpověď #5 kdy: 14-01-2018, 21:05:37 »
Poslední tři dny jsem pracoval na posledním dílu High-DPI skládačky - TImageListu.
Super. Osobne imagelist nepoužívam, ale pozriem sa na implementáciu (používam font awesome). Otázka je ako upraviť komponentu aby reagovala na zmenu DPI? Napr. mám potomka TSpeedButton so štandartným Glyph (ktorý sa vygeneruje z toho fontu awesome) vo veľkosti 16 a presuniem form na druhý monitor(ako ináč samozrejme :) ) a potrebujem zmeniť veľkoosť Glyph zo 16 na povedzme 20. WMSIZE sa vôbec nezavolá, ani AdjustSize.

+ Dmitry začal pracovat na Cocoa interface (Sphere 10 Software to podpřilo Bounty) - u nás to jede :) Jen škoda, že ta Lazarus foundation nějak nenaplnila očekávání...

Videl som ,že robí Cocoa pekným tempom. Dúfam, že aj tieto ikony vyrieši, a asi spolu s nimi aj tento zásadný bug: https://bugs.freepascal.org/view.php?id=32816 , https://forum.lazarus.freepascal.org/index.php?topic=33215.0

Foundation nejak asi umrela, mohlo to byť celkom fajn. Dať tam nejaké mesačné platby ako má blender foundation a mohlo sa z toho zaplatiť pár programátorov ...
IDE: Delphi XE - Mobile, Lazarus - Desktop, OS:Win 10 ,Linux Mint

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:High-DPI TImageList
« Odpověď #6 kdy: 14-01-2018, 21:15:04 »
Super. Osobne imagelist nepoužívam, ale pozriem sa na implementáciu (používam font awesome). Otázka je ako upraviť komponentu aby reagovala na zmenu DPI? Napr. mám potomka TSpeedButton so štandartným Glyph (ktorý sa vygeneruje z toho fontu awesome) vo veľkosti 16 a presuniem form na druhý monitor(ako ináč samozrejme :) ) a potrebujem zmeniť veľkoosť Glyph zo 16 na povedzme 20. WMSIZE sa vôbec nezavolá, ani AdjustSize.

Zprava kterou na Windows platforme potrebujes odchytit je WM_DPICHANGED, ale je urcena oknu (formulari), ne potomkum (vizualnim komponentam), natoz pak potomku ktery nema handle. K tomu je jeste treba per monitor DPI awareness povolit.
« Poslední změna: 14-01-2018, 21:17:36 od Delfin »
I'm a soldier, so don't panic!

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:High-DPI TImageList
« Odpověď #7 kdy: 14-01-2018, 21:48:10 »
Excellent
Rated 1 time
Od Windows 10 muzes odchytit pro vizualni komponenty s handle zpravu WM_DPICHANGED_BEFOREPARENT. K tomu je treba per monitor DPI awareness v2.
I'm a soldier, so don't panic!

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 762
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:High-DPI TImageList
« Odpověď #8 kdy: 15-01-2018, 01:49:19 »
+ Dmitry začal pracovat na Cocoa interface (Sphere 10 Software to podpřilo Bounty) - u nás to jede :) Jen škoda, že ta Lazarus foundation nějak nenaplnila očekávání...

Videl som ,že robí Cocoa pekným tempom. Dúfam, že aj tieto ikony vyrieši, a asi spolu s nimi aj tento zásadný bug: https://bugs.freepascal.org/view.php?id=32816 , https://forum.lazarus.freepascal.org/index.php?topic=33215.0

Upřímně řečeno jsem ten bug report nepochopil. Vezmu bitmapu 32x32px a kreslím ji na rect 32x32px s retina faktorem 2.0 (t.j. ve výsledku 64x64px). Co jako očekáváte?
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 762
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:High-DPI TImageList
« Odpověď #9 kdy: 15-01-2018, 05:15:04 »
Otázka je ako upraviť komponentu aby reagovala na zmenu DPI? Napr. mám potomka TSpeedButton so štandartným Glyph (ktorý sa vygeneruje z toho fontu awesome) vo veľkosti 16 a presuniem form na druhý monitor(ako ináč samozrejme :) ) a potrebujem zmeniť veľkoosť Glyph zo 16 na povedzme 20. WMSIZE sa vôbec nezavolá, ani AdjustSize.

Viz http://wiki.lazarus.freepascal.org/High_DPI, "High DPI in Lazarus 1.8 and above" -> zavolá se AutoAdjustLayout/DoAutoAdjustLayout.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline ps

  • Mladík
  • **
  • Příspěvků: 56
  • Karma: 4
Re:High-DPI TImageList
« Odpověď #10 kdy: 15-01-2018, 07:11:43 »
Viz http://wiki.lazarus.freepascal.org/High_DPI, "High DPI in Lazarus 1.8 and above" -> zavolá se AutoAdjustLayout/DoAutoAdjustLayout.
Vďaka, už som si hovoril, že po večeroch to nebudem riešiť. Asi na to nevidím poriadne 100x som to čítal :)
IDE: Delphi XE - Mobile, Lazarus - Desktop, OS:Win 10 ,Linux Mint

Offline ps

  • Mladík
  • **
  • Příspěvků: 56
  • Karma: 4
Re:High-DPI TImageList
« Odpověď #11 kdy: 15-01-2018, 07:15:52 »
Upřímně řečeno jsem ten bug report nepochopil. Vezmu bitmapu 32x32px a kreslím ji na rect 32x32px s retina faktorem 2.0 (t.j. ve výsledku 64x64px). Co jako očekáváte?
Aby sa to správalo rovnako ako na inej platforme (Win) teda 32x32 kreslilo na 32x32, alebo aby sa to scalovalo aj na Win (asi horšia varianta) a na správne kreslenie by sa použila iná funkcia.
IDE: Delphi XE - Mobile, Lazarus - Desktop, OS:Win 10 ,Linux Mint

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 762
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:High-DPI TImageList
« Odpověď #12 kdy: 15-01-2018, 07:31:40 »
Upřímně řečeno jsem ten bug report nepochopil. Vezmu bitmapu 32x32px a kreslím ji na rect 32x32px s retina faktorem 2.0 (t.j. ve výsledku 64x64px). Co jako očekáváte?
Aby sa to správalo rovnako ako na inej platforme (Win) teda 32x32 kreslilo na 32x32, alebo aby sa to scalovalo aj na Win (asi horšia varianta) a na správne kreslenie by sa použila iná funkcia.

Mezi OSX a WIN je jeden zásadní rozdíl: a to ten, že Apple má virtuální rozlišení. T.j. 32x32 se kreslí na 32x32 a je to rozmazané. Jestli to nechceš mít rozmazané, musíš kreslit 64x64 na 32x32. S tím se nedá nic dělat.

TImageList to bude umět ošetřit (pokud rozezná retinu, vezme prostě vyšší rozlišení a nakreslí ho napolovic). Pokud používáš TSpeedButton.Glyph, máš smůlu. To se prostě vyřešit pořádně nedá. Kvůli tomu přidám právě do TSpeedButton a TBitBtn podporu image listu.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline ps

  • Mladík
  • **
  • Příspěvků: 56
  • Karma: 4
Re:High-DPI TImageList
« Odpověď #13 kdy: 15-01-2018, 07:43:37 »
Hmm tak to by takto šlo, teda keby ten stretchdraw fungoval. Glyph používam len ako storage (TBitmap), kreslím to samostatne. Nemám teraz mac k dispozícii, keď budem mať vyskúšam. A ScaleDesignToForm(32) mi vráti 64 na Retine? A cez Canvas.Line bude mať výšku povedzme 2 px namiesto 1px a nemám šancu inak ako cez bitmap nakresliť 1px čiaru? (Teda ak som to správne pochopil teraz).
IDE: Delphi XE - Mobile, Lazarus - Desktop, OS:Win 10 ,Linux Mint

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 762
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:High-DPI TImageList
« Odpověď #14 kdy: 15-01-2018, 07:52:37 »
Excellent
Rated 1 time
Hmm tak to by takto šlo, teda keby ten stretchdraw fungoval.

Sám si to vyzkouším až se vrátím domů (v únoru), ale od kluků z ScooterSoftware mám echo, že oni právě pro retinu používají StretchDraw.

Citace
Glyph používam len ako storage (TBitmap), kreslím to samostatne. Nemám teraz mac k dispozícii, keď budem mať vyskúšam. A ScaleDesignToForm(32) mi vráti 64 na Retine?

Právě že ne. Retina má tu virtuální matici. Takže OSX vrací vždycky 96 DPI = 100%. Pro zjištění retina faktoru musíš použít:

Kód: [Vybrat]
function UiIsRetina: Boolean;
begin
if CurrentOS = osMacOSX106 then
    Result := (BcNSScreen(NSScreen.mainScreen).userSpaceScaleFactor > 1.0)
else
    Result := (BcNSScreen(NSScreen.mainScreen).backingScaleFactor > 1.0)
end;

function TBcCarbonForm.GetIsRetina: Boolean;
var    Window: BcNSWindow;
begin
Window := BcNSWindow(GetWindowRefAsNSWindow);
if CurrentOS = osMacOSX106 then
    Result := (Window.userSpaceScaleFactor > 1.0)
else
    Result := (Window.backingScaleFactor > 1.0)
end;

Citace
A cez Canvas.Line bude mať výšku povedzme 2 px namiesto 1px a nemám šancu inak ako cez bitmap nakresliť 1px čiaru? (Teda ak som to správne pochopil teraz).

Jo, tak nějak by to mělo být.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: