Merge revision 526 changes:
- Invalidate the entire scroll rect when using off-screen rendering mode (issue #469). git-svn-id: https://chromiumembedded.googlecode.com/svn/branches/1025@527 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
parent
c84e36a96d
commit
2f7c28cb00
|
@ -287,10 +287,11 @@ void WebWidgetHost::DidScrollRect(int dx, int dy, const gfx::Rect& clip_rect) {
|
||||||
DCHECK(dx || dy);
|
DCHECK(dx || dy);
|
||||||
|
|
||||||
// Invalidate and re-paint the entire scroll rect if:
|
// Invalidate and re-paint the entire scroll rect if:
|
||||||
// 1. We're in a state where we cannot draw into the view right now, or
|
// 1. Window rendering is disabled, or
|
||||||
// 2. The rect is being scrolled by more than the size of the view, or
|
// 2. We're in a state where we cannot draw into the view right now, or
|
||||||
// 3. The scroll rect intersects the current paint region.
|
// 3. The rect is being scrolled by more than the size of the view, or
|
||||||
if (!canvas_.get() || layouting_ || painting_ ||
|
// 4. The scroll rect intersects the current paint region.
|
||||||
|
if (!view_ || !canvas_.get() || layouting_ || painting_ ||
|
||||||
abs(dx) >= clip_rect.width() || abs(dy) >= clip_rect.height() ||
|
abs(dx) >= clip_rect.width() || abs(dy) >= clip_rect.height() ||
|
||||||
paint_rgn_.intersects(convertToSkiaRect(clip_rect))) {
|
paint_rgn_.intersects(convertToSkiaRect(clip_rect))) {
|
||||||
DidInvalidateRect(clip_rect);
|
DidInvalidateRect(clip_rect);
|
||||||
|
|
|
@ -287,11 +287,21 @@ class ClientOSRHandler : public CefClient,
|
||||||
glBindTexture(GL_TEXTURE_2D, g_textureID);
|
glBindTexture(GL_TEXTURE_2D, g_textureID);
|
||||||
|
|
||||||
if (type == PET_VIEW) {
|
if (type == PET_VIEW) {
|
||||||
|
SetBufferSize(g_width, g_height, true);
|
||||||
// Paint the view.
|
// Paint the view.
|
||||||
if (g_offscreenTransparent)
|
if (g_offscreenTransparent) {
|
||||||
SetRGBA(buffer, g_width, g_height, true);
|
RectList::const_iterator i = dirtyRects.begin();
|
||||||
else
|
for (; i != dirtyRects.end(); ++i) {
|
||||||
SetRGB(buffer, g_width, g_height, true);
|
ConvertToRGBARect(*i, (unsigned char*)buffer, view_buffer_, g_width,
|
||||||
|
g_height);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
RectList::const_iterator i = dirtyRects.begin();
|
||||||
|
for (i; i != dirtyRects.end(); ++i) {
|
||||||
|
ConvertToRGBRect(*i, (unsigned char*)buffer, view_buffer_, g_width,
|
||||||
|
g_height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update the whole texture. This is done for simplicity instead of
|
// Update the whole texture. This is done for simplicity instead of
|
||||||
// updating just the dirty region.
|
// updating just the dirty region.
|
||||||
|
@ -391,6 +401,24 @@ class ClientOSRHandler : public CefClient,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ConvertToRGBARect(const CefRect& clipRect,
|
||||||
|
const unsigned char* src, unsigned char* dst,
|
||||||
|
int width, int height) {
|
||||||
|
int sp = 0, dp = (height-1) * width * 4;
|
||||||
|
for (int i = 0; i < height; i++) {
|
||||||
|
for (int j = 0; j < width; j++, dp += 4, sp += 4) {
|
||||||
|
if ((clipRect.x <= j) && (clipRect.x + clipRect.width > j) &&
|
||||||
|
(clipRect.y <= i) && (clipRect.y + clipRect.height > i)) {
|
||||||
|
dst[dp] = src[sp+2]; // R
|
||||||
|
dst[dp+1] = src[sp+1]; // G
|
||||||
|
dst[dp+2] = src[sp]; // B
|
||||||
|
dst[dp+3] = src[sp+3]; // A
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dp -= width * 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Set the contents of the RGB buffer.
|
// Set the contents of the RGB buffer.
|
||||||
void SetRGB(const void* src, int width, int height, bool view) {
|
void SetRGB(const void* src, int width, int height, bool view) {
|
||||||
SetBufferSize(width, height, view);
|
SetBufferSize(width, height, view);
|
||||||
|
@ -412,6 +440,23 @@ class ClientOSRHandler : public CefClient,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ConvertToRGBRect(const CefRect& clipRect,
|
||||||
|
const unsigned char* src, unsigned char* dst,
|
||||||
|
int width, int height) {
|
||||||
|
int sp = 0, dp = (height-1) * width * 3;
|
||||||
|
for (int i = 0; i < height; i++) {
|
||||||
|
for (int j = 0; j < width; j++, dp += 3, sp += 4) {
|
||||||
|
if ((clipRect.x <= j) && (clipRect.x + clipRect.width > j) &&
|
||||||
|
(clipRect.y <= i) && (clipRect.y + clipRect.height > i)) {
|
||||||
|
dst[dp] = src[sp+2]; // R
|
||||||
|
dst[dp+1] = src[sp+1]; // G
|
||||||
|
dst[dp+2] = src[sp]; // B
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dp -= width * 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ClientPlugin* plugin_;
|
ClientPlugin* plugin_;
|
||||||
unsigned char* view_buffer_;
|
unsigned char* view_buffer_;
|
||||||
int view_buffer_size_;
|
int view_buffer_size_;
|
||||||
|
|
Loading…
Reference in New Issue