NPAPI drawPlugin извлекает cgContext из экземпляра NPP - PullRequest
1 голос
/ 11 октября 2011

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

Я хотел бы перерисовать плагин на 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 && (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 в NPCocoaEventMouseDown?

1 Ответ

1 голос
/ 11 октября 2011

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

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

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

Я пытался получить cgContextRef с

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

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

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

...