winsys: Correct Haiku winsys display target code
authorAlexander von Gluck IV <kallisti5@unixzen.com>
Mon, 28 Oct 2013 16:38:27 +0000 (11:38 -0500)
committerAlexander von Gluck IV <kallisti5@unixzen.com>
Tue, 29 Oct 2013 20:27:40 +0000 (15:27 -0500)
* Instead of assuming the displaytarget is the same
  stride / colorspace as the destination, lets
  actually check the source bitmap.
* Fixes random stride issues in rendering

Acked-by: Brian Paul <brianp@vmware.com>
src/gallium/winsys/sw/hgl/bitmap_wrapper.cpp
src/gallium/winsys/sw/hgl/bitmap_wrapper.h
src/gallium/winsys/sw/hgl/hgl_sw_winsys.c
src/gallium/winsys/sw/hgl/hgl_sw_winsys.h

index 4015a2268891ecffd3e3d1980a387a51ff166291..ef81edc8a57a02f0c130ad4eb3ee8dc247fef3cc 100644 (file)
@@ -77,10 +77,22 @@ void
 copy_bitmap_bits(const Bitmap* bitmap, void* data, int32 length)
 {
        BBitmap *bb = (BBitmap*)bitmap;
-       if (bb) {
-               color_space cs = bb->ColorSpace();
-               bb->ImportBits(data, length, bb->BytesPerRow(), 0, cs);
-       }
+
+       // We assume the data is 1:1 the format of the bitmap
+       if (bb)
+               bb->ImportBits(data, length, bb->BytesPerRow(), 0, bb->ColorSpace());
+}
+
+
+void
+import_bitmap_bits(const Bitmap* bitmap, void* data, int32 length,
+       unsigned srcStride, color_space srcColorSpace)
+{
+       BBitmap *bb = (BBitmap*)bitmap;
+
+       // Import image and adjust image format from source to dest
+       if (bb)
+               bb->ImportBits(data, length, srcStride, 0, srcColorSpace);
 }
 
 
index 7c5ff2d72f9f808a7516a2309cb99903988cc49f..65ba14044d8206c247a88e4887e774588fb1c0cb 100644 (file)
@@ -40,14 +40,17 @@ extern "C" {
 
 
 Bitmap* create_bitmap(int32 width, int32 height, color_space colorSpace);
+void delete_bitmap(Bitmap* bitmap);
+
 void copy_bitmap_bits(const Bitmap* bitmap, void* data, int32 length);
+void import_bitmap_bits(const Bitmap* bitmap, void* data, int32 length,
+       unsigned srcStride, color_space srcColorSpace);
 
 void get_bitmap_size(const Bitmap* bitmap, int32* width, int32* height);
 color_space get_bitmap_color_space(const Bitmap* bitmap);
 int32 get_bitmap_bytes_per_row(const Bitmap* bitmap);
 int32 get_bitmap_bits_length(const Bitmap* bitmap);
 
-void delete_bitmap(Bitmap* bitmap);
 void dump_bitmap(const Bitmap* bitmap);
 
 
index 1d51dd60ee8434f3d2a8cf7f3cb54d16c7517f14..b09584c39a4b36b2b4e7711782e8a9ff04a6b5b5 100644 (file)
@@ -34,7 +34,6 @@
 #include "util/u_memory.h"
 
 #include "hgl_sw_winsys.h"
-#include "bitmap_wrapper.h"
 
 
 // Cast
@@ -60,6 +59,19 @@ hgl_winsys_is_displaytarget_format_supported(struct sw_winsys* winsys,
        return true;
 }
 
+static color_space
+hgl_winsys_convert_cs(enum pipe_format format)
+{
+       // TODO: B_RGB24, B_RGB16, B_RGB15?
+       switch(format) {
+               case PIPE_FORMAT_B5G6R5_UNORM:
+                       return B_CMAP8;
+               case PIPE_FORMAT_A8R8G8B8_UNORM:
+               case PIPE_FORMAT_X8R8G8B8_UNORM:
+               default:
+                       return B_RGB32;
+       }
+}
 
 static struct sw_displaytarget*
 hgl_winsys_displaytarget_create(struct sw_winsys* winsys,
@@ -70,6 +82,7 @@ hgl_winsys_displaytarget_create(struct sw_winsys* winsys,
                = CALLOC_STRUCT(haiku_displaytarget);
        assert(haikuDisplayTarget);
 
+       haikuDisplayTarget->colorSpace = hgl_winsys_convert_cs(format);
        haikuDisplayTarget->format = format;
        haikuDisplayTarget->width = width;
        haikuDisplayTarget->height = height;
@@ -156,8 +169,9 @@ hgl_winsys_displaytarget_display(struct sw_winsys* winsys,
        struct haiku_displaytarget* haikuDisplayTarget
                = hgl_sw_displaytarget(displayTarget);
 
-       copy_bitmap_bits(bitmap, haikuDisplayTarget->data,
-               haikuDisplayTarget->size);
+       import_bitmap_bits(bitmap, haikuDisplayTarget->data,
+               haikuDisplayTarget->size, haikuDisplayTarget->stride,
+               haikuDisplayTarget->colorSpace);
 
        return;
 }
index 4c706a51233f579972142e4264b29a76026db84c..5a2bef7ac7fd1d190b0b288b40a14d341eaa5111 100644 (file)
 #include "state_tracker/st_api.h"
 #include "state_tracker/sw_winsys.h"
 
+#include "bitmap_wrapper.h"
+
 
 struct haiku_displaytarget
 {
        enum pipe_format format;
+       color_space colorSpace;
+
        unsigned width;
        unsigned height;
        unsigned stride;