1 /*
2  * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 #ifndef D3DVERTEXCACHER_H
27 #define D3DVERTEXCACHER_H
28 
29 #include "jni.h"
30 #include "D3DContext.h"
31 
32 #define MAX_BATCH_SIZE 1024
33 #define APPEND_ACTION 0x0
34 #define RESET_ACTION  0x1
35 #define D3DFVF_J2DLVERTEX \
36     (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2 | \
37     D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE2(1) )
38 typedef struct _J2DLVERTEX {
39     float x, y, z;
40     DWORD color;
41     float tu1, tv1;
42     float tu2, tv2;
43 } J2DLVERTEX;
44 
45 typedef struct {
46     D3DPRIMITIVETYPE pType; // type of primitives in this batch
47     UINT pNum; // number of primitives of pType in this batch
48 } VertexBatch;
49 
50 class D3DContext;
51 
52 class D3DPIPELINE_API D3DVertexCacher {
53 public:
54     HRESULT Init(D3DContext *pCtx);
~D3DVertexCacher()55             ~D3DVertexCacher() { ReleaseDefPoolResources(); }
56     void    ReleaseDefPoolResources();
57 
GetColor()58     jint    GetColor() { return color; }
SetColor(jint newColor)59     void    SetColor(jint newColor) { color = newColor; }
60     HRESULT DrawLine(int x1, int y1, int x2, int y2);
61     HRESULT DrawPoly(jint nPoints, jboolean isClosed,
62                      jint transX, jint transY,
63                      jint *xPoints, jint *yPoints);
64     HRESULT DrawScanlines(jint scanlineCount, jint *scanlines);
65     HRESULT DrawRect(int x1, int y1, int x2, int y2);
66     HRESULT FillRect(int x1, int y1, int x2, int y2);
67     HRESULT FillParallelogramAA(float fx11, float fy11,
68                                 float dx21, float dy21,
69                                 float dx12, float dy12);
70     HRESULT DrawParallelogramAA(float ox11, float oy11,
71                                 float ox21, float oy21,
72                                 float ox12, float oy12,
73                                 float ix11, float iy11,
74                                 float ix21, float iy21,
75                                 float ix12, float iy12);
76     HRESULT FillParallelogram(float fx11, float fy11,
77                               float dx21, float dy21,
78                               float dx12, float dy12);
79     HRESULT FillSpans(jint spansCount, jint *spans);
80     HRESULT DrawTexture(float dx1, float dy1, float dx2, float dy2,
81                         float tx1, float ty1, float tx2, float ty2);
82     HRESULT DrawTexture(float  dx1, float  dy1, float  dx2, float  dy2,
83                         float t1x1, float t1y1, float t1x2, float t1y2,
84                         float t2x1, float t2y1, float t2x2, float t2y2);
85     HRESULT Render(int actionType = APPEND_ACTION);
GetFreeVertices()86     UINT    GetFreeVertices() { return (MAX_BATCH_SIZE - firstUnusedVertex); }
87 
88 static
89     HRESULT CreateInstance(D3DContext *pCtx, D3DVertexCacher **ppVC);
90 
91 private:
92             D3DVertexCacher();
93     HRESULT EnsureCapacity(D3DPRIMITIVETYPE newPType, UINT vNum);
94 
95 private:
96     UINT firstPendingBatch;
97     UINT firstPendingVertex;
98     UINT firstUnusedVertex;
99     UINT currentBatch;
100     J2DLVERTEX              vertices[MAX_BATCH_SIZE];
101     VertexBatch             batches[MAX_BATCH_SIZE];
102     IDirect3DVertexBuffer9  *lpD3DVertexBuffer;
103     IDirect3DDevice9        *lpD3DDevice;
104     D3DContext              *pCtx;
105     jint                    color;
106 };
107 
108 #endif // D3DVERTEXCACHER_H
109