| // Copyright 2016 Google Inc. All Rights Reserved. |
| // |
| // Licensed 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 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "starboard/blitter.h" |
| #include "starboard/log.h" |
| |
| // A simple implementation that iterates over each of the incoming rectangles |
| // and issues a SbBlitterBlitRectToRect() command for each of them. |
| bool SbBlitterBlitRectsToRects(SbBlitterContext context, |
| SbBlitterSurface source_surface, |
| const SbBlitterRect* src_rects, |
| const SbBlitterRect* dst_rects, |
| int num_rects) { |
| if (!SbBlitterIsContextValid(context)) { |
| SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid context."; |
| return false; |
| } |
| if (!SbBlitterIsSurfaceValid(source_surface)) { |
| SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid texture."; |
| return false; |
| } |
| |
| SbBlitterSurfaceInfo surface_info; |
| SbBlitterGetSurfaceInfo(source_surface, &surface_info); |
| |
| // Check that our rectangles are valid before proceeding to issue draw calls. |
| for (int i = 0; i < num_rects; ++i) { |
| if (src_rects[i].width <= 0 || src_rects[i].height <= 0) { |
| SB_DLOG(ERROR) << __FUNCTION__ << ": Source rectangle (index " << i |
| << ") width and height must both be greater than 0."; |
| return false; |
| } |
| if (dst_rects[i].width < 0 || dst_rects[i].height < 0) { |
| SB_DLOG(ERROR) << __FUNCTION__ << ": Destination rectangle (index " << i |
| << ") width and height must both be greater than or equal " |
| << "to 0."; |
| return false; |
| } |
| |
| if (src_rects[i].x < 0 || src_rects[i].y < 0 || |
| src_rects[i].x + src_rects[i].width > surface_info.width || |
| src_rects[i].y + src_rects[i].height > surface_info.height) { |
| SB_DLOG(ERROR) << __FUNCTION__ << ": Source rectangle (index " << i |
| << ") goes out of the source surface's bounds."; |
| return false; |
| } |
| } |
| |
| // Now issue the draw calls. |
| for (int i = 0; i < num_rects; ++i) { |
| if (!SbBlitterBlitRectToRect(context, source_surface, src_rects[i], |
| dst_rects[i])) { |
| return false; |
| } |
| } |
| |
| return true; |
| } |