+/*
+ * Gauge.cpp
+ *
+ * Created on: Aug 7, 2012
+ * Author: holy
+ */
+
+#include "Gauge.h"
+
+using geometry::Point;
+
+namespace graphics {
+
+// TODO: add start and end "ignore" offsets
+void Gauge::Draw(SDL_Surface *dest, Point<int> position, int width, Uint8 level) const {
+ int fullWidth(width * level / 255);
+ SDL_Rect srcRect, destRect;
+
+ // start
+ srcRect.h = height;
+ destRect.x = position.X();
+ destRect.y = position.Y();
+ // full part
+ if (fullWidth >= startWidth) { // completely filled
+ srcRect.x = fullX;
+ srcRect.y = fullY;
+ srcRect.w = startWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ } else if (fullWidth > 0) { // partially filled
+ srcRect.x = fullX;
+ srcRect.y = fullY;
+ srcRect.w = fullWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ }
+ // empty part
+ if (fullWidth == 0) { // completely empty
+ srcRect.x = emptyX;
+ srcRect.y = emptyY;
+ srcRect.w = startWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ } else if (fullWidth < startWidth) { // partially empty
+ srcRect.x = emptyX + fullWidth;
+ srcRect.y = emptyY;
+ srcRect.w = startWidth - fullWidth;
+ destRect.x = position.X() + fullWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ }
+
+ destRect.x = position.X() + startWidth;
+
+ // fill
+ if (fullWidth >= width - endWidth) { // completely filled
+ srcRect.x = fullX + startWidth;
+ srcRect.y = fullY;
+ srcRect.w = repeatWidth;
+ int fillWidth(width - startWidth - endWidth);
+ int fillCursor(0);
+ while (fillCursor < fillWidth) {
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ destRect.x += repeatWidth;
+ fillCursor += repeatWidth;
+ }
+ } else if (fullWidth <= startWidth) { // completely empty
+ srcRect.x = emptyX + startWidth;
+ srcRect.y = emptyY;
+ srcRect.w = repeatWidth;
+ int fillWidth(width - startWidth - endWidth);
+ int fillCursor(0);
+ while (fillCursor < fillWidth) {
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ destRect.x += repeatWidth;
+ fillCursor += repeatWidth;
+ }
+ } else { // partially filled/empty
+ srcRect.x = fullX + startWidth;
+ srcRect.y = fullY;
+ srcRect.w = repeatWidth;
+ int fillCursor(0);
+ while (fillCursor < fullWidth) {
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ destRect.x += repeatWidth;
+ fillCursor += repeatWidth;
+ }
+ srcRect.x = emptyX + startWidth;
+ srcRect.y = emptyY;
+ int remaining(width - startWidth - endWidth);
+ while (fillCursor < remaining) {
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ destRect.x += repeatWidth;
+ fillCursor += repeatWidth;
+ }
+ }
+
+ // end
+ // full part
+ if (fullWidth >= width) { // completely filled
+ srcRect.x = fullX + startWidth + repeatWidth;
+ srcRect.y = fullY;
+ srcRect.w = endWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ } else if (fullWidth > (width - endWidth)) { // partially filled
+ srcRect.x = fullX + startWidth + repeatWidth;
+ srcRect.y = fullY;
+ srcRect.w = endWidth - width + fullWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ }
+ // empty part
+ if (fullWidth <= width - endWidth) { // completely empty
+ srcRect.x = emptyX + startWidth + repeatWidth;
+ srcRect.y = emptyY;
+ srcRect.w = startWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ } else if (fullWidth > (width - endWidth) && fullWidth < width) { // partially empty
+ srcRect.x = emptyX + startWidth + repeatWidth + fullWidth - width + endWidth;
+ srcRect.y = emptyY;
+ srcRect.w = width - fullWidth;
+ destRect.x = position.X() + fullWidth;
+ SDL_BlitSurface(surface, &srcRect, dest, &destRect);
+ }
+
+}
+
+}