Search code examples
c++pdfxpsmako-sdk

Exception thrown by IJawsRenderer()


I’m using the Mako SDK and IJawsRenderer::render() to render all IDOMPathNodes with an IDOMImageBrush fill. When I do, the renderer throws an error 2000 exception for some nodes, but not all. What could be the cause?

IDOMBrushPtr pBrush;
pPath->getFill(pBrush);
if (pBrush)
{
    IDOMBrush::eBrushType fillStyle = pBrush->getBrushType();
    switch (fillStyle)
    {
    case IDOMBrush::eImage:
    {
        IJawsRendererPtr renderer = IJawsRenderer::create(jawsMako);
        IDOMImagePtr renderedImage;
        renderedImage = renderer->render(pNode, 800); // This is where the exception will eventually happen.
        break;
    }
    default:
        break;
    }
}

Solution

  • It could be that the exception is thrown because the path passed to the renderer is too small. There is a lower limit of 1pt x 1pt (or 1.33 x 1.33 Mako units) for the renderer. Modify your code to check that the bounding box of the node is big enough, for example:

    const double minimumRenderSize = 96.0 / 72.0;
    ...
    IDOMBrushPtr pBrush;
    pPath->getFill(pBrush);
    FRect box;
    pPath->getBounds(box);
    box.dX = box.dX < minimumRenderSize ? minimumRenderSize : box.dX;
    box.dY = box.dY < minimumRenderSize ? minimumRenderSize : box.dY;
    if (pBrush)
    {
        IDOMBrush::eBrushType fillStyle = pBrush->getBrushType();
        switch (fillStyle)
        {
        case IDOMBrush::eImage:
        {
            IJawsRendererPtr renderer = IJawsRenderer::create(jawsMako);
            IDOMImagePtr renderedImage;
            renderedImage = renderer->render(pNode, 800, IDOMColorSpacesRGB::create(jawsMako), box);
            break;
        }
        default:
            break;
        }
    }