summaryrefslogtreecommitdiff
path: root/vcl/inc/opengl
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <lfrb@collabora.com>2014-11-06 14:17:24 -0500
committerMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-11-10 07:59:11 +0100
commit6282509c2fe81b7218af955639f01fc06ccd33cd (patch)
tree6d3f4cfb99672ed57a6ed172d1b3c5a89bf927cf /vcl/inc/opengl
parentb4daf82f84dc142c7b8ef14fc4110afae0da79e7 (diff)
vcl: Add a way to resize an image using the GPU
Change-Id: I949e13277fa176d64d7fba9a57e3ca6f3f0dd732
Diffstat (limited to 'vcl/inc/opengl')
-rw-r--r--vcl/inc/opengl/bmpop.hxx35
-rw-r--r--vcl/inc/opengl/salbmp.hxx48
-rw-r--r--vcl/inc/opengl/texture.hxx54
3 files changed, 126 insertions, 11 deletions
diff --git a/vcl/inc/opengl/bmpop.hxx b/vcl/inc/opengl/bmpop.hxx
new file mode 100644
index 000000000000..d19410b2f253
--- /dev/null
+++ b/vcl/inc/opengl/bmpop.hxx
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_VCL_INC_OPENGL_BMPOP_H
+#define INCLUDED_VCL_INC_OPENGL_BMPOP_H
+
+class OpenGLSalBitmapOp
+{
+public:
+ OpenGLSalBitmapOp() {};
+ virtual ~OpenGLSalBitmapOp() {};
+
+ virtual bool Execute() = 0;
+ virtual void GetSize( Size& rSize ) const = 0;
+};
+
+#endif // INCLUDED_VCL_INC_OPENGL_BMPOP_H
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/opengl/salbmp.hxx b/vcl/inc/opengl/salbmp.hxx
index 74c0fda4e9cb..6f7a03af09d4 100644
--- a/vcl/inc/opengl/salbmp.hxx
+++ b/vcl/inc/opengl/salbmp.hxx
@@ -24,9 +24,13 @@
#include <vcl/opengl/OpenGLContext.hxx>
#include "vcl/salbtype.hxx"
+#include "opengl/bmpop.hxx"
+#include "opengl/texture.hxx"
#include <salbmp.hxx>
+#include <deque>
+
// - SalBitmap -
struct BitmapBuffer;
@@ -35,17 +39,18 @@ class BitmapPalette;
class VCL_PLUGIN_PUBLIC OpenGLSalBitmap : public SalBitmap
{
private:
- OpenGLContext* mpContext;
- GLuint mnTexture;
- bool mbDirtyTexture;
- BitmapPalette maPalette;
- basebmp::RawMemorySharedArray maUserBuffer;
- sal_uInt16 mnBits;
- sal_uInt16 mnBytesPerRow;
- int mnWidth;
- int mnHeight;
- int mnTexWidth;
- int mnTexHeight;
+ OpenGLContext* mpContext;
+ OpenGLTextureSharedPtr mpTexture;
+ bool mbDirtyTexture;
+ BitmapPalette maPalette;
+ basebmp::RawMemorySharedArray maUserBuffer;
+ sal_uInt16 mnBits;
+ sal_uInt16 mnBytesPerRow;
+ int mnWidth;
+ int mnHeight;
+ int mnBufWidth;
+ int mnBufHeight;
+ std::deque< OpenGLSalBitmapOp* > maPendingOps;
public:
OpenGLSalBitmap();
@@ -87,6 +92,27 @@ private:
void DrawTexture( GLuint nTexture, const SalTwoRect& rPosAry );
bool AllocateUserData();
bool ReadTexture();
+
+private:
+
+ GLuint ImplGetTextureProgram();
+ GLuint mnTexProgram;
+ GLuint mnTexSamplerUniform;
+
+ GLuint ImplGetConvolutionProgram();
+ GLuint mnConvProgram;
+ GLuint mnConvSamplerUniform;
+ GLuint mnConvKernelUniform;
+ GLuint mnConvKernelSizeUniform;
+ GLuint mnConvOffsetsUniform;
+
+ bool ImplScaleFilter( GLenum nFilter );
+ void ImplCreateKernel( const double& fScale, const Kernel& rKernel, GLfloat*& pWeights, sal_uInt32& aKernelSize );
+ bool ImplScaleConvolution( const double& rScaleX, const double& rScaleY, const Kernel& aKernel );
+
+public:
+
+ bool ImplScale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag );
};
#endif // INCLUDED_VCL_INC_OPENGL_SALBMP_H
diff --git a/vcl/inc/opengl/texture.hxx b/vcl/inc/opengl/texture.hxx
new file mode 100644
index 000000000000..f9d3ad864291
--- /dev/null
+++ b/vcl/inc/opengl/texture.hxx
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_VCL_INC_OPENGL_TEXTURE_H
+#define INCLUDED_VCL_INC_OPENGL_TEXTURE_H
+
+#include <boost/shared_ptr.hpp>
+#include <GL/glew.h>
+
+class OpenGLTexture
+{
+private:
+ GLuint mnTexture;
+ int mnWidth;
+ int mnHeight;
+ GLenum mnFilter;
+
+public:
+ OpenGLTexture();
+ OpenGLTexture( int nWidth, int nHeight );
+ OpenGLTexture( int nWidth, int nHeight, int nFormat, int nType, sal_uInt8* pData );
+ OpenGLTexture( int nX, int nY, int nWidth, int nHeight );
+ virtual ~OpenGLTexture();
+
+ GLuint Id() const;
+ void Bind();
+ void Unbind();
+ bool Draw();
+
+ GLenum GetFilter() const;
+ void SetFilter( GLenum nFilter );
+};
+
+typedef boost::shared_ptr< OpenGLTexture > OpenGLTextureSharedPtr;
+
+#endif // INCLUDED_VCL_INC_OPENGL_TEXTURE_H
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */