Beispiel #1
0
void HTMLCanvasElement::discardImageBuffer()
{
    m_contextStateSaver.clear(); // uses context owned by m_imageBuffer
    m_imageBuffer.clear();
    resetDirtyRect();
    updateExternallyAllocatedMemory();
}
void VirtualKeyboardGUI::redraw() {
	assert(_kbdSurface);
	int16 w = _dirtyRect.width();
	int16 h = _dirtyRect.height();
	if (w <= 0 || h <= 0) return;

	Graphics::Surface surf;
	surf.create(w, h, sizeof(OverlayColor));

	OverlayColor *dst = (OverlayColor *)surf.pixels;
	const OverlayColor *src = (OverlayColor *) _overlayBackup.getBasePtr(_dirtyRect.left, _dirtyRect.top);

	while (h--) {
		memcpy(dst, src, surf.w * sizeof(OverlayColor));
		dst += surf.w;
		src += _overlayBackup.w;
	}

	blit(&surf, _kbdSurface, _kbdBound.left - _dirtyRect.left,
			  _kbdBound.top - _dirtyRect.top, _kbdTransparentColor);
	if (_displayEnabled) {
		blit(&surf, &_dispSurface, _dispX - _dirtyRect.left,
				  _dispY - _dirtyRect.top, _dispBackColor);
	}
	_system->copyRectToOverlay((OverlayColor*)surf.pixels, surf.w,
							   _dirtyRect.left, _dirtyRect.top, surf.w, surf.h);

	surf.free();

	resetDirtyRect();
}
void HTMLCanvasElement::reset()
{
    if (m_ignoreReset)
        return;

    resetDirtyRect();

    bool ok;
    bool hadImageBuffer = hasImageBuffer();

    int w = getAttribute(widthAttr).toInt(&ok);
    if (!ok || w < 0)
        w = DefaultWidth;

    int h = getAttribute(heightAttr).toInt(&ok);
    if (!ok || h < 0)
        h = DefaultHeight;

    if (m_contextStateSaver) {
        // Reset to the initial graphics context state.
        m_contextStateSaver->restore();
        m_contextStateSaver->save();
    }

    if (m_context && m_context->is2d())
        toCanvasRenderingContext2D(m_context.get())->reset();

    IntSize oldSize = size();
    IntSize newSize(w, h);

    // If the size of an existing buffer matches, we can just clear it instead of reallocating.
    // This optimization is only done for 2D canvases for now.
    if (hadImageBuffer && oldSize == newSize && m_context && m_context->is2d()) {
        if (!m_didClearImageBuffer)
            clearImageBuffer();
        return;
    }

    setSurfaceSize(newSize);

    if (m_context && m_context->is3d() && oldSize != size())
        toWebGLRenderingContext(m_context.get())->reshape(width(), height());

    if (RenderObject* renderer = this->renderer()) {
        if (renderer->isCanvas()) {
            if (oldSize != size()) {
                toRenderHTMLCanvas(renderer)->canvasSizeChanged();
                if (renderBox() && renderBox()->hasAcceleratedCompositing())
                    renderBox()->contentChanged(CanvasChanged);
            }
            if (hadImageBuffer)
                renderer->setShouldDoFullPaintInvalidation(true);
        }
    }

    WillBeHeapHashSet<RawPtrWillBeWeakMember<CanvasObserver> >::iterator end = m_observers.end();
    for (WillBeHeapHashSet<RawPtrWillBeWeakMember<CanvasObserver> >::iterator it = m_observers.begin(); it != end; ++it)
        (*it)->canvasResized(this);
}