1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4//
5//******************************************************************************
6// This is a copy of the coresponding android_webview/public/browser header.
7// Any changes to the interface should be made there.
8//
9// The purpose of having the copy is twofold:
10//  - it removes the need to have Chromium sources present in the tree in order
11//    to build the plat_support library,
12//  - it captures API that the corresponding Android release supports.
13//******************************************************************************
14
15#ifndef ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
16#define ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22
23// 1 is L/L MR1
24//
25// 2 starts at M, and added an imperfect workaround for complex clipping by
26// elevating the WebView into an FBO layer. If any transform, clip, or outline
27// clip occurs that would either likely use the stencil buffer for clipping, or
28// require shader based clipping in HWUI, the WebView is drawn into an FBO (if
29// it fits).
30// This is a temporary workaround for a lack of WebView support for stencil/
31// shader based round rect clipping, and should be removed when webview is
32// capable of supporting these clips internally when drawing.
33static const int kAwDrawGLInfoVersion = 2;
34
35// Holds the information required to trigger an OpenGL drawing operation.
36struct AwDrawGLInfo {
37  int version;  // The AwDrawGLInfo this struct was built with.
38
39  // Input: tells the draw function what action to perform.
40  enum Mode {
41    kModeDraw = 0,
42    kModeProcess,
43    kModeProcessNoContext,
44    kModeSync,
45  } mode;
46
47  // Input: current clip rect in surface coordinates. Reflects the current state
48  // of the OpenGL scissor rect. Both the OpenGL scissor rect and viewport are
49  // set by the caller of the draw function and updated during View animations.
50  int clip_left;
51  int clip_top;
52  int clip_right;
53  int clip_bottom;
54
55  // Input: current width/height of destination surface.
56  int width;
57  int height;
58
59  // Input: is the View rendered into an independent layer.
60  // If false, the surface is likely to hold to the full screen contents, with
61  // the scissor box set by the caller to the actual View location and size.
62  // Also the transformation matrix will contain at least a translation to the
63  // position of the View to render, plus any other transformations required as
64  // part of any ongoing View animation. View translucency (alpha) is ignored,
65  // although the framework will set is_layer to true for non-opaque cases.
66  // Can be requested via the View.setLayerType(View.LAYER_TYPE_NONE, ...)
67  // Android API method.
68  //
69  // If true, the surface is dedicated to the View and should have its size.
70  // The viewport and scissor box are set by the caller to the whole surface.
71  // Animation transformations are handled by the caller and not reflected in
72  // the provided transformation matrix. Translucency works normally.
73  // Can be requested via the View.setLayerType(View.LAYER_TYPE_HARDWARE, ...)
74  // Android API method.
75  bool is_layer;
76
77  // Input: current transformation matrix in surface pixels.
78  // Uses the column-based OpenGL matrix format.
79  float transform[16];
80};
81
82// Function to invoke a direct GL draw into the client's pre-configured
83// GL context. Obtained via AwContents.getDrawGLFunction() (static).
84// |view_context| is an opaque identifier that was returned by the corresponding
85// call to AwContents.getAwDrawGLViewContext().
86// |draw_info| carries the in and out parameters for this draw.
87// |spare| ignored; pass NULL.
88typedef void (AwDrawGLFunction)(long view_context,
89                                AwDrawGLInfo* draw_info,
90                                void* spare);
91enum AwMapMode {
92  MAP_READ_ONLY,
93  MAP_WRITE_ONLY,
94  MAP_READ_WRITE,
95};
96
97// Called to create a GraphicBuffer
98typedef long AwCreateGraphicBufferFunction(int w, int h);
99// Called to release a GraphicBuffer
100typedef void AwReleaseGraphicBufferFunction(long buffer_id);
101// Called to map a GraphicBuffer in |mode|.
102typedef int AwMapFunction(long buffer_id, AwMapMode mode, void** vaddr);
103// Called to unmap a GraphicBuffer
104typedef int AwUnmapFunction(long buffer_id);
105// Called to get a native buffer pointer
106typedef void* AwGetNativeBufferFunction(long buffer_id);
107// Called to get the stride of the buffer
108typedef unsigned int AwGetStrideFunction(long buffer_id);
109
110static const int kAwDrawGLFunctionTableVersion = 1;
111
112// Set of functions used in rendering in hardware mode
113struct AwDrawGLFunctionTable {
114  int version;
115  AwCreateGraphicBufferFunction* create_graphic_buffer;
116  AwReleaseGraphicBufferFunction* release_graphic_buffer;
117  AwMapFunction* map;
118  AwUnmapFunction* unmap;
119  AwGetNativeBufferFunction* get_native_buffer;
120  AwGetStrideFunction* get_stride;
121};
122
123#ifdef __cplusplus
124}  // extern "C"
125#endif
126
127#endif  // ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
128