| /* |
| * Copyright (c) 2015, The Linux Foundation. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * Neither the name of The Linux Foundation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| //#include "overlay.h" |
| #include "overlayCursor.h" |
| #include "mdpWrapper.h" |
| |
| namespace overlay { |
| |
| HWCursor* HWCursor::sHwCursor = 0; |
| |
| //=========== class HWCursor ================================================= |
| HWCursor* HWCursor::getInstance() { |
| if (sHwCursor == NULL) { |
| sHwCursor = new HWCursor(); |
| } |
| return sHwCursor; |
| } |
| |
| bool HWCursor::config(const int fd, void* base, PipeArgs& pargs, |
| Dim& crop, Dim& dest) { |
| bool ret = true; |
| fb_cursor *cursor = &mfbCursor; |
| fb_image cursorImage; |
| |
| cursor->set = FB_CUR_SETIMAGE | FB_CUR_SETPOS; |
| cursor->enable = (uint16_t)1; |
| cursor->rop = 0, |
| cursor->mask = NULL; |
| cursor->hot.x = (uint16_t)crop.x; |
| cursor->hot.y = (uint16_t)crop.y; |
| |
| cursorImage.dx = dest.x; |
| cursorImage.dy = dest.y; |
| cursorImage.width = pargs.whf.w; |
| cursorImage.height = pargs.whf.h; |
| cursorImage.fg_color = pargs.planeAlpha; // Hint for PMA |
| cursorImage.bg_color = 0xffffff00; // RGBA |
| cursorImage.depth = 32; |
| cursorImage.data = (char*)base; |
| |
| cursor->image = cursorImage; |
| |
| if (!setCursor(fd)) { |
| ALOGE("%s: Failed to setup HW cursor", __FUNCTION__); |
| ret = false; |
| memset(cursor, 0, sizeof(fb_cursor)); |
| } |
| return ret; |
| } |
| |
| bool HWCursor::setPositionAsync(const int fd, int x, int y) { |
| bool ret = true; |
| if (isCursorSet()) { |
| fb_cursor *cursor = &mfbCursor; |
| cursor->set = FB_CUR_SETPOS; |
| cursor->image.dx = x; |
| cursor->image.dy = y; |
| if (!setCursor(fd)) { |
| ALOGE("%s: Failed to set position x = %d y = %d", __FUNCTION__, x, y); |
| ret = false; |
| } |
| } |
| return ret; |
| } |
| |
| bool HWCursor::free(const int fd) { |
| fb_cursor *cursor = &mfbCursor; |
| fb_image cursorImage; |
| bool ret = true; |
| |
| if(!cursor->enable) { |
| return ret; |
| } |
| |
| cursor->enable = (uint16_t)0; |
| |
| if (!setCursor(fd)) { |
| ALOGE("%s: Failed to free cursor hw", __FUNCTION__); |
| ret = false; |
| } |
| memset(cursor, 0, sizeof(fb_cursor)); |
| return ret; |
| } |
| |
| bool HWCursor::setCursor(const int fd) { |
| bool ret = true; |
| ATRACE_CALL(); |
| fb_cursor *cursor = &mfbCursor; |
| |
| if(fd <= 0) { |
| ALOGE("%s: Invalid fd", fd); |
| return false; |
| } |
| |
| if (ioctl(fd, MSMFB_CURSOR, cursor) < 0) { |
| ALOGE("%s: Failed to call ioctl MSMFB_CURSOR err=%s\n", __FUNCTION__, |
| strerror(errno)); |
| ret = false; |
| } |
| return ret; |
| } |
| |
| void HWCursor::getDump(char* buf, size_t len) { |
| char cursordump[len]; |
| fb_cursor* cursor = &mfbCursor; |
| if (cursor->enable) { |
| snprintf(cursordump, sizeof(cursordump), |
| "HWCursor on Primary: src w=%d h=%d\n" |
| "\tsrc_rect x=%d y=%d w=%d h=%d\n" |
| "\tdst_rect x=%d y=%d w=%d h=%d\n\n", cursor->image.width, |
| cursor->image.height, cursor->hot.x, cursor->hot.y, |
| cursor->image.width, cursor->image.height, |
| cursor->image.dx, cursor->image.dy, cursor->image.width, |
| cursor->image.height); |
| strlcat(buf, cursordump, len); |
| } |
| |
| } |
| |
| } //namespace overlay |