Bläddra i källkod

LibGfx+PDFViewer: Add RotationDirection::Flip and use it in PDFViewer

No behavior change.
Nico Weber 1 år sedan
förälder
incheckning
29f5182e51

+ 7 - 9
Userland/Applications/PDFViewer/PDFViewer.cpp

@@ -350,15 +350,13 @@ PDF::PDFErrorOr<NonnullRefPtr<Gfx::Bitmap>> PDFViewer::render_page(u32 page_inde
         return bitmap;
         return bitmap;
     }
     }
 
 
-    if (page.rotate + m_rotations != 0) {
-        int rotation_count = ((page.rotate + m_rotations) / 90) % 4;
-        if (rotation_count == 3) {
-            bitmap = TRY(bitmap->rotated(Gfx::RotationDirection::CounterClockwise));
-        } else {
-            for (int i = 0; i < rotation_count; i++)
-                bitmap = TRY(bitmap->rotated(Gfx::RotationDirection::Clockwise));
-        }
-    }
+    int rotation_count = ((page.rotate + m_rotations) / 90) % 4;
+    if (rotation_count == 1)
+        bitmap = TRY(bitmap->rotated(Gfx::RotationDirection::Clockwise));
+    else if (rotation_count == 2)
+        bitmap = TRY(bitmap->rotated(Gfx::RotationDirection::Flip));
+    else if (rotation_count == 3)
+        bitmap = TRY(bitmap->rotated(Gfx::RotationDirection::CounterClockwise));
 
 
     return bitmap;
     return bitmap;
 }
 }

+ 13 - 0
Userland/Libraries/LibGfx/Bitmap.cpp

@@ -277,6 +277,19 @@ ErrorOr<NonnullRefPtr<Gfx::Bitmap>> Bitmap::clone() const
 
 
 ErrorOr<NonnullRefPtr<Gfx::Bitmap>> Bitmap::rotated(Gfx::RotationDirection rotation_direction) const
 ErrorOr<NonnullRefPtr<Gfx::Bitmap>> Bitmap::rotated(Gfx::RotationDirection rotation_direction) const
 {
 {
+    if (rotation_direction == Gfx::RotationDirection::Flip) {
+        auto new_bitmap = TRY(Gfx::Bitmap::create(format(), { width(), height() }, scale()));
+
+        auto w = this->physical_width();
+        auto h = this->physical_height();
+        for (int i = 0; i < w; i++) {
+            for (int j = 0; j < h; j++)
+                new_bitmap->set_pixel(w - i - 1, h - j - 1, this->get_pixel(i, j));
+        }
+
+        return new_bitmap;
+    }
+
     auto new_bitmap = TRY(Gfx::Bitmap::create(this->format(), { height(), width() }, scale()));
     auto new_bitmap = TRY(Gfx::Bitmap::create(this->format(), { height(), width() }, scale()));
 
 
     auto w = this->physical_width();
     auto w = this->physical_width();

+ 2 - 1
Userland/Libraries/LibGfx/Bitmap.h

@@ -86,7 +86,8 @@ struct BackingStore;
 
 
 enum class RotationDirection {
 enum class RotationDirection {
     CounterClockwise,
     CounterClockwise,
-    Clockwise
+    Flip,
+    Clockwise,
 };
 };
 
 
 class Bitmap : public RefCounted<Bitmap> {
 class Bitmap : public RefCounted<Bitmap> {