{{newin|[[0.8.0]]|080|type=type|text=It has been renamed from [[Framebuffer]]}}
A Canvas is used for off-screen rendering. Think of it as an invisible screen that you can draw to, but that will not be visible until you draw it to the actual visible screen. It is also known as "render to texture".

By drawing things that do not change position often (such as background items) to the Canvas, and then drawing the entire Canvas instead of each item,  you can reduce the number of draw operations performed each frame.

In versions prior to [[0.10.0]], not all graphics cards that LÖVE supported could use Canvases. [[love.graphics.isSupported|love.graphics.isSupported("canvas")]] could be used to check for support at runtime.


{{notice|When drawing content to a Canvas using regular alpha blending, the alpha values of the content get multiplied with its RGB values.

Therefore the Canvas' pixel colors will have ''premultiplied alpha'' once it has been drawn to, so when drawing the Canvas to the screen or to another Canvas you must use premultiplied alpha blending – [[love.graphics.setBlendMode]]("alpha", "premultiplied").}}

== Constructors ==
{{#ask: [[Category:Functions]] [[Constructs::Canvas]]
| headers=hide
| default=None.
| format=template
| template=ListingFields
| introtemplate=ListingIntro
| outrotemplate=ListingOutro
| ?Description
| ?PrettySince
| ?PrettyRemoved
| ?PrettyDeprecated
}}
== Functions ==
{{#ask: [[Category:Functions]] [[parent::Canvas||Texture||Drawable||Object]] [[Concept:Current]]
| headers=hide
| format=template
| template=ListingFields
| introtemplate=ListingIntro
| outrotemplate=ListingOutro
| ?Description
| ?PrettySince
| ?PrettyRemoved
| ?PrettyDeprecated
}}
== Enums ==
{{#ask: [[Category:Enums]] [[parent::Canvas]] [[Concept:Current]]
| headers=hide
| format=template
| template=ListingFields
| introtemplate=ListingIntro
| outrotemplate=ListingOutro
| ?Description
| ?PrettySince
| ?PrettyRemoved
| ?PrettyDeprecated
}}
== Supertypes ==
* [[parent::Texture]]
* [[parent::Drawable]]
* [[parent::Object]]
== Examples ==
=== Drawing something to the Canvas and then draw the Canvas to the screen. ===
<source lang="lua">
function love.load()
    canvas = love.graphics.newCanvas(800, 600)

    -- Rectangle is drawn to the canvas with the regular alpha blend mode.
    love.graphics.setCanvas(canvas)
        love.graphics.clear()
        love.graphics.setBlendMode("alpha")
        love.graphics.setColor(1, 0, 0, 0.5)
        love.graphics.rectangle('fill', 0, 0, 100, 100)
    love.graphics.setCanvas()
end

function love.draw()
    -- very important!: reset color before drawing to canvas to have colors properly displayed
    -- see discussion here: https://love2d.org/forums/viewtopic.php?f=4&p=211418#p211418
    love.graphics.setColor(1, 1, 1, 1)

    -- The rectangle from the Canvas was already alpha blended.
    -- Use the premultiplied alpha blend mode when drawing the Canvas itself to prevent improper blending.
    love.graphics.setBlendMode("alpha", "premultiplied")
    love.graphics.draw(canvas)
    -- Observe the difference if the Canvas is drawn with the regular alpha blend mode instead.
    love.graphics.setBlendMode("alpha")
    love.graphics.draw(canvas, 100, 0)

    -- Rectangle is drawn directly to the screen with the regular alpha blend mode.
    love.graphics.setBlendMode("alpha")
    love.graphics.setColor(1, 0, 0, 0.5)
    love.graphics.rectangle('fill', 200, 0, 100, 100)
end
</source>

== See Also ==
* [[parent::love.graphics]]
* [[love.graphics.setCanvas]]
* [[love.graphics.setBlendMode]]
* [[love.graphics.isSupported]]
[[Category:Types]]
{{#set:Description=Off-screen render target.}}

== Other Languages ==
{{i18n|Canvas}}