Какая польза от NPDrawingModelAsyncBitmapSurface в Mozilla NPAPI AsyncDrawing?

Mozilla предоставляет API AsyncDrawing, который обеспечивает аппаратное ускорение рендеринга в подключаемом модуле NPAPI.
В то время как Для режима NPDrawingModelAsyncWindowsSharedSurface требуется Vista и выше,
NPDrawingModelAsyncBitmapSurface также работает в Windows XP.
Но в их пример кода, в функции drawAsyncBitmapColor,
подключаемый модуль использует memcpy и зацикливается на пикселях для рисования растрового изображения:

void drawAsyncBitmapColor(InstanceData* instanceData)
{
  NPP npp = instanceData->npp;

  uint32_t *pixelData = (uint32_t*)instanceData->backBuffer->bitmap.data;

  uint32_t rgba = instanceData->scriptableObject->drawColor;

  unsigned char subpixels[4];
  subpixels[0] = rgba & 0xFF;
  subpixels[1] = (rgba & 0xFF00) >> 8;
  subpixels[2] = (rgba & 0xFF0000) >> 16;
  subpixels[3] = (rgba & 0xFF000000) >> 24;

  subpixels[0] = uint8_t(float(subpixels[3] * subpixels[0]) / 0xFF);
  subpixels[1] = uint8_t(float(subpixels[3] * subpixels[1]) / 0xFF);
  subpixels[2] = uint8_t(float(subpixels[3] * subpixels[2]) / 0xFF);
  uint32_t premultiplied;
  memcpy(&premultiplied, subpixels, sizeof(premultiplied));

  for (uint32_t* lastPixel = pixelData + instanceData->backBuffer->size.width * instanceData->backBuffer->size.height;
    pixelData < lastPixel;
    ++pixelData) {
    *pixelData = premultiplied;
  }

  NPN_SetCurrentAsyncSurface(npp, instanceData->backBuffer, NULL);
  NPAsyncSurface *oldFront = instanceData->frontBuffer;
  instanceData->frontBuffer = instanceData->backBuffer;
  instanceData->backBuffer = oldFront;
}

Означает ли это, что дорогостоящее копирование должно выполняться процессором, а не графическим процессором?
Означает ли это, что NPDrawingModelAsyncBitmapSurface не позволяет использовать преимущества аппаратного ускорения?

Спасибо


person Gil    schedule 22.01.2013    source источник


Ответы (1)


Означает ли это, что дорогостоящее копирование должно выполняться процессором, а не графическим процессором? Означает ли это, что NPDrawingModelAsyncBitmapSurface не позволяет вам воспользоваться преимуществами аппаратного ускорения?

Да и да. Поверхности с аппаратным ускорением требуют реализаций для конкретных платформ, поэтому в качестве запасного варианта используется обычная растровая поверхность.

person Georg Fritzsche    schedule 22.01.2013
comment
Так почему бы не вернуться к обычному рисованию плагинов без окон (на HDC, предоставляемом браузером)? - person Gil; 22.01.2013
comment
HDC используется совместно с браузером, который должен ждать, пока подключаемый модуль отрисует его для правильного рендеринга. С асинхронными поверхностями плагин просто сообщает браузеру, какая поверхность является текущей, и браузер может использовать ее по своему усмотрению. - person Georg Fritzsche; 22.01.2013