Странная проблема с NSImage -lockFocusFlipped: - PullRequest
0 голосов
/ 19 марта 2011

Я использую NSImage метод -lockFocusFlipped:, чтобы сделать рисунок в изображении. Мой код выглядит так:

NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(256, 256)];
[image lockFocusFlipped:YES];
NSShadow *shadow = [[NSShadow alloc] init];
[shadow setShadowColor:[NSColor blackColor]];
[shadow setShadowBlurRadius:6.0];
[shadow setShadowOffset:NSMakeSize(0, 3)];
[shadow set];
NSRect shapeRect = NSMakeRect(0, 0, 256, 100);
[[NSColor redColor] set];
NSRectFill(shapeRect);
[image unlockFocus];

Этот код работает до определенной точки. Я могу подтвердить, что контекст действительно перевернут, потому что [[NSGraphicsContext currentContext] isFlipped] возвращает YES, а также потому, что shapeRect рисуется в правильном положении (используя верхний левый угол в качестве источника). Тем не менее, NSShadow, похоже, не учитывает перевернутый статус контекста. Установка смещения тени на (0, 3) должна переместить тень вниз , когда контекст перевернут, но он фактически переместит его вверх (что происходит в стандартном неперевернутом контексте ).

Эта проблема кажется специфичной для -lockFocusFlipped, потому что, когда я рисую, используя этот же код в CALayer с перевернутой системой координат, тень рисуется очень хорошо (с учетом переворота). Документация по -lockFocusFlipped также кажется довольно расплывчатой. Это все, что сказано в документации NSImage класса:

Подготавливает изображение для получения команд рисования с использованием указанного перевернутого состояния.

И я также нашел это примечание в Замечаниях по выпуску Snow Leopard AppKit :

В некоторых случаях, например, при рисовании напрямую через NSLayoutManager, требуется перевернутый контекст. Чтобы покрыть этот случай, мы добавляем

- (void)lockFocusFlipped:(BOOL)flipped;

Это не изменяет состояние самого изображения, а только контекст, на котором заблокирован фокус. Это означает, что (0,0) вверху слева и положительное по оси Y внизу в заблокированном контексте.

Ни один из документов, по-видимому, не объясняет поведение NSShadow в этом случае. И при дальнейшем тестировании кажется, что NSGradient, похоже, не учитывает перевернутое состояние контекста рисования, используемого NSImage.

Любое понимание высоко ценится: -)

1 Ответ

0 голосов
/ 20 марта 2011

Из справочника NSShadow :

Тени всегда рисуются в пользовательском координатном пространстве по умолчанию, независимо от любых преобразований, примененных к этому пространству.Это означает, что повороты, переводы и другие преобразования текущей матрицы преобразования (CTM) не влияют на результирующую тень.

И вот что в конечном итоге переворачивает: Переведите вверх, уменьшите масштабДругой способ.

Для NSGradient такого заявления нет, поэтому я бы предложил подать ошибку об этом.

...