2011-11-03 12 views
6

Używam QPainter::setRenderHint(QPainter::Antialiasing, true), aby powiedzieć Qt, że chcę, aby był on antyalisem dla dowolnego rysunku, który robię (w tym przypadku tekst narysowany za pomocą drawText()).QPainter :: rotate wyłącza wygładzanie narysowanego tekstu

To działa dobrze, a tekst wygląda dobrze, dopóki nie chcę obrócić mapy piksli, którą rysuję do np.

Painter.translate(0, height()); 
Painter.rotate(-90); 

(aby obrócić QPainter 90 stopni w lewo i doprowadzić go z powrotem do widzenia)

Wezwanie do rotate() wydaje się wyłączyć antyaliasing dla dowolnego tekstu sporządzonego - tekst jest rysowany na odpowiedniej rotacji ale bez antyaliasingu . Inne rzeczy wydają się nietknięte - np. drawLine() nadal rysuje ładnie wygładzoną linię.

Każdy pomysł, co robię źle?

EDYCJA: Nie jest zaskoczeniem, że dodanie tekstu do ścieżki i wypełnienie tej ścieżki daje mi tekst antyaliasowy, obrócony w rotację. Wolałbym jednak unikać tej trasy, jeśli to możliwe.

EDYCJA (ponownie): Próbowałem użyć QFont::setStyleStrategy(QFont::PreferAntialias) dla używanej czcionki, bez żadnego efektu. Jednak niektóre eksperymenty pokazują, że podstawowa czcionka, taka jak Arial, po obróceniu będzie generować tekst antyaliasingowy, podczas gdy moja niestandardowa czcionka (Swiss721 BlkCn BT dla każdego, kto jest zainteresowany) nie będzie. Co więcej, podczas gdy ten problem występuje w systemie Windows 7, nie mam tego samego problemu podczas uruchamiania systemu Ubuntu. This FAQ article wydaje się sugerować, że Qt sprawdza system operacyjny dla obsługi antyaliasingu czcionek, więc jakie problemy mogą mieć Windows w obsłudze renderowania tej konkretnej czcionki (która jest TrueType, podobnie jak Arial)?

EDYCJA (ostatni raz, obiecuję): Zwiększenie rozmiaru czcionki do 16 punktów lub więcej zabije problem. Wydaje się, że chodzi o renderowanie mojej konkretnej czcionki poniżej 16pkt - być może ma to coś wspólnego z tym, o czym wspomniano w powyższym artykule na blogu:

W przypadku czcionek Windows 2000 zwykle nie występuje antyaliasing w określonym zakresie (np. rozmiary 8-16), aby tekst był bardziej wyraźny i czytelny.

+0

Myślę, że mógłbym odpowiedzieć na moje własne pytanie tutaj, ale jeśli ktoś ma jakiekolwiek dalsze lub związane informacje, nadal byłbym bardzo zainteresowany. – sjwarner

Odpowiedz

2

ja faktycznie miał okazję być w tej części kodu Qt niedawno, i myślę, że zachowanie widzisz związana jest z dwóch następujących błędów w Qt:

Jeśli dobrze pamiętam (nie 100%), to na pewno widzisz utratę renderowania ClearType w systemie Windows. Po zastosowaniu transformacji, Qt pobiera piksele glifów w sposób, który wyrzuca informacje ClearType, dzięki czemu rzeczy wyglądają na bardziej postrzępione.

Jeśli chcesz samemu sprawdzić kod, najbardziej prawdopodobne miejsce to /src/gui/text/qfontengine_win.cpp. Możesz również spróbować wyłączyć ClearType i sprawdzić, czy wyglądają podobnie.

+1

To ma wiele sensu, Dave, dziękuję. Wyłączenie funkcji cleartype powoduje, że podczas obracania znaki są rysowane z identycznymi pikselami. [Wątek na forum] (http://forum.xda-developers.com/archive/index.php/t-280037.html) (szczególnie komentarze Ingvarr), a także [artykuł w Wikipedii] (http: // /en.wikipedia.org/wiki/Cleartype#How_ClearType_works) wyjaśnij, w jaki sposób podstawowa zasada, dzięki której działa ClearType, ogranicza ją do pracy tylko z tekstem poziomym. – sjwarner

0

Jedno "zgadnij" dotyczy Twojej RenderHint. Używasz tutaj QPainter::Antialiasing. Docu: "Wskazuje, że silnik powinien mieć krawędzie antialias prymitywów, jeśli to możliwe." Prymitywy takie jak linie, rects itp. Zamiast tego spróbuj QPainter::TextAntialiasing.

Uwaga: RenderHints są flagami, więc możesz bitować LUB je w razie potrzeby (i brzmi jak jest).

+0

Bez powodzenia Obawiam się, Robin, dzięki mimo to. – sjwarner