Пример #1
0
bool SVGResources::buildCachedResources(const RenderElement& renderer, const RenderStyle& style)
{
    ASSERT(renderer.element());
    ASSERT_WITH_SECURITY_IMPLICATION(renderer.element()->isSVGElement());

    if (!renderer.element())
        return false;

    auto& element = downcast<SVGElement>(*renderer.element());

    Document& document = element.document();

    SVGDocumentExtensions& extensions = document.accessSVGExtensions();

    const AtomicString& tagName = element.localName();
    if (tagName.isNull())
        return false;

    const SVGRenderStyle& svgStyle = style.svgStyle();

    bool foundResources = false;
    if (clipperFilterMaskerTags().contains(tagName)) {
        if (svgStyle.hasClipper()) {
            AtomicString id(svgStyle.clipperResource());
            if (setClipper(getRenderSVGResourceById<RenderSVGResourceClipper>(document, id)))
                foundResources = true;
            else
                registerPendingResource(extensions, id, element);
        }

        if (style.hasFilter()) {
            const FilterOperations& filterOperations = style.filter();
            if (filterOperations.size() == 1) {
                const FilterOperation& filterOperation = *filterOperations.at(0);
                if (filterOperation.type() == FilterOperation::REFERENCE) {
                    const auto& referenceFilterOperation = downcast<ReferenceFilterOperation>(filterOperation);
                    AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString(referenceFilterOperation.url(), element.document());
                    if (setFilter(getRenderSVGResourceById<RenderSVGResourceFilter>(document, id)))
                        foundResources = true;
                    else
                        registerPendingResource(extensions, id, element);
                }
            }
        }

        if (svgStyle.hasMasker()) {
            AtomicString id(svgStyle.maskerResource());
            if (setMasker(getRenderSVGResourceById<RenderSVGResourceMasker>(document, id)))
                foundResources = true;
            else
                registerPendingResource(extensions, id, element);
        }
    }

    if (markerTags().contains(tagName) && svgStyle.hasMarkers()) {
        AtomicString markerStartId(svgStyle.markerStartResource());
        if (setMarkerStart(getRenderSVGResourceById<RenderSVGResourceMarker>(document, markerStartId)))
            foundResources = true;
        else
            registerPendingResource(extensions, markerStartId, element);

        AtomicString markerMidId(svgStyle.markerMidResource());
        if (setMarkerMid(getRenderSVGResourceById<RenderSVGResourceMarker>(document, markerMidId)))
            foundResources = true;
        else
            registerPendingResource(extensions, markerMidId, element);

        AtomicString markerEndId(svgStyle.markerEndResource());
        if (setMarkerEnd(getRenderSVGResourceById<RenderSVGResourceMarker>(document, markerEndId)))
            foundResources = true;
        else
            registerPendingResource(extensions, markerEndId, element);
    }

    if (fillAndStrokeTags().contains(tagName)) {
        if (svgStyle.hasFill()) {
            bool hasPendingResource = false;
            AtomicString id;
            if (setFill(paintingResourceFromSVGPaint(document, svgStyle.fillPaintType(), svgStyle.fillPaintUri(), id, hasPendingResource)))
                foundResources = true;
            else if (hasPendingResource)
                registerPendingResource(extensions, id, element);
        }

        if (svgStyle.hasStroke()) {
            bool hasPendingResource = false;
            AtomicString id;
            if (setStroke(paintingResourceFromSVGPaint(document, svgStyle.strokePaintType(), svgStyle.strokePaintUri(), id, hasPendingResource)))
                foundResources = true;
            else if (hasPendingResource)
                registerPendingResource(extensions, id, element);
        }
    }

    if (chainableResourceTags().contains(tagName)) {
        AtomicString id(targetReferenceFromResource(element));
        if (setLinkedResource(getRenderSVGResourceContainerById(document, id)))
            foundResources = true;
        else
            registerPendingResource(extensions, id, element);
    }

    return foundResources;
}
Пример #2
0
void AflSpriteMapImage::onDraw()
{
	int i,j;

	if(!m_pAflSpriteMap || !getAflTexture())
		return;

	AflD3DWorld* paflDevice = AflRenderUnit::getAflDevice();
	
	AflDrawUnit* pSprite = m_pAflSpriteMap->getDrawSprite();
	INT iTipWidth = getTipWidth();
	INT iTipHeight = getTipHeight();
	if(!iTipWidth || !iTipHeight)
		return;
	
	//接触判定表示用スプライトの作成
	if((INT)pSprite->getImageWidth()-4 != getTipWidth() || (INT)pSprite->getImageHeight()-4 != getTipHeight())
	{
		pSprite->delPolygon();
		pSprite->createBox(2,2,getTipWidth()-4,getTipHeight()-4,0x88cc6666);
		pSprite->setZBuffer(false);
		pSprite->setClipper(m_pAflSpriteMap->getClipX(),m_pAflSpriteMap->getClipY(),m_pAflSpriteMap->getClipZ(),
			m_pAflSpriteMap->getClipWidth(),m_pAflSpriteMap->getClipHeight(),m_pAflSpriteMap->getClipDepth());
	}

	//クリップ領域の指定
	setClipper(m_pAflSpriteMap->getClipX(),m_pAflSpriteMap->getClipY(),m_pAflSpriteMap->getClipZ(),
		m_pAflSpriteMap->getClipWidth(),m_pAflSpriteMap->getClipHeight(),m_pAflSpriteMap->getClipDepth());


	INT iLevel = m_iLevel;
	FLOAT fMapX = m_pAflSpriteMap->getMapX();
	FLOAT fMapY = m_pAflSpriteMap->getMapY();

	//描画範囲の設定
	FLOAT fDrawWidth = m_pAflSpriteMap->getClipWidth();
	FLOAT fDrawHeight = m_pAflSpriteMap->getClipHeight();
	if(!fDrawWidth)
		fDrawWidth = paflDevice->getDeviceWidth();
	if(!fDrawHeight)
		fDrawHeight = paflDevice->getDeviceHeight();

	//ビットのスライド位置を設定
	FLOAT fStartBitX = (INT)fMapX % iTipWidth;
	FLOAT fStartBitY = (INT)fMapY % iTipHeight;
	if(fMapX < 0)
		fStartBitX = iTipWidth + fStartBitX;
	if(fMapY < 0)
		fStartBitY = iTipHeight + fStartBitY;

	//描画開始マップパーツの設定
	INT iMapX,iMapY;
	iMapX = (fMapX-fStartBitX) / iTipWidth;
	iMapY = (fMapY-fStartBitY) / iTipHeight;

	//描画パーツ数の設定
	INT iCountX,iCountY;
	iCountX = (fDrawWidth+iTipWidth-1) / iTipWidth;
	iCountY = (fDrawHeight+iTipHeight-1) / iTipHeight;
	if(fStartBitX)
		iCountX++;
	if(fStartBitY)
		iCountY++;

	for(j=0;j<iCountY;j++)
	{
		for(i=0;i<iCountX;i++)
		{
			INT iIndex = m_pAflSpriteMap->getMapIndex(iLevel,iMapX+i,iMapY+j); 
			//通常描画
			if(iIndex > 0 || (iLevel == 0 && iIndex==0))
			{
				//パーツの選択
				setImageIndex(iIndex);
				//相対位置の設定
				setRelativity(-fStartBitX+i*iTipWidth,-fStartBitY+j*iTipHeight,0);
				//描画
				drawImage(fX,fY,fZ);
			}
			//接触判定用
			if(m_pAflSpriteMap->isDrawCollide())
			{
				bool bCollide = m_pAflSpriteMap->isMapCollide(iMapX+i,iMapY+j);
				if(bCollide)
				{
					pSprite->setRelativity(-fStartBitX+i*iTipWidth,-fStartBitY+j*iTipHeight,0);
					pSprite->drawImage(fX,fY,fZ-2);
				}
			}
		}
	}
}