Встраивание холста skia в NSView и HWND, холст сбрасывается как пустой при изменении размера окна
Я пытаюсь встроить Skia Canvas в NSView и HWND, чтобы сделать кроссплатформенное рисование. Я использую класс SkView, поставляемый с исходным кодом skia, и использую SkOSWindow в качестве окна. Но окно закрылось при изменении размера окна. Как показано ниже
Вот код, используемый SkWindow при изменении размера,
void SkWindow::resize(int width, int height, SkColorType ct) {
if (ct == kUnknown_SkColorType)
ct = fColorType;
if (width != fBitmap.width() || height != fBitmap.height() || ct != fColorType) {
fColorType = ct;
fBitmap.allocPixels(SkImageInfo::Make(width, height,
ct, kPremul_SkAlphaType));
this->setSize(SkIntToScalar(width), SkIntToScalar(height));
this->inval(nullptr);
}
}
Я очень новичок в Skia, и я не могу найти документ об этой проблеме. Кто-нибудь когда-нибудь сталкивался с этой проблемой? Любое предложение будет оценено!
1 ответ
Вы можете решить эту проблему, рассматривая случай изменения размера в реальном времени отдельно. Я предполагаю, что когда окно находится в режиме реального изменения размера, бэкэнд растрового изображения skia создается заново, но не перерисовывается. Так что просто сделайте бэкэнд сами и скопируйте его в CGContext в drawRect
метод. Смотрите код ниже.
Это решение не идеально. Если вы знаете, как решить это элегантно, пожалуйста, дайте мне знать.
- (void)drawRect:(NSRect)rect {
[super drawRect:rect];
CGContextRef ctx =
(CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
if ([self inLiveResize]) {
SkBitmap bm;
bm.allocN32Pixels(rect.size.width, rect.size.height);
SkCanvas canvas(bm);
_document.draw(&canvas); // replace your drawing code
CGImageRef img = SkCreateCGImageRef(bm);
if (img) {
CGRect r = CGRectMake(0, 0, bm.width(), bm.height());
CGContextRef cg = reinterpret_cast<CGContextRef>(ctx);
CGContextSaveGState(cg);
CGContextTranslateCTM(cg, 0, r.size.height);
CGContextScaleCTM(cg, 1, -1);
CGContextDrawImage(cg, r, img);
CGContextRestoreGState(cg);
CGImageRelease(img);
}
} else {
SkCGDrawBitmap(ctx, fWind->getBitmap(), 0, 0);
}
}