Merge revision 643 and revision 648 changes:
- Improve the cefclient transparency test by adding the ability to view individual pixel values (issue #584). - Change cefclient off-screen rendering example to account for premultiplied alpha values (issue #584). git-svn-id: https://chromiumembedded.googlecode.com/svn/branches/1025@649 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
parent
2bd2007fb9
commit
0bccf1bff2
|
@ -110,8 +110,8 @@ void ClientOSRenderer::Initialize() {
|
|||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
|
||||
if (transparent_) {
|
||||
// Alpha blending style.
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
// Alpha blending style. Texture values have premultiplied alpha.
|
||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||
}
|
||||
|
||||
initialized_ = true;
|
||||
|
@ -355,6 +355,28 @@ void ClientOSRenderer::IncrementSpin(float spinDX, float spinDY) {
|
|||
spin_y_ -= spinDY;
|
||||
}
|
||||
|
||||
bool ClientOSRenderer::GetPixelValue(int x, int y, unsigned char& r,
|
||||
unsigned char& g, unsigned char& b,
|
||||
unsigned char& a) {
|
||||
if (!view_buffer_)
|
||||
return false;
|
||||
|
||||
ASSERT(x >= 0 && x < view_width_);
|
||||
ASSERT(y >= 0 && y < view_height_);
|
||||
|
||||
int pixel_bytes = transparent_ ? 4 : 3;
|
||||
int y_flipped = view_height_ - y;
|
||||
int index = (view_width_ * y_flipped * pixel_bytes) + (x * pixel_bytes);
|
||||
|
||||
r = view_buffer_[index];
|
||||
g = view_buffer_[index+1];
|
||||
b = view_buffer_[index+2];
|
||||
if (transparent_)
|
||||
a = view_buffer_[index+3];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ClientOSRenderer::SetBufferSize(int width, int height, bool view) {
|
||||
int dst_size = width * height * (transparent_?4:3);
|
||||
|
||||
|
|
|
@ -40,6 +40,13 @@ class ClientOSRenderer {
|
|||
void SetSpin(float spinX, float spinY);
|
||||
void IncrementSpin(float spinDX, float spinDY);
|
||||
|
||||
// Retrieve the pixel value from the view buffer. |x| and |y| are relative to
|
||||
// the upper-left corner of the view.
|
||||
bool GetPixelValue(int x, int y, unsigned char& r, unsigned char& g,
|
||||
unsigned char& b, unsigned char& a);
|
||||
|
||||
bool IsTransparent() { return transparent_; }
|
||||
|
||||
private:
|
||||
void SetBufferSize(int width, int height, bool view);
|
||||
void SetRGBA(const void* src, int width, int height, bool view);
|
||||
|
|
|
@ -466,6 +466,22 @@ LRESULT CALLBACK PluginWndProc(HWND hWnd, UINT message, WPARAM wParam,
|
|||
lastMousePos.x = curMousePos.x = LOWORD(lParam);
|
||||
lastMousePos.y = curMousePos.y = HIWORD(lParam);
|
||||
mouseRotation = true;
|
||||
} else if (wParam & MK_CONTROL) {
|
||||
// Retrieve the pixel value.
|
||||
int x = LOWORD(lParam);
|
||||
int y = HIWORD(lParam);
|
||||
unsigned char r, g, b, a;
|
||||
if (plugin->renderer.GetPixelValue(x, y, r, g, b, a)) {
|
||||
std::stringstream ss;
|
||||
ss << x << "," << y << " = R:" << static_cast<int>(r) << " G:" <<
|
||||
static_cast<int>(g) << " B:" << static_cast<int>(b);
|
||||
if (plugin->renderer.IsTransparent())
|
||||
ss << " A:" << static_cast<int>(a);
|
||||
|
||||
std::string js =
|
||||
"document.getElementById('pixel').innerText = '" + ss.str() + "';";
|
||||
AppGetBrowser()->GetMainFrame()->ExecuteJavaScript(js, "", 0);
|
||||
}
|
||||
} else {
|
||||
if (g_offscreenBrowser.get()) {
|
||||
g_offscreenBrowser->SendMouseClickEvent(LOWORD(lParam), HIWORD(lParam),
|
||||
|
|
|
@ -43,6 +43,9 @@
|
|||
<div style="padding: 2px; margin: 5px; border: red 1px solid; width: 960px;">
|
||||
<embed type="application/x-client-osr-plugin" width=960 height=400></embed>
|
||||
</div>
|
||||
<div style="padding: 2px; margin: 5px; width: 960px;" align="left">
|
||||
<span style="font-size: 10pt; text-align:left;">Pixel value: <span id="pixel">Click the left mouse button while holding the control key to test a pixel value.</span></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -12,14 +12,38 @@ opacity:0.4;
|
|||
img:hover {
|
||||
opacity:1.0;
|
||||
}
|
||||
#transbox {
|
||||
width: 300px;
|
||||
margin: 0 50px;
|
||||
background-color: #fff;
|
||||
border: 2px solid black;
|
||||
opacity: 0.3;
|
||||
font-size: 18px;
|
||||
.box_white, .box_black {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
display: inline-block;
|
||||
width: 100px;
|
||||
}
|
||||
.box_white {
|
||||
background-color: white;
|
||||
border: 2px solid black;
|
||||
color: black;
|
||||
}
|
||||
.box_black {
|
||||
background-color: black;
|
||||
border: 2px solid white;
|
||||
color: white;
|
||||
}
|
||||
.box_0 {
|
||||
opacity: 1.0;
|
||||
}
|
||||
.box_25 {
|
||||
opacity: 0.75;
|
||||
}
|
||||
.box_50 {
|
||||
opacity: 0.5;
|
||||
}
|
||||
.box_75 {
|
||||
opacity: 0.25;
|
||||
}
|
||||
.box_100 {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
@ -30,7 +54,10 @@ Hover over an image to make it fully opaque.<br>
|
|||
<img src="http://www.w3schools.com/css/klematis.jpg" width="150" height="113" alt="klematis" />
|
||||
<img src="http://www.w3schools.com/css/klematis2.jpg" width="150" height="113" alt="klematis" />
|
||||
|
||||
<h1>Div Transparency</h1>
|
||||
<div id="transbox">This is some text in a transparent box.</div>
|
||||
<h1>Block Transparency</h1>
|
||||
<span class="box_white box_0">White 0%</span> <span class="box_white box_25">White 25%</span> <span class="box_white box_50">White 50%</span> <span class="box_white box_75">White 75%</span> <span class="box_white box_100">White 100%</span>
|
||||
<br>
|
||||
<span class="box_black box_0">Black 0%</span> <span class="box_black box_25">Black 25%</span> <span class="box_black box_50">Black 50%</span> <span class="box_black box_75">Black 75%</span> <span class="box_black box_100">Black 100%</span>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
Loading…
Reference in New Issue