Mac OS X: рисование в закадровом NSGraphicsContext с использованием функций C CGContextRef не имеет никакого эффекта. Почему?

Mac OS X 10.7.4

я рисую в контексте закадровой графики, созданном с помощью +[NSGraphicsContext graphicsContextWithBitmapImageRep:].

Когда я рисую в этом графическом контексте, используякласс NSBezierPath, все работает, как и ожидалось.

Однако, когда я рисую в этом графическом контексте, используяCGContextRefC-функции, я не вижу результатов моего рисования. Ничего не работает.

По причинам, в которые я не буду вдаваться, мне действительно нужно рисовать, используя функции CGContextRef(а не класс Cocoa NSBezierPath).

Мой пример кода приведен ниже. Я пытаюсь нарисовать простой «X». Один штрих с использованием NSBezierPath, один штрих с использованием CGContextRefC-функций. Первый ход работает, второй нет. Что я делаю неправильно?

NSRect imgRect = NSMakeRect(0.0, 0.0, 100.0, 100.0);
NSSize imgSize = imgRect.size;

NSBitmapImageRep *offscreenRep = [[[NSBitmapImageRep alloc]
   initWithBitmapDataPlanes:NULL
   pixelsWide:imgSize.width
   pixelsHigh:imgSize.height
   bitsPerSample:8
   samplesPerPixel:4
   hasAlpha:YES
   isPlanar:NO
   colorSpaceName:NSDeviceRGBColorSpace
   bitmapFormat:NSAlphaFirstBitmapFormat
   bytesPerRow:0
   bitsPerPixel:0] autorelease];

// set offscreen context
NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep];
[NSGraphicsContext setCurrentContext:g];

NSImage *img = [[[NSImage alloc] initWithSize:imgSize] autorelease];

CGContextRef ctx = [g graphicsPort];

// lock and draw
[img lockFocus];

// draw first stroke with Cocoa. this works!
NSPoint p1 = NSMakePoint(NSMaxX(imgRect), NSMinY(imgRect));
NSPoint p2 = NSMakePoint(NSMinX(imgRect), NSMaxY(imgRect));
[NSBezierPath strokeLineFromPoint:p1 toPoint:p2];

// draw second stroke with Core Graphics. This doesn't work!
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, 0.0, 0.0);
CGContextAddLineToPoint(ctx, imgSize.width, imgSize.height);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);

[img unlockFocus];
6
задан Todd Ditchendorf 16 May 2012 в 22:53
поделиться