Commit cf576e69 authored by Stuart Parmenter's avatar Stuart Parmenter
Browse files

bug 480233. Make the display list item that canvas uses for painting know...

bug 480233. Make the display list item that canvas uses for painting know about the opacity of the canvas. r/sr=roc
parent 7187113a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -101,6 +101,9 @@ public:
   */
  virtual PRInt32 CountContexts () = 0;
  virtual nsICanvasRenderingContextInternal *GetContextAtIndex (PRInt32 index) = 0;

  virtual PRBool GetIsOpaque() = 0;

};

NS_DEFINE_STATIC_IID_ACCESSOR(nsICanvasElement, NS_ICANVASELEMENT_IID)
+7 −7
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ public:
  NS_IMETHOD InvalidateFrameSubrect (const nsRect& damageRect);
  virtual PRInt32 CountContexts();
  virtual nsICanvasRenderingContextInternal *GetContextAtIndex (PRInt32 index);
  virtual PRBool GetIsOpaque();

  NS_IMETHOD_(PRBool) IsAttributeMapped(const nsIAtom* aAttribute) const;
  nsMapRuleToAttributesFunc GetAttributeMappingFunction() const;
@@ -118,7 +119,6 @@ public:

protected:
  nsIntSize GetWidthHeight();
  PRBool GetIsOpaque();

  nsresult UpdateContext();
  nsresult ToDataURLImpl(const nsAString& aMimeType,
@@ -195,12 +195,6 @@ nsHTMLCanvasElement::GetWidthHeight()
  return size;
}

PRBool
nsHTMLCanvasElement::GetIsOpaque()
{
  return HasAttr(kNameSpaceID_None, nsGkAtoms::moz_opaque);
}

NS_IMPL_INT_ATTR_DEFAULT_VALUE(nsHTMLCanvasElement, Width, width, DEFAULT_CANVAS_WIDTH)
NS_IMPL_INT_ATTR_DEFAULT_VALUE(nsHTMLCanvasElement, Height, height, DEFAULT_CANVAS_HEIGHT)
NS_IMPL_BOOL_ATTR(nsHTMLCanvasElement, MozOpaque, moz_opaque)
@@ -588,3 +582,9 @@ nsHTMLCanvasElement::GetContextAtIndex (PRInt32 index)

  return NULL;
}

PRBool
nsHTMLCanvasElement::GetIsOpaque()
{
  return HasAttr(kNameSpaceID_None, nsGkAtoms::moz_opaque);
}
+36 −7
Original line number Diff line number Diff line
@@ -49,6 +49,41 @@

#include "nsTransform2D.h"


class nsDisplayItemCanvas : public nsDisplayItem {
public:
  nsDisplayItemCanvas(nsIFrame* aFrame)
    : nsDisplayItem(aFrame)
  {
    MOZ_COUNT_CTOR(nsDisplayItemCanvas);
  }
#ifdef NS_BUILD_REFCNT_LOGGING
  virtual ~nsDisplayItemCanvas() {
    MOZ_COUNT_DTOR(nsDisplayItemCanvas);
  }
#endif

  NS_DISPLAY_DECL_NAME("nsDisplayItemCanvas")
  
  virtual void Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx,
                     const nsRect& aDirtyRect) {
    nsHTMLCanvasFrame* f = static_cast<nsHTMLCanvasFrame*>(GetUnderlyingFrame());
    f->PaintCanvas(*aCtx, aDirtyRect, aBuilder->ToReferenceFrame(f));
  }

  virtual PRBool IsOpaque(nsDisplayListBuilder* aBuilder) {
    nsIFrame* f = GetUnderlyingFrame();
    nsCOMPtr<nsICanvasElement> canvas(do_QueryInterface(f->GetContent()));
    return canvas->GetIsOpaque();
  }

  virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder) {
    nsHTMLCanvasFrame* f = static_cast<nsHTMLCanvasFrame*>(GetUnderlyingFrame());
    return f->GetInnerArea() + aBuilder->ToReferenceFrame(f);
  }
};


nsIFrame*
NS_NewHTMLCanvasFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
{
@@ -229,12 +264,6 @@ nsHTMLCanvasFrame::PaintCanvas(nsIRenderingContext& aRenderingContext,
  }
}

static void PaintCanvas(nsIFrame* aFrame, nsIRenderingContext* aCtx,
                        const nsRect& aDirtyRect, nsPoint aPt)
{
  static_cast<nsHTMLCanvasFrame*>(aFrame)->PaintCanvas(*aCtx, aDirtyRect, aPt);
}

NS_IMETHODIMP
nsHTMLCanvasFrame::BuildDisplayList(nsDisplayListBuilder*   aBuilder,
                                    const nsRect&           aDirtyRect,
@@ -247,7 +276,7 @@ nsHTMLCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
  NS_ENSURE_SUCCESS(rv, rv);

  rv = aLists.Content()->AppendNewToTop(new (aBuilder)
         nsDisplayGeneric(this, ::PaintCanvas, "Canvas"));
         nsDisplayItemCanvas(this));
  NS_ENSURE_SUCCESS(rv, rv);

  return DisplaySelectionOverlay(aBuilder, aLists,