0

クロスプラットフォームの描画を行うために、スキーキャンバスを NSView と HWND に埋め込もうとしています。私はskiaソースコードに付属するクラスSkViewを使用しており、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に非常に慣れていないため、この問題に関するドキュメントが見つかりません。誰かがこの問題に遭遇したことがありますか? どんな提案でも大歓迎です!

4

1 に答える 1

0

ライブリサイズの場合は別途対応することで解決する場合があります。私の推測では、ウィンドウがライブ サイズ変更されている場合、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);
  }
}
于 2016-08-13T05:04:50.380 に答える