bool PolygonRender::Render(const RenderTarget &inTarget, const RenderState &inState) { Extent2DF extent; CachedExtentRenderer::GetExtent(inState.mTransform, extent); if (!extent.Valid()) return true; // Get bounding pixel rect Rect rect = inState.mTransform.GetTargetRect(extent); // Intersect with clip rect ... Rect visible_pixels = rect.Intersect(inState.mClipRect); if (visible_pixels.HasPixels()) { // Check to see if AlphaMask is invalid... int tx = 0; int ty = 0; if (mAlphaMask && !mAlphaMask->Compatible(inState.mTransform, rect,visible_pixels, tx, ty)) { mAlphaMask->Dispose(); mAlphaMask = 0; } if (!mAlphaMask) { SetTransform(inState.mTransform); // TODO: make visible_pixels a bit bigger ? SpanRect span(visible_pixels, inState.mTransform.mAAFactor); span.mWinding = GetWinding(); mSpanRect = &span; int alpha_factor = Iterate(itCreateRenderer, *inState.mTransform.mMatrix); mAlphaMask = mSpanRect->CreateMask(mTransform, alpha_factor); mSpanRect = 0; } if (inTarget.mPixelFormat == pfAlpha) { mAlphaMask->RenderBitmap(tx, ty, inTarget, inState); } else { mFiller->Fill(*mAlphaMask, tx, ty, inTarget, inState); } } return true; }
bool PointRenderer::Render( const RenderTarget &inTarget, const RenderState &inState ) { Extent2DF extent; CachedExtentRenderer::GetExtent(inState.mTransform,extent); if (!extent.Valid()) return true; // Get bounding pixel rect Rect rect = inState.mTransform.GetTargetRect(extent); // Intersect with clip rect ... Rect visible_pixels = rect.Intersect(inState.mClipRect); int x0 = visible_pixels.x; int y0 = visible_pixels.y; int x1 = visible_pixels.x1(); int y1 = visible_pixels.y1(); bool swap = gC0IsRed != (bool)(inTarget.mPixelFormat & pfSwapRB); //bool alpha = (inTarget.mPixelFormat & pfHasAlpha); if (!mHasColours) { int val = swap ? mCol.SwappedIVal() : mCol.ival; // 100% alpha... if ( ( (val & 0xff000000) == 0xff000000 ) || (inTarget.mPixelFormat & pfHasAlpha) ) { for(int i=0; i<mTransformed.size(); i++) { const UserPoint &point = mTransformed[i]; int tx = point.x; if (x0<=tx && tx<x1) { int ty = point.y; if (y0<=ty && ty<y1) ((int *)inTarget.Row(ty))[tx] = val; } } } else { ARGB argb = swap ? mCol.Swapped() : mCol; for(int i=0; i<mTransformed.size(); i++) { const UserPoint &point = mTransformed[i]; int tx = point.x; if (x0<=tx && tx<x1) { int ty = point.y; if (y0<=ty && ty<y1) ((ARGB *)inTarget.Row(ty))[tx].QBlendA(argb); } } } } else { ARGB *argb = (ARGB *) & mData[mData0 + mTransformed.size()*2]; if (inTarget.mPixelFormat & pfHasAlpha) for(int i=0; i<mTransformed.size(); i++) { const UserPoint &point = mTransformed[i]; int tx = point.x; if (x0<=tx && tx<x1) { int ty = point.y; if (y0<=ty && ty<y1) ((ARGB *)inTarget.Row(ty))[tx].QBlendA( swap? argb[i] : argb[i].Swapped() ); } } else for(int i=0; i<mTransformed.size(); i++) { const UserPoint &point = mTransformed[i]; int tx = point.x; if (x0<=tx && tx<x1) { int ty = point.y; if (y0<=ty && ty<y1) ((ARGB *)inTarget.Row(ty))[tx].QBlend( swap? argb[i].Swapped() : argb[i] ); } } } return true; }
bool Render(const RenderTarget &inTarget, const RenderState &inState) { if (mTriangles->mUVT.empty()) return PolygonRender::Render(inTarget,inState); Extent2DF extent; CachedExtentRenderer::GetExtent(inState.mTransform,extent,true); if (!extent.Valid()) return true; // Get bounding pixel rect Rect rect = inState.mTransform.GetTargetRect(extent); // Intersect with clip rect ... Rect visible_pixels = rect.Intersect(inState.mClipRect); int tris = mTriangles->mTriangleCount; UserPoint *point = &mTransformed[0]; bool *edge_aa = &mEdgeAA[0]; float *uvt = &mTriangles->mUVT[0]; int tex_components = mTriangles->mType == vtVertex ? 0 : mTriangles->mType==vtVertexUV ? 2 : 3; int aa = inState.mTransform.mAAFactor; bool aa1 = aa==1; for(int i=0;i<tris;i++) { // For each alpha mask ... // Check to see if AlphaMask is invalid... AlphaMask *&alpha = mAlphaMasks[i]; int tx=0; int ty=0; if (alpha && !alpha->Compatible(inState.mTransform, rect,visible_pixels,tx,ty)) { alpha->Dispose(); alpha = 0; } if (!alpha) { SetTransform(inState.mTransform); SpanRect *span = new SpanRect(visible_pixels,inState.mTransform.mAAFactor); if (aa1 || edge_aa[0]) span->Line01( mTransform.ToImageAA(point[0]),mTransform.ToImageAA(point[1]) ); else span->Line11( mTransform.ToImageAA(point[0]),mTransform.ToImageAA(point[1]) ); if (aa1 || edge_aa[1]) span->Line01( mTransform.ToImageAA(point[1]),mTransform.ToImageAA(point[2]) ); else span->Line11( mTransform.ToImageAA(point[1]),mTransform.ToImageAA(point[2]) ); if (aa1 || edge_aa[2]) span->Line01( mTransform.ToImageAA(point[2]),mTransform.ToImageAA(point[0]) ); else span->Line11( mTransform.ToImageAA(point[2]),mTransform.ToImageAA(point[0]) ); alpha = span->CreateMask(mTransform,256); delete span; } if (inTarget.mPixelFormat==pfAlpha) { alpha->RenderBitmap(tx,ty,inTarget,inState); } else { if (tex_components) mFiller->SetMapping(point,uvt,tex_components); mFiller->Fill(*alpha,tx,ty,inTarget,inState); } point += 3; uvt+=tex_components*3; edge_aa += 3; } mMappingDirty = false; return true; }