Browse Source

Added FlipVertical() to Image.

Lasse Öörni 13 years ago
parent
commit
d6deaccd5a
3 changed files with 23 additions and 0 deletions
  1. 1 0
      Engine/Engine/ResourceAPI.cpp
  2. 20 0
      Engine/Resource/Image.cpp
  3. 2 0
      Engine/Resource/Image.h

+ 1 - 0
Engine/Engine/ResourceAPI.cpp

@@ -134,6 +134,7 @@ static void RegisterResourceCache(asIScriptEngine* engine)
 static void RegisterImage(asIScriptEngine* engine)
 {
     RegisterResource<Image>(engine, "Image");
+    engine->RegisterObjectMethod("Image", "void FlipVertical()", asMETHOD(Image, FlipVertical), asCALL_THISCALL);
     engine->RegisterObjectMethod("Image", "void SaveBMP(const String&in)", asMETHOD(Image, SaveBMP), asCALL_THISCALL);
     engine->RegisterObjectMethod("Image", "void SaveTGA(const String&in)", asMETHOD(Image, SaveTGA), asCALL_THISCALL);
     engine->RegisterObjectMethod("Image", "void SaveJPG(const String&in, int)", asMETHOD(Image, SaveJPG), asCALL_THISCALL);

+ 20 - 0
Engine/Resource/Image.cpp

@@ -496,6 +496,26 @@ void Image::SetSize(int width, int height, unsigned components)
     SetMemoryUse(width * height * components);
 }
 
+void Image::FlipVertical()
+{
+    if (!data_)
+        return;
+    
+    if (IsCompressed())
+    {
+        LOGERROR("Can not flip a compressed image");
+        return;
+    }
+    
+    SharedArrayPtr<unsigned char> newData(new unsigned char[width_ * height_ * components_]);
+    unsigned rowSize = width_ * components_;
+    
+    for (int y = 0; y < height_; ++y)
+        memcpy(&newData[(height_ - y - 1) * rowSize], &data_[y * rowSize], rowSize);
+    
+    data_ = newData;
+}
+
 void Image::SetData(const unsigned char* pixelData)
 {
     memcpy(data_.Get(), pixelData, width_ * height_ * components_);

+ 2 - 0
Engine/Resource/Image.h

@@ -99,6 +99,8 @@ public:
     void SetSize(int width, int height, unsigned components);
     /// Set data.
     void SetData(const unsigned char* pixelData);
+    /// Flip image vertically.
+    void FlipVertical();
     /// Save in BMP format. Return true if successful.
     bool SaveBMP(const String& fileName);
     /// Save in TGA format. Return true if successful.