blob: 3428ba1bbab9857cf640c9c3ed340bf0282c5dcd [file] [log] [blame]
/*
* Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#ifndef D3DVERTEXCACHER_H
#define D3DVERTEXCACHER_H
#include "jni.h"
#include "D3DContext.h"
#define MAX_BATCH_SIZE 1024
#define APPEND_ACTION 0x0
#define RESET_ACTION 0x1
#define D3DFVF_J2DLVERTEX \
(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2 | \
D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE2(1) )
typedef struct _J2DLVERTEX {
float x, y, z;
DWORD color;
float tu1, tv1;
float tu2, tv2;
} J2DLVERTEX;
typedef struct {
D3DPRIMITIVETYPE pType; // type of primitives in this batch
UINT pNum; // number of primitives of pType in this batch
} VertexBatch;
class D3DContext;
class D3DPIPELINE_API D3DVertexCacher {
public:
HRESULT Init(D3DContext *pCtx);
~D3DVertexCacher() { ReleaseDefPoolResources(); }
void ReleaseDefPoolResources();
jint GetColor() { return color; }
void SetColor(jint newColor) { color = newColor; }
HRESULT DrawLine(int x1, int y1, int x2, int y2);
HRESULT DrawPoly(jint nPoints, jboolean isClosed,
jint transX, jint transY,
jint *xPoints, jint *yPoints);
HRESULT DrawScanlines(jint scanlineCount, jint *scanlines);
HRESULT DrawRect(int x1, int y1, int x2, int y2);
HRESULT FillRect(int x1, int y1, int x2, int y2);
HRESULT FillParallelogramAA(float fx11, float fy11,
float dx21, float dy21,
float dx12, float dy12);
HRESULT DrawParallelogramAA(float ox11, float oy11,
float ox21, float oy21,
float ox12, float oy12,
float ix11, float iy11,
float ix21, float iy21,
float ix12, float iy12);
HRESULT FillParallelogram(float fx11, float fy11,
float dx21, float dy21,
float dx12, float dy12);
HRESULT FillSpans(jint spansCount, jint *spans);
HRESULT DrawTexture(float dx1, float dy1, float dx2, float dy2,
float tx1, float ty1, float tx2, float ty2);
HRESULT DrawTexture(float dx1, float dy1, float dx2, float dy2,
float t1x1, float t1y1, float t1x2, float t1y2,
float t2x1, float t2y1, float t2x2, float t2y2);
HRESULT Render(int actionType = APPEND_ACTION);
UINT GetFreeVertices() { return (MAX_BATCH_SIZE - firstUnusedVertex); }
static
HRESULT CreateInstance(D3DContext *pCtx, D3DVertexCacher **ppVC);
private:
D3DVertexCacher();
HRESULT EnsureCapacity(D3DPRIMITIVETYPE newPType, UINT vNum);
private:
UINT firstPendingBatch;
UINT firstPendingVertex;
UINT firstUnusedVertex;
UINT currentBatch;
J2DLVERTEX vertices[MAX_BATCH_SIZE];
VertexBatch batches[MAX_BATCH_SIZE];
IDirect3DVertexBuffer9 *lpD3DVertexBuffer;
IDirect3DDevice9 *lpD3DDevice;
D3DContext *pCtx;
jint color;
};
#endif // D3DVERTEXCACHER_H