Mac App Store就像工具栏一样有噪音

时间:2012-01-07 00:29:10

标签: macos

我找到this great subclass of NSWindow,但它没有为工具栏的渐变添加任何噪音。如果你仔细观察App Store,Reeder或Twitter,它们都会在渐变上产生噪音。

如何为渐变添加噪点?

我发现了这个thread,但我不明白如何将其放入代码中。

1 个答案:

答案 0 :(得分:1)

首先,必须将代码添加到INAppStoreWindow中,因此我不再使用此用例了。然而,对于想要知道如何做到这一点的人来说,INAppStoreWindow是如何完成的。

首先创建一个使图像具有噪声的功能。

static CGImageRef createNoiseImageRef(NSUInteger width, NSUInteger height, CGFloat factor)
{
    NSUInteger size = width*height;
    char *rgba = (char *)malloc(size); srand(124);
    for(NSUInteger i=0; i < size; ++i){rgba[i] = rand()%256*factor;}
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmapContext = 
    CGBitmapContextCreate(rgba, width, height, 8, width, colorSpace, kCGImageAlphaNone);
    CFRelease(colorSpace);
    free(rgba);
    CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
    CFRelease(bitmapContext);
    return image;
}

然后,图像用于覆盖当前图形上的噪声

    static CGImageRef noisePattern = nil;
    if (noisePattern == nil) noisePattern = createNoiseImageRef(128, 128, 0.015);
    [NSGraphicsContext saveGraphicsState];
    [[NSGraphicsContext currentContext] setCompositingOperation:NSCompositePlusLighter];
    CGRect noisePatternRect = CGRectZero;
    noisePatternRect.size = CGSizeMake(CGImageGetWidth(noisePattern), CGImageGetHeight(noisePattern));        
    CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
    CGContextDrawTiledImage(context, noisePatternRect, noisePattern);
    [NSGraphicsContext restoreGraphicsState];