static inline void draw_replacement_bitmap(GrCachedLayer* layer, SkCanvas* canvas) { // Some image filter can totally filter away a layer (e.g., SkPictureImageFilter's with // no picture). if (!layer->texture()) { return; } SkBitmap bm; wrap_texture(layer->texture(), !layer->isAtlased() ? layer->rect().width() : layer->texture()->width(), !layer->isAtlased() ? layer->rect().height() : layer->texture()->height(), &bm); if (layer->isAtlased()) { const SkRect src = SkRect::Make(layer->rect()); const SkRect dst = SkRect::Make(layer->srcIR()); SkASSERT(layer->offset().isZero()); canvas->save(); canvas->setMatrix(SkMatrix::I()); canvas->drawBitmapRect(bm, src, dst, layer->paint(), SkCanvas::kStrict_SrcRectConstraint); canvas->restore(); } else { canvas->drawSprite(bm, layer->srcIR().fLeft + layer->offset().fX, layer->srcIR().fTop + layer->offset().fY, layer->paint()); } }
static void convert_layers_to_replacements(const SkTDArray<GrHoistedLayer>& layers, GrReplacements* replacements) { // TODO: just replace GrReplacements::ReplacementInfo with GrCachedLayer? for (int i = 0; i < layers.count(); ++i) { GrCachedLayer* layer = layers[i].fLayer; const SkPicture* picture = layers[i].fPicture; GrReplacements::ReplacementInfo* layerInfo = replacements->newReplacement(picture->uniqueID(), layer->start(), layers[i].fCTM); layerInfo->fStop = layer->stop(); layerInfo->fPos = layers[i].fOffset; SkBitmap bm; wrap_texture(layers[i].fLayer->texture(), !layers[i].fLayer->isAtlased() ? layers[i].fLayer->rect().width() : layers[i].fLayer->texture()->width(), !layers[i].fLayer->isAtlased() ? layers[i].fLayer->rect().height() : layers[i].fLayer->texture()->height(), &bm); layerInfo->fImage = SkImage::NewTexture(bm); layerInfo->fPaint = layers[i].fLayer->paint() ? SkNEW_ARGS(SkPaint, (*layers[i].fLayer->paint())) : NULL; layerInfo->fSrcRect = SkIRect::MakeXYWH(layers[i].fLayer->rect().fLeft, layers[i].fLayer->rect().fTop, layers[i].fLayer->rect().width(), layers[i].fLayer->rect().height()); } }
/** * Called when rendering to a texture image begins, or when changing * the dest mipmap level, cube face, etc. * This is a fallback routine for software render-to-texture. * * Called via the glRenderbufferTexture1D/2D/3D() functions * and elsewhere (such as glTexImage2D). * * The image we're rendering into is * att->Texture->Image[att->CubeMapFace][att->TextureLevel]; * It'll never be NULL. * * \param fb the framebuffer object the texture is being bound to * \param att the fb attachment point of the texture * * \sa _mesa_framebuffer_renderbuffer */ void _swrast_render_texture(struct gl_context *ctx, struct gl_framebuffer *fb, struct gl_renderbuffer_attachment *att) { (void) fb; if (!att->Renderbuffer) { wrap_texture(ctx, att); } update_wrapper(ctx, att); }