Встраивание холста 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);
  }
}
Другие вопросы по тегам