У меня есть приложение для рисования OpenGL ES 2 (iOS 4), поэтому я сохраняю поддержку в моем CAEAGLLayer, а не очищаю каждый кадр:
eaglLayer.opaque = TRUE;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:TRUE], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
nil];
У меня есть кнопка для сохранения работы в фотоальбом с кодом ниже. Вот проблема. После завершения сохранения, и я снова начинаю рисовать, весь буфер очищается, и мой рисунок начинается с чистого листа на пустом экране. Есть ли способ предотвратить это? Я бы хотел продолжить рисование из того же состояния, которое я только что сохранил.
Я использую тот же код для сохранения в OpenGL ES 1, и эта проблема не возникает там. Кроме того, эта проблема видна только на устройстве iPhone (3GS), а не на симуляторе. Дайте мне знать, если у вас есть идеи. Спасибо.
-(void)saveCurrentScreenToPhotoAlbum
{
CGRect rect = [[UIScreen mainScreen] bounds];
int width = rect.size.width;
int height = rect.size.height;
NSInteger myDataLength = width * height * 4;
GLubyte *buffer = (GLubyte *) malloc(myDataLength);
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
for(int y = 0; y <height; y++)
{
for(int x = 0; x <width * 4; x++)
{
buffer2[(int)((height - 1 - y) * width * 4 + x)] = buffer[(int)(y * 4 * width + x)];
}
}
free(buffer);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, releaseData);
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * width;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
UIImage *image = [[UIImage alloc] initWithCGImage:imageRef]; // change this to manual alloc/init instead of autorelease
CGImageRelease(imageRef);
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); // add callback for finish saving
}
// callback for CGDataProviderCreateWithData
void releaseData(void *info, const void *data, size_t dataSize)
{
free((void*)data);
}
// callback for UIImageWriteToSavedPhotosAlbum
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
[image release];
}