Как выглядит правильный вызов CGImageCreate, если поставщик данных для него использует массив, созданный приложением? - PullRequest
11 голосов
/ 12 августа 2011

Я пытаюсь создать растровое изображение в памяти как часть функции шаблона, которую вызовет drawLayer: inContext: метод (этот метод является частью протокола делегирования CALayer).Функция шаблона выглядит примерно так:

static const size_t kComponentsPerPixel = 4;
static const size_t kBitsPerComponent = sizeof(unsigned char) * 8;

NSInteger layerHeight = 160;
NSInteger layerWidth = 160;
CGContextSaveGState(context); 

CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();

size_t bufferLength = layerWidth * layerHeight * kComponentsPerPixel;

unsigned char *buffer = malloc(bufferLength);

// The real function does something more interesting with the buffer, but I cut it 
// to reduce the complexity while I figure out the crash.
for (NSInteger i = 0; i < bufferLength; ++i)
{
    buffer[i] = 255;
}
//memset(buffer, 255, bufferLength);

CGDataProviderRef provider = 
CGDataProviderCreateWithData(NULL, &buffer, bufferLength, NULL);//freeBitmapBuffer);

CGImageRef imageRef = 
CGImageCreate(layerWidth, layerHeight, kBitsPerComponent, 
              kBitsPerComponent * kComponentsPerPixel, 
              kComponentsPerPixel * layerWidth, 
              rgb, 
              kCGBitmapByteOrderDefault | kCGImageAlphaLast, 
              provider, NULL, false, kCGRenderingIntentDefault);

CGContextDrawImage(context, CGRectMake(0, 0, 160, 160), imageRef);

CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(rgb);     

CGContextRestoreGState(context);

Позже, когда drawLayer: inContext: вызывает CGContextFillRect для отображения шаблона, созданного этой функцией, я получаю EXC_BAD_ACCESS.Вершина стека является CGSConvertAlphaByte.Я посмотрел на память буфера в тот момент, и она казалась вполне подходящей - точно такой, какой она была установлена ​​при вызове функции шаблона.

Я думаю, что, возможно, я испортил какой-то параметр CGImageCreate, вполне возможнофлаги.Или буфер заполнен не в правильном порядке, но я не уверен, что могу ошибиться, если заполнить каждый байт одинаковым значением.

Любые идеи или примеры аналогичного кода, который не вызывает сбоев

1 Ответ

4 голосов
/ 13 августа 2011

ОК, поэтому форумы разработчиков Apple обнаружили ошибку: я по какой-то причине передавал & буфер вместо буфера.

...