почему цвета градиента и псевдонимы в Lion отличаются от Snow Leopard? - PullRequest
1 голос
/ 17 ноября 2011

Только что натолкнулся на одну странную проблему.Я генерирую программно градиент внутри прямоугольника с закругленными углами примерно так:

CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceAdobeRGB1998);
    CGContextRef mcontext = [[NSGraphicsContext currentContext] graphicsPort];
size_t capacityBarGradientNumLocations = 11;
CGGradientRef Gradient;

CGFloat capacityBarGradientLocations[11] = { /* skipped */  };

CGFloat capacityBarGradientColors[44] = { /* skipped */  };

Gradient = CGGradientCreateWithColorComponents (colorSpace, capacityBarGradientColors, capacityBarGradientLocations, capacityBarGradientNumLocations);
CGContextDrawLinearGradient(mcontext,Gradient, CGPointMake(0,baroffset), CGPointMake(0,barheight+baroffset), 0);

Я только что заметил, что один и тот же код дает совершенно разные результаты для Lion и Snow Leopard на одном и том же Mac (у меня двойная загрузка)и монитор с одинаковыми цветовыми профилями.Пожалуйста, взгляните на скриншот: Weird gradient problem under Lion

Левая часть, если взять под Львом, правая - под Снежным Барсом.Как я могу исправить свой градиент под Lion?

Дополнительная информация о изображении выше.Я использовал черный цвет с переменной альфа для генерации полупрозрачного градиента, то есть:

CGFloat capacityBarGradientColors[44] = 
{   0.0, 0.0, 0.0, .65, 
    0.0, 0.0, 0.0, .35, 
            /* skipped */
    0.0, 0.0, 0.0, .35, 
    0.0, 0.0, 0.0, .65,
};

Я подумал, может быть, что-то не так с тем, как я использую альфа.Решили использовать реальные цвета с режимом смешивания Multiply и альфа-значением, установленным на 1,0:

CGFloat capacityBarGradientColors[44] = 
{  0x59/255., 0x59/255., 0x59/255., 1.0, 
    0xa6/255., 0xa6/255., 0xa6/255., 1.0, 
            /* skipped */
    0xa6/255., 0xa6/255., 0xa6/255., 1.0, 
    0x59/255., 0x59/255., 0x59/255., 1.0,
};

Под Snow Leopard я получил результат, который искал.Но под Lion у меня совершенно другая картина.взгляните на скриншот: lion blending mode problem

Слева - лев, справа - снежный барс

Вот изменения кода, которые я сделал:

Gradient = CGGradientCreateWithColorComponents (colorSpace, capacityBarGradientColors, capacityBarGradientLocations, capacityBarGradientNumLocations);
CGContextSetBlendMode(mcontext, kCGBlendModeMultiply);
CGContextDrawLinearGradient(mcontext,Gradient, CGPointMake(0,baroffset), CGPointMake(0,barheight+baroffset), 0);
CGContextSetBlendMode(mcontext, kCGBlendModeNormal);

1 Ответ

0 голосов
/ 17 ноября 2011

Может быть что-то делать с цветовым пространством, которое ведет себя по-разному (гамма?) От одной версии ОС к другой.У вас есть такая же проблема, если вы используете kCGColorSpaceGenericRGB или kCGColorSpaceGenericRGBLinear?

...