2011-08-12 13 views
10

Tôi đang cố gắng tạo bitmap trong bộ nhớ như một phần của hàm mẫu mà phương thức drawLayer: inContext: (phương thức này là một phần của giao thức ủy nhiệm CALayer) sẽ gọi. Chức năng mô hình trông tương tự như sau:Cuộc gọi chính xác với CGImageCreate trông như thế nào nếu nhà cung cấp dữ liệu sử dụng một mảng được ứng dụng tạo ra?

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); 

Sau đó, khi drawLayer: InContext: gọi CGContextFillRect để hiển thị các mô hình được tạo ra bởi chức năng này, tôi nhận được EXC_BAD_ACCESS. Đầu ngăn xếp là CGSConvertAlphaByte. Tôi nhìn vào bộ nhớ của bộ đệm tại thời điểm đó, và nó có vẻ tốt - thiết lập chính xác những gì nó đã được thiết lập khi chức năng mô hình được gọi.

Tôi nghĩ rằng có lẽ tôi đã làm sai lệch một số tham số của CGImageCreate, có thể là các cờ. Hoặc bộ đệm không được điền theo thứ tự đúng, nhưng tôi không chắc chắn làm thế nào tôi có thể đi sai nếu tôi điền vào mỗi byte với cùng một giá trị.

Bất kỳ ý tưởng hoặc ví dụ nào về mã tương tự không bị lỗi?

Trả lời

4

OK, vì vậy diễn đàn Apple dev phát hiện ra lỗi: Tôi đã vượt qua & bộ đệm vì một số lý do thay vì bộ đệm.

Các vấn đề liên quan