本文介绍了Windows上的SKIA渲染(HDC的SkCanvas)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用SKIA在Windows上进行绘制。

I'm trying to use SKIA for drawing on Windows.

是否仍然可以从HDC启动SkCanvas?

Is there anyway to initiate SkCanvas from HDC ?

推荐答案

在Windows上有几种使用 skia的方法。在在您的 skia 文件夹中。

There are several approaches "to use" skia on Windows. These approaches described in the SkOSWindow_win.cpp at the skia\src\views\win in your skia folder.

例如:


  1. 您可以像在功能 SkOSWindow :: attachGL

HDC dc = GetDC((HWND)fHWND);
if (NULL == fHGLRC) {
    fHGLRC = SkCreateWGLContext(dc, msaaSampleCount,
        kGLPreferCompatibilityProfile_SkWGLContextRequest);
    if (NULL == fHGLRC) {
        return false;
    }
    glClearStencil(0);
    glClearColor(0, 0, 0, 0);
    glStencilMask(0xffffffff);
    glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
}
if (wglMakeCurrent(dc, (HGLRC)fHGLRC)) {
    // use DescribePixelFormat to get the stencil bit depth.
    int pixelFormat = GetPixelFormat(dc);
    PIXELFORMATDESCRIPTOR pfd;
    DescribePixelFormat(dc, pixelFormat, sizeof(pfd), &pfd);
    info->fStencilBits = pfd.cStencilBits;

    // Get sample count if the MSAA WGL extension is present
    SkWGLExtensions extensions;
    if (extensions.hasExtension(dc, "WGL_ARB_multisample")) {
        static const int kSampleCountAttr = SK_WGL_SAMPLES;
        extensions.getPixelFormatAttribiv(dc,
            pixelFormat,
            0,
            1,
            &kSampleCountAttr,
            &info->fSampleCount);
    }
    else {
        info->fSampleCount = 0;
    }

    glViewport(0, 0,
        SkScalarRoundToInt(this->width()),
        SkScalarRoundToInt(this->height()));
    return true;
}


  • 您可以将SkCanvas的内容原样复制到HDC通过执行BitBlt操作在 SkOSWindow :: doPaint 中完成

    HDC hdc = (HDC)ctx;
    const SkBitmap& bitmap = this->getBitmap();
    
    BITMAPINFO bmi;
    memset(&bmi, 0, sizeof(bmi));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = bitmap.width();
    bmi.bmiHeader.biHeight = -bitmap.height(); // top-down image
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage = 0;
    
    //
    // Do the SetDIBitsToDevice.
    //
    // TODO(wjmaclean):
    //       Fix this call to handle SkBitmaps that have rowBytes != width,
    //       i.e. may have padding at the end of lines. The SkASSERT below
    //       may be ignored by builds, and the only obviously safe option
    //       seems to be to copy the bitmap to a temporary (contiguous)
    //       buffer before passing to SetDIBitsToDevice().
    SkASSERT(bitmap.width() * bitmap.bytesPerPixel() == bitmap.rowBytes());
    bitmap.lockPixels();
    int ret = SetDIBitsToDevice(hdc,
        0, 0,
        bitmap.width(), bitmap.height(),
        0, 0,
        0, bitmap.height(),
        bitmap.getPixels(),
        &bmi,
        DIB_RGB_COLORS);
    (void)ret; // we're ignoring potential failures for now.
    bitmap.unlockPixels();
    


  • 这篇关于Windows上的SKIA渲染(HDC的SkCanvas)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

    07-02 16:27