NPAPI drawPlugin извлекает CGContext из экземпляра NPP

#events #cgcontext #npapi

#Мероприятия #cgcontext #npapi

Вопрос:

Я пытаюсь нарисовать png в моем (NPAPI) веб-плагине для Mac на основе basic-plugin.

Я хотел бы перерисовать плагин на a NPCocoaEventMouseDown , но у меня возникли проблемы с извлечением cgContextRef .

Приведенный ниже метод работает для NPCocoaEventDrawRect , но не для NPCocoaEventMouseDown , потому что тогда я не могу использовать event->data.draw.context . Я попытался получить cgContextRef с помощью

 

    CGContextRef cgContext = (NP_CGContext*)currentInstance->window.window


  

но, похоже, это не сработало. Вот моя функция:

 

    void drawPlugin(NPP instance, NPCocoaEvent* event)
    {
        char* path = "/shot.png";
        if(!instance || !event)
            return;
        PluginInstance* currentInstance = (PluginInstance*)(instance->pdata);
        //CGContextRef cgContext = event->data.draw.context; //works with DrawRect
        CGContextRef cgContext = (NP_CGContext*)currentInstance->window.window;
        if (!cgContext) {
            return;
        }
        float windowWidth = currentInstance->window.width;
        float windowHeight = currentInstance->window.height;

        CGContextSaveGState(cgContext);
        //.....
        CGContextRestoreGState(cgContext);
    }

  

И здесь вызывается функция:

 

    int16_t NPP_HandleEvent(NPP instance, void* event)
    {
      NPCocoaEvent* cocoaEvent = (NPCocoaEvent*)event;
      if (cocoaEvent amp;amp; (cocoaEvent->type == NPCocoaEventDrawRect)) {
          return 1;
        }

      if(cocoaEvent)
      {
        switch (cocoaEvent->type) {
            case NPCocoaEventDrawRect:
                drawPlugin(instance, (NPCocoaEvent*)event);
                break;
            case NPCocoaEventMouseDown:
                drawPlugin(instance, (NPCocoaEvent*)event);
                break;
            default:
                break;
        }  
          return 1;
      }
        return 0;
    }

  

Как я могу получить cgContextRef in a NPCocoaEventMouseDown ?

Ответ №1:

Я хотел бы перерисовать плагин в NPCocoaEventMouseDown

Как я могу получить CGContextRef в NPCocoaEventMouseDown?

Вы не можете сделать ни одну из этих вещей. Вы вызываете NPN_InvalidateRect в своем обработчике наведения курсора мыши и ждете обратного вызова draw.

Я попытался получить CGContextRef с помощью

CGContextRef CGContext = (NP_CGContext*)Текущее состояние->window.window

но, похоже, это не сработало.

Поскольку это поле всегда равно НУЛЮ в модели событий Cocoa, как описано в спецификации событий Cocoa. Вам явно предоставляется CGContextRef только во время вызова paint, и он должен быть действительным только в течение этого вызова. (На случай, если вы думаете о его кэшировании для последующего использования: не делайте этого. Результаты будут иметь совершенно неопределенное поведение, вероятно, не будут работать, на них, безусловно, нельзя полагаться на работу, и почти наверняка в какой-то момент в каком-то браузере возникнут сбои.)

Комментарии:

1. На случай, если вам интересно, ошибается ли сморган, это не так. Вы можете рисовать только по указанию любого плагина без окон, и coregraphics на Mac соответствует требованиям. Даже со старой реализацией Carbon они не хотели, чтобы вы рисовали всякий раз, когда это просто получилось, чтобы работать немного лучше, вот и все. Дыхание огня ( firebreath.org ) обеспечивает отличную абстракцию для этого. Вы можете, кстати, запросить событие рисования, вызвав NPN_InvalidateRect для события mousedown .

2. Спасибо сморгану и Таксилиану. Я новичок в разработке веб-плагина, и иногда ссылки и документация мне не совсем понятны, поэтому этот ответ действительно помогает мне.

3. Новый вопрос, где и как я могу вызвать NPN_InvalidateRect?